gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:59:40 25 4
gpt4 key购买 nike

我目前正在处理非常大的图像,这些图像基本上是通过将许多较小的图像拼接在一起生成的(例如全景图或照片马赛克软件)。为了避免内存不足异常(内存中只有如何排列较小图像的“映射”),我编写了一些代码,使用 BinaryWriter 和 LockBits 将这些图像逐行保存为位图。到目前为止,还不错。

现在的问题是我想将这些图像也保存为 Jpeg(或 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();

现在的问题是保存方法首先尝试将位图完全加载到内存中,导致内存不足异常。

如果有任何关于如何解决或规避此问题的建议,我将非常高兴!

最佳答案

请注意,JPEG 压缩有一些重要的重要缺点:

1) JPEG 是有损的,因此您不会重新生成相同的图像。这可能是完全可以接受的,但如果您需要准确地重新生成源图像,那么 PNG 是最佳选择。

2) JPEG 在 8 像素边界上对齐。如果您将尺寸不是 8 的倍数的图像拼接在一起,无论是宽度还是高度,您都会在图像边界处得到一些强烈的伪像

考虑到您的用例,我宁愿建议不要将图像拼接在一起,并在每个较小的图像上使用标准压缩算法,例如 PNG 或 Zlib。您仍然可以将生成的压缩流存储到单个文件中。好处是你可以直接在你想提取的小图位置“跳转”,这样会节省*很多*内存。

缺点是您无法将所有较小的图像“视觉预览”为一个大图像(您需要为这种用法创建一个程序)。

关于c# 将非常大的位图保存为 jpeg(或任何其他压缩格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8247996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com