繁体   English   中英

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

[英]Make C# save a 16-bit bitmap without bitfields compression

当我做的时候

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位图时,它仍然使用位域压缩。

Save函数的重载接受EncoderParameters参数,通过该参数可以控制压缩。

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

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 ); 

这应该确保您的质量。

看来你真正的需要不是“保存没有位域压缩的16位位图”,而是为了避免有损压缩。

问题是16位位图格式本质上使用位域(红色为5位,绿色为6位,蓝色为5位),因此如果原始图像有像素,某些信息将丢失格式宽于16位。 目前最常用的图像格式是RGB格式,每个像素使用8位,因此每像素需要3×8 = 24位。 你根本无法将24位信息输入16位; 有些位会掉下来,这是生活中的事实。

因此,只要需要16位位图,您的问题就无法解决。 唯一的方法是避免使用16位位图。

注意:

即使您指定了“无压缩”,也使用位域压缩的原因是因为位域压缩不是真正的压缩; 它只是一种像素格式,因此应称为“位域格式”而不是“位域压缩”。 RLE是一种真正的(虽然非常简单)压缩方法。

RLE代表“游程长度编码”并且其工作如下:长度为N的一系列相同像素值被数字N代替,随后是像素值的单个出现。 所以,RLE绝对是无损的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM