【问题标题】:Problems saving images in VB .Net using multithreading使用多线程在 VB .Net 中保存图像的问题
【发布时间】:2015-03-13 00:01:39
【问题描述】:

我编写了一个 VB .Net 程序,可以对图形文件进行选择性强度像素修改。它比我开始时快得多(20 秒对 90 秒),但处理多个图像的总时间仍然很慢。我通常运行 64 个 12 MP 图像,处理它们大约需要 24 分钟。我认为如果我使用多个线程,每个线程处理整个图像集的一个子集,我可以加快速度,所以我添加了多个后台工作人员。但是当我使用 Thread#.RunWorkerAsync() 从程序中运行多个线程时,保存的图像就搞砸了。这是一个“好”的图像,在一个线程中运行:

http://freegeographytools.com/good.jpg

下面是两个线程运行时相同图像的典型示例:

http://freegeographytools.com/bad.jpg

这些结果基本上是典型的,但“坏”图像在底部附近有一条干净的条纹,看起来是正确的;通常不会出现在大多数图像上。 每个线程调用自己的带有独立变量的子程序,所以不应该有变量“交叉污染”。虽然这些结果是使用保存为 JPG 的图像获得的,但我使用保存为 TIF 文件的图像获得了相同的结果。我还尝试将图像分离到不同的目录中,并同时处理每个目录,每个目录都有自己的线程 - 结果相同。为了修改像素,我使用了 GetPixel/SetPixel 来更改像素值,并且还使用 LockBits 来修改字节数组中的图像 - 这两种方法的结果是相同的。一个线程好,两个线程坏。我确定这很明显,但我无法弄清楚。建议将不胜感激。

【问题讨论】:

  • 您需要发布多线程案例的相关代码才能获得好的答案。
  • 请提交您的代码,因为社区可以开始提出有关问题可能是什么的想法。

标签: .net vb.net multithreading image


【解决方案1】:

如果应用程序在单线程中工作,那么线程之间可能存在一些干扰。一种可能的来源是文件级别。如果您使用 .net 图形类从磁盘加载图像,该图像文件将保持打开状态。在没有看到代码的情况下,我无法提出任何具体的建议,但这可能会导致您所看到的问题。

【讨论】:

    【解决方案2】:

    对不起,伙计们。在准备一个代码片段发到这里的过程中,发现了问题。我认为独立且不变的变量(更具体地说,转换矩阵)实际上在每个子例程中都被修改了。因此,一些像素转换是使用错误的矩阵完成的,这导致“坏”图像的像素出现斑点。只需使矩阵在不同的子程序之间独立,问题就消失了,我现在可以毫无问题地运行多个线程。感谢您的 cmets - 只是准备发布代码让我找到了答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 2011-09-17
      相关资源
      最近更新 更多