当我做一个

b.Save(outputFilename, ImageFormat.Bmp);


其中b是一个16位位图,它使用位域压缩保存。如何在不使用任何压缩的情况下保存C#?

这是我对@Ben Voigt发布的链接所做的:

ImageCodecInfo myImageCodecInfo;
Encoder myEncoder ;
EncoderParameter myEncoderParameter;
EncoderParameters myEncoderParameters;

myEncoder = Encoder.Compression;
myImageCodecInfo = GetEncoderInfo("image/bmp");
myEncoderParameters = new EncoderParameters(1);

myEncoderParameter = new EncoderParameter(myEncoder,
                     (long)EncoderValue.CompressionNone);
myEncoderParameters.Param[0] = myEncoderParameter;

b.Save(outputFilename, myImageCodecInfo, myEncoderParameters );


当我通过8位位图时,不使用压缩。但是,当我传递16位RGB位图时,它仍然使用位域压缩。

最佳答案

Windows中的位图表示DIB。

“与设备无关的位图(DIB)是一种用于以各种颜色分辨率定义与设备无关的位图的格式。DIB的主要目的是允许将位图从一个设备移至另一设备(因此,设备的独立于设备的部分DIB是一种外部格式,与设备相关的位图相反,后者在系统中显示为位图对象(由应用程序创建...)。DIB通常在图元文件中传输(通常使用StretchDIBits()函数),BMP文件和剪贴板(CF_DIB数据格式)。”

正如我们在评论中已经讨论的那样,BITFIELDS压缩仅在16位和32位DIB中使用,并且仅描述数据的打包方式。对于16位DIB,它可以定义绿色通道的分辨率(即5:6:5或5:5:5),而对于32位DIB,它可以定义数据是以RGB格式存储还是以RGB格式存储。 BGR顺序(以及使用BMIHv4 / 5标头时,是否使用alpha通道。)

只有一个原因。就是要使BMP保持与设备无关,这是关于格式与其可能使用的设备无关的信息。因此,这意味着,它始终按照Windows保持为DIB格式!通过压缩,格式保持完整。

EncoderParameters codecParams = new EncoderParameters(1);
codecParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
b.Save(outputFilename, myImageCodecInfo, codecparams );


这应该确保您的质量。

07-26 02:58