使用多线程在VB .Net中保存图像的问题

时间:2015-03-13 00:01:39

标签: .net vb.net multithreading image

我编写了一个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来修改字节数组中的图像 - 两种方法的结果相同。一个线程好,两个+线程坏。我确定这是显而易见的,但我无法弄清楚。建议非常感谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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