小编mgu*_*lde的帖子

c#将非常大的位图保存为jpegs(或任何其他压缩格式)

我目前正在处理非常大的图像,这些图像基本上是通过拼接许多较小的图像(例如全景或照片马赛克软件)生成的.为了避免内存不足异常(在内存中只是如何排列较小图像的"地图"),我写了一些代码,使用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尝试首先将位图完全加载到内存中,从而导致内存不足异常.

如果有任何关于如何解决或避免这个问题的建议,我会非常高兴!

c# compression jpeg bitmap stream

9
推荐指数
1
解决办法
2966
查看次数

c#:将JPG保存在部分中

我目前正在研究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图像格式.

非常感谢你的帮助!马克斯

c# jpeg image chunked-encoding

6
推荐指数
1
解决办法
429
查看次数

标签 统计

c# ×2

jpeg ×2

bitmap ×1

chunked-encoding ×1

compression ×1

image ×1

stream ×1