保存位图时 Alpha 值不保留

Posted

技术标签:

【中文标题】保存位图时 Alpha 值不保留【英文标题】:Alpha value not persisting while saving Bitmap 【发布时间】:2013-04-18 08:24:14 【问题描述】:

大家早上好,

我正在为大学做一个图像隐写术项目。 在图像中隐藏数据时。我正在写“文本长度”,它是一个像素中的 Int32。因为 Int32 是 4 个字节。我想我可以把它写成 Alpha、Red、Green、Blue 的 4 个字节,因为每种颜色都是 1 个字节。 然后我将图像保存为 bmp 格式。 我使用了单步,数据得到正确分布并设置在像素中。

当我读回像素时出现问题。 R,G,B 有它们的价值,就像我设置它们一样。但无论设置什么,alpha 始终为 255。

我用于将 Int32 分配为 4 个字节的代码是

byte R, G, B, A;
int colorValue = messageLength;
int first = colorValue & 255;
//R contains bit 0-7 means the least significant 8 bits
R = (byte)first;
colorValue = colorValue - first;
int second = colorValue & 65535;
colorValue = colorValue - second;
second = second >> 8;
//G contains 8-15
G = (byte)second;
int third = colorValue & 16777215;
colorValue = colorValue - third;
third = third >> 16;
//B contains 16-23
B = (byte)third;
colorValue = colorValue >> 24;
//A contains 24-31
A = (byte)colorValue;
pixelColor = Color.FromArgb(A, R, G, B);
bitmap.SetPixel(location.X, location.Y, pixelColor);

取回值的代码是

byte R, G, B, A;
R = pixelColor.R;
G = pixelColor.G;
B = pixelColor.B;
A = pixelColor.A;

messageLength = A;
messageLength = messageLength << 8;
messageLength += B;
messageLength = messageLength << 8;
messageLength += G;
messageLength = messageLength << 8;
messageLength += R;

有什么我想念的吗?是不是 BMP 不允许 alpha 值持续存在??? 请帮忙。 谢谢。

【问题讨论】:

如果不查看用于编写和读取位图的代码,就很难诊断问题。可以发一下吗? 不确定,因此是评论,但您不需要诸如 PNG 之类的东西来保存 alpha 值吗? 似乎不可能。也许use PNG? 我只是想确认使用 Bitmap.MakeTransparent() 和 Bitmap.Save(sFilePath, ImageFormat.Png) 可以保留 alpha 值。 【参考方案1】:

很抱歉,Bitmap 不支持 alpha 值。

【讨论】:

如果您单击一下链接到链接的位置,您会找到"The high byte in each DWORD is not used""The Windows API is not capable of generating BMP images with alpha information and very few graphics editing programs are able to preserve transparency when saving images as BMP files."。因此,虽然在技术上可以利用所有四个字节来存储 alpha 通道,但无法使用 .NET 的机制来保存位图。 感谢您的澄清。 BMP 格式在技术上可以,但 Bitmap 类实际上不能。将位图误认为 BMP。我很抱歉。过去,当我需要使用 alpha 值时,我总是使用 PNG。 @ChrisMantle 但您在(现已删除)评论中链接的库 do 允许用户写入其他未使用的字节。非常适合隐藏信息,就像 OP 想要的那样。除非这些文件必须可以被其他编辑器打开和保存,否则会清除隐藏的数据。

以上是关于保存位图时 Alpha 值不保留的主要内容,如果未能解决你的问题,请参考以下文章

使用来自其他 32 位位图的 Alpha 通道组成新的 32 位位图

将位图保存到位置

加载和使用 Alpha 通道位图

缩放位图保持纵横比

将具有 alpha 的位图图层渲染到 FBO

在 Delphi 2007 中将具有透明度的位图保存为 PNG