我目前正在处理非常大的图像,这些图像基本上是通过拼接许多较小的图像(例如全景或照片马赛克软件)生成的.为了避免内存不足异常(在内存中只是如何排列较小图像的"地图"),我写了一些代码,使用BinaryWriter和LockBits逐行保存这些图像作为位图.到现在为止还挺好.
现在问题是我想将这些图像保存为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();
Run Code Online (Sandbox Code Playgroud)
现在的问题是save-method尝试首先将位图完全加载到内存中,从而导致内存不足异常.
如果有任何关于如何解决或避免这个问题的建议,我会非常高兴!
我目前正在研究ac#开源照片拼接软件(Sourceforge Link).该软件将大量小照片(瓷砖)拼接成一个大图像.
由于最终图像大小通常为20k px乘以15k px,我只保存了如何在内存中排列图块的地图.为了构建最终图像,我正在构建它的部分,即8行的带(也可以是任何其他数字).
在bmps的情况下,通过首先写入bmp头并随后将ARGB数据附加到该文件,然后可以通过块容易地保存该数据块.
但是由此产生的bmps对于进一步处理来说太大了(例如将它们交给一些海报印刷公司).因此,我想在我的硬盘上将这些大图像保存为jpgs.
现在的问题是,由于jpgs被压缩,以块的形式写入数据似乎非常棘手(正常的Bitmap.Save()函数会将完整的图像首先加载到内存中,因此不适用),因为编写纯净的,未压缩的RGB数据不会这样做.
在聚会中编写jpgs的基本功能应该存在,因为据我所知,jpg的压缩算法适用于块或8x8 px.
我查看了几个图像库(FreeImage,GraphicsMagick,LibTiff.NET)来找到这个问题的解决方案,但找不到任何解决方案.LibTiff基本上具有所需的功能,但仅适用于tiff图像格式.
非常感谢你的帮助!马克斯