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

mgu*_*lde 9 c# compression jpeg bitmap stream

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

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

Mor*_*sen 0

我怀疑您无法在 .NET 中执行此操作,但您始终可以调用 C 库来完成繁重的工作。我自己没有使用过它,但我建议你看看GraphicsMagick库。它是一个具有许可的 C 库,允许开源和商业用途,看起来它可能可以满足您的需要。