如何将透明PNG加载到位图并忽略Alpha通道

我看到很多关于如何加载带有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);