【发布时间】:2011-11-23 19:31:42
【问题描述】:
我目前正在处理非常大的图像,这些图像基本上是通过将许多较小的图像拼接在一起生成的(例如全景图或照片马赛克软件)。为了避免内存不足异常(内存中只是如何排列较小图像的“地图”),我编写了一些代码,使用 BinaryWriter 和 LockBits 将这些图像逐行保存为位图。到目前为止,一切顺利。
现在的问题是我想将这些图像也保存为 Jpeg(或 PNG)。由于我对 c# 很陌生,所以我现在只能想到两种方法:
1) 类似于位图保存过程。生成一些 jpeg 标题并逐行保存大图像,之前以某种方式压缩它们。我不知道如何执行压缩。
2) 将已保存的位图流式传输到内存中,并将其保存为编码的 jpeg。
由于第二种方法似乎更容易,我尝试了这样的方法:
FileStream fsr =
new FileStream("input.bmp", FileMode.Open, FileAccess.Read);
FileStream fsw =
new FileStream("output.jpg", FileMode.CreateNew, FileAccess.Write);
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] =
new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L);
Bitmap bmp = new Bitmap(fsr);
bmp.Save(fsw, GetEncoder(ImageFormat.Jpeg), encoderParameters);
bmp.Dispose();
现在的问题是保存方法首先尝试将位图完全加载到内存中,导致内存不足异常。
如果有任何关于如何解决或规避此问题的建议,我将非常高兴!
【问题讨论】:
-
OutOfMemoryException 在这个时代?你的位图有多大?
-
是的,你很容易遇到内存问题,我调整了大约 10K 图像的大小并经常遇到
OutOfMemoryException,即使我处理得当。 -
来自位图的 OOM 非常可疑。这个类会为几乎所有出错的地方抛出内存异常,包括错误的参数等。
-
也许 .NET wrapper 的 FreeImage 库可能会对您有所帮助。
-
您的方法是否适用于小位图?先测试一下代码。
标签: c# stream bitmap compression jpeg