我目前正在处理非常大的图像,这些图像基本上是通过拼接许多较小的图像(例如全景或照片马赛克软件)生成的。为了避免内存不足的情况(内存中只有如何排列较小图像的“映射”),我写了一些代码,将这些图像逐行保存为使用BinaryWriter和LockBits的位图。到现在为止还挺好。c#将非常大的位图保存为JPEG(或任何其他压缩格式)
现在的问题是,我想将这些图像另存为Jpegs(或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在这个时代?你的位图有多大? – zmbq
是的,你可以很容易地遇到内存问题,我正在调整大小约10K的图像,并经常运行到“OutOfMemoryException”中,即使我正确处置。 – DarthVader
从位图OOM是非常可疑的。这个类将抛出内存异常几乎任何错误,包括错误的参数等。 –