使C#保存一个没有位域压缩的16位位图

kli*_*ijo 2 c# bitmap

当我做的时候

b.Save(outputFilename, ImageFormat.Bmp);
Run Code Online (Sandbox Code Playgroud)

其中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 );
Run Code Online (Sandbox Code Playgroud)

当我传递8位位图时,不使用压缩.但是当我传递一个16位RGB位图时,它仍然使用位域压缩.

Ben*_*igt 5

Save接受EncoderParameters参数的函数有一个重载,通过它可以控制压缩.

请参阅http://msdn.microsoft.com/en-us/library/ytz20d80.aspxhttp://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoder.compression.aspx


Kin*_*ing 5

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格式存储还是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 ); 
Run Code Online (Sandbox Code Playgroud)

这应该确保您的质量.