1

我看到很多关于如何加载带有 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 通道设置为不透明。我希望这对将来的某人有用。

4

1 回答 1

4

试试这个扩展方法:

    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);
于 2011-07-24T20:55:37.600 回答