【问题标题】:How to load Transparent PNG to Bitmap and ignore alpha channel如何将透明 PNG 加载到位图并忽略 alpha 通道
【发布时间】:2011-10-12 04:09:22
【问题描述】:

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

然后使用锁定位手动将 Alpha 通道设置为不透明。 我希望这对将来的某人有用。

【问题讨论】:

    标签: c# bitmap png alpha imaging


    【解决方案1】:

    试试这个扩展方法:

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

    【讨论】:

    • 感谢您的回答,看来我的问题一开始是错误的(已编辑问题)。
    • 感谢 max 这个答案也帮助了我的情况!请参阅链接。 stackoverflow.com/questions/10981230/…
    • 有了这个解决方案,我的 PNG 的背景被涂成黑色:/ 有什么建议吗?谢谢!越来越近了!
    • @tomitrescak 你有没有考虑过它可能就是这样保存的?
    • 小心这种方法,顺便说一句...它假定图片是 32bpp RGBA 而不实际检查。
    猜你喜欢
    • 2011-06-06
    • 2012-12-16
    • 1970-01-01
    • 2010-12-30
    • 2019-03-18
    • 1970-01-01
    • 2023-04-07
    • 2011-07-03
    • 2018-11-04
    相关资源
    最近更新 更多