c#saveverylargebitmapasjpegs(oranyothercompressedformat)我目前在处理超大图片,基本都是制作出来的通过将许多较小的图像拼接在一起,例如全景图或照片马赛克软件。为避免内存不足异常(这只是较小图像在内存中排列方式的“映射”),我编写了一些代码,使用BinaryWriter和LockBits作为位图逐行保存这些图像。到目前为止,一切都很好。现在的问题是我想将这些图像保存为Jpeg(或PNG)。由于我是c#的新手,我现在只能想到两种方法:1)类似于位图保护程序的东西。生成一些jpeg标题并逐行保存大图像,之前以某种方式压缩它们。我不知道如何执行压缩。2)将保存的位图流式传输到内存中并将其保存为编码的jpeg。由于第二种方法似乎更简单,我尝试了这样的方法:FileStreamfsr=newFileStream("input.bmp",FileMode.Open,FileAccess.Read);FileStreamfsw=newFileStream("output.jpg",FileMode.CreateNew,FileAccess.Write);编码器参数encoderParameters=newEncoderParameters(1);encoderParameters.Param[0]=newEncoderParameter(System.Drawing.Imaging.Encoder.Quality,80L);位图bmp=新位图(fsr);bmp.Save(fsw,GetEncoder(ImageFormat.Jpeg),encoderParameters);bmp.Dispose();现在的问题是保存方法首先尝试将位图完全加载到内存中,从而导致内存不足异常。对于如何解决或避免此问题的任何建议,我将非常高兴!请注意,JPEG压缩有一些重要的重要缺点:1)JPEG是有损的,因此您不会重新生成相同的图像。这可能是完全可以接受的,但如果您需要准确地复制源图像,那么PNG是最佳选择。2)JPEG在8个像素边界上对齐。如果您将尺寸不是8的倍数的图像放在一起,无论是宽度还是高度,您都会在图像的边界处得到一些强烈的人工制品考虑到您的用例,我宁愿建议不要将图像拼接在一起,在每个较小的图像上使用标准压缩算法,例如PNG或Zlib。您仍然可以将生成的压缩流存储到单个文件中。好处是可以直接“跳转”到要提取的小图所在的位置,这样会节省大量的内存。缺点是您无法将所有较小的图像“视觉预览”为一个大图像(您需要为此用途创建一个程序)。我怀疑您不能在.NET中执行此操作,但您始终可以调用C库来完成繁重的工作。我自己没用过,但我建议你看一下GraphicsMagick库。它是一个C库,具有允许开源和商业使用的许可证,看起来它可能适合您的需要。(如标题所说“或任何其他压缩格式”)TIFF格式具有平铺和条纹的概念。两者都可以用来避免在任何时候都将所有大图像都存储在内存中。由于您正在拼接小图像,因此瓷砖会派上用场。您可以尝试LibTiff.Net(免费、商业友好、开源、仅用C#编写)来完成您的任务。有一篇文章基本上涵盖了库的功能,其中包含有关条纹和平铺图像IO的信息(在本文的第二部分)。免责声明:我在一家公司工作。以上是C#学习教程:c#将一个非常大的位图保存为jpeg(或任何其他压缩格式)以共享整个内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
