如何加载透明PNG到位图和忽略alpha通道
本文关键字:位图 通道 alpha PNG 何加载 加载 透明 | 更新日期: 2023-09-27 18:03:37
我看到很多关于如何加载带有alpha通道的PNG并显示它的问题,但没有关于如何加载具有alpha通道但忽略alpha通道的PNG,显示底层RGB数据的问题。
我试过简单地从alpha通道中删除所有数据,但我只是得到黑色像素而不是我想要的颜色数据。似乎从我创建Bitmap对象的那一刻起,它就不包含alpha为0的像素中的任何颜色信息,尽管我向您保证信息在PNG中物理存在。
要清楚,如果我的图像包含这些值的像素:(R:255 G:128 B:128 a:0)我需要该像素为(R:255 G:128 B:128 a:255),而不是(R:0 G:0 B:0 a:255)。
感谢编辑:前面的信息不正确。位图包含使用
时的所有信息: Bitmap myImage = Bitmap("filename.png")
;
我做错的是后来使用:
Bitmap otherImage = Bitmap(myImage);
似乎这就是我所需要的数据无效的原因。相反,我现在使用
Bitmap otherImage = (Bitmap)(myImage.Clone());
,然后使用lockbits手动将alpha通道设置为不透明。我希望这对将来的人有用。
试试这个扩展方法:
public static void SetAlpha(this Bitmap bmp, byte alpha)
{
if(bmp == null) throw new ArgumentNullException("bmp");
var data = bmp.LockBits(
new Rectangle(0, 0, bmp.Width, bmp.Height),
System.Drawing.Imaging.ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var line = data.Scan0;
var eof = line + data.Height * data.Stride;
while(line != eof)
{
var pixelAlpha = line + 3;
var eol = pixelAlpha + data.Width * 4;
while(pixelAlpha != eol)
{
System.Runtime.InteropServices.Marshal.WriteByte(
pixelAlpha, alpha);
pixelAlpha += 4;
}
line += data.Stride;
}
bmp.UnlockBits(data);
}
用法:
var pngImage = new Bitmap("filename.png");
pngImage.SetAlpha(255);