VB 处理扫描类型的tif图片时保存时出现灰色图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB 处理扫描类型的tif图片时保存时出现灰色图相关的知识,希望对你有一定的参考价值。

使用VB中的一些函数处理图像,对图像进行裁剪操作,处理后进行保存。当处理数码相机拍摄的jpg照片时,一次性处理几千张,得到的裁剪处理后的图片都是正常的。内存消耗量维持在低位并几乎无明显变动。

但是,当处理由扫描仪扫描保存的黑白或灰度图像(tif类型)时,当一次性处理到250张左右时,其后处理的图像在保存后就开始出现大量的无任何内容的灰色图片。而且发现内存的消耗量从一开始的最低一直增大到最大值,当内存消耗量增大到最大值时,就开始出现灰色图了。电脑明显变慢。

这是何故,如何解决,才能在保存时不再出现灰色图?
通过测试,发现内存耗尽时就开始出现灰色图了,但不知道用何函数来在执行过程中强制释放内存。听说cximage.dll能够处理tiff类型图片,但该dll无法添加到工程引用中来。我用GDI+来读取tiff图片并画入图片框中,但该GDI+在使用完毕后无法释放内存,导致内存消耗逐步增大。而处理数码相片jpg时,直接加载入图片框,不用GDI+读取,所以内存消耗很少,故未出现灰色图。谁有能添加到VB工程引用中的Cximage.dll呢?给一份。谢谢了

感觉也是内存问题,可以试试这个方法:
用一个函数去处理你的图片,函数中都使用过程级变量,不要使用form级、模块级变量。在过程中首先读取所有图片文件名到一个动态数组,然后循环数组调用函数进行处理(按文件名传输),这样的好处就是每次调用完函数内存就可以自动释放,所以跟文件数没有关系,修改起来应该很简单(另在适当的地方加上doevents,不然文件数很多时容易引起假死机)。
参考技术A 感觉像是内存溢出~~
你或许可以考虑下再处理过程中加入一个时间控件,比如处理多少张照片后暂停个1秒钟,然后继续处理,看看效果追问

尝试了,在处理到第250张时,暂停3秒钟,再处理,仍然出现灰色无任何内容的图。内存消耗一直维持在最大值。能否在处理的过程中清除缓存,让内存消耗不会增大并保持稳定,有可能就解决此问题了。但不知道如何清除内存的临时图片数据。

追答

你先试试关闭窗口,重新开启窗口可以吗?加个辅助FORM来监视,处理到250的时候,卸载这个窗口,然后重新加载这个FORM继续250以后的东东~~~看看?
我不是很专业,只是给点思路,呵呵,总感觉你问题应该在内存上,其实清理内存肯定有用,不过不懂怎么弄,呵呵,你也可以加个辅助窗口,在250张的时候自动启动内存整理,内存整理的代码网上应该能找到吧

追问

清理释放内存可能是一种思路,但为何处理数码相片时,处理几千张,内存几乎无变化,但处理扫描仪扫描得到的图片时,内存消耗就发生变化了。

追答

TIF的文件比JPG的要大上很多吧,另外JPG在编辑好之后会压缩保存,而TIF是直接保存,不进行压缩,感觉可能是控件的问题,可以找找专门处理TIF的控件,可能会有用,呵呵,以上是个人理解,呵呵

追问

其实原始扫描的所得的tif类型的灰度图片,每张图片才40K呢。其实也不大,但在函数处理的过程中产生的临时数据,可能很大,才会导致这种灰色图产生?

追答

可能是处理的时候导致的吧,找找专门处理TIF的控件,试试效果

本回答被提问者采纳

使用 savefiledialog 保存图像时出现问题

【中文标题】使用 savefiledialog 保存图像时出现问题【英文标题】:Issue while saving image using savefiledialog 【发布时间】:2012-06-15 15:09:38 【问题描述】:

我正在使用 savefiledialog 来保存图像。画布是图片框,加载的图像是位图。当我尝试保存它时,文件已创建但不知何故损坏。因为当我尝试再次加载图像或在不同的查看器中显示时它不起作用 - 我的意思是保存的文件已损坏。有一种保存图像的方法。

 private void saveFileDialog1_FileOk(object sender, CancelEventArgs e)
        

           System.IO.FileStream fs =
                (System.IO.FileStream)saveFileDialog1.OpenFile();

           try
           
               switch (saveFileDialog1.FilterIndex)
               
                   case 1:
                       canvas.Image.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
                       break;
                   case 2:
                       canvas.Image.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                       break;
                   case 3:
                       canvas.Image.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Png);
                       break;
                   case 4:
                       canvas.Image.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Tiff);
                       break;
               

           
           catch (Exception ex) 
           
               System.Console.WriteLine("Exception " + ex);
           

我还应该提到属性过滤器。 saveFileDialog1.Filter 有值:

bmp (*.bmp)|*.bmp|jpeg (*.jpeg)|*.jpeg|png (*.png)|*.png|tiff (*.tiff)|*.tiff

【问题讨论】:

检查以确保文件在保存到任何文件夹后格式正确? 我该如何检查呢?我保存它,所以文件例如:image.bmp 但我无法打开它,所以保存可能有问题。但我不知道问题出在哪里。 我的意思是只需右键单击文件并转到属性,可能会提供有关其无法保存的更多信息?不过我不确定 这是我首先做的,但它只给了我文件类型为 bmp 的信息。但它告诉我即使通过将 txt 重写为 bmp 将某些 .txt 文件更改为 .bmp。所以这些属性对我来说没用:/ 【参考方案1】:

我想问你为什么要排队

System.IO.FileStream fs =
    (System.IO.FileStream)saveFileDialog1.OpenFile();

但事实证明,这正是导致您的问题的原因。您正在将文件打开到FileStream。当它打开时,您使用canvas.Image.Save 将图像写入同一个文件。

它会引发异常,但由于您只是将异常写入控制台,因此您看不到它。

只要删除我提到的那一行,你的代码就可以工作了。

【讨论】:

谢谢,我忘记删除了。它是来自 MDSN 的基于 txt 文件的表单示例。现在它工作正常。谢谢。

以上是关于VB 处理扫描类型的tif图片时保存时出现灰色图的主要内容,如果未能解决你的问题,请参考以下文章

传递 Oracle 参数类型 PLSQLAssociativeArray 时出现 VB.NET 错误

使用R magick包时出错

如何在 VB6 中处理 OCR 扫描错误

在 vb6 中填充组合框时出现运行时错误 0

将照片保存到文件时出现问题

使用 savefiledialog 保存图像时出现问题