我目前正在处理非常大的图像,这些图像基本上是通过拼接许多较小的图像(例如全景或照片马赛克软件)生成的。为了避免内存溢出异常(内存中仅包含如何排列较小图像的“地图”),我编写了一些代码,使用BinaryWriter和LockBits将这些图像逐行保存为位图。目前为止,一切顺利。
问题是现在我也想将这些图像保存为Jpegs(或PNGs)。由于我对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();
问题在于保存方法首先尝试将位图完全加载到内存中,导致了内存不足异常。我非常希望能够得到任何解决或规避此问题的建议!