Bitmap.Maketransparent 函数的不同结果

Different results for Bitmap.Maketransparent function

我的问题是我想使图像背景透明。以下功能对我来说工作正常,但在另一台机器上测试时,我发现有很多工件颜色,透明度不如我的机器和其他一些机器上的清晰。 我正在使用调试版本,测试是在发布版本上完成的。但即使使用发布版本,我们也会在不同的机器上看到不同的结果。

Image CreateTransparentBackgroundImage(Image image)
        {
            using (Bitmap tempBitmap = new Bitmap(image.Width, image.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb))
            {
                var g = Graphics.FromImage(tempBitmap);
                Rectangle rec = new Rectangle(0 ,0,image.Width, image.Height);
                g.DrawImage(image,rec, 0, 0,image.Width,image.Height, GraphicsUnit.Pixel);
                tempBitmap.MakeTransparent(System.Drawing.Color.White);
                g.Dispose();
                return (Image)tempBitmap.Clone();
            }
        }

如有任何帮助,我们将不胜感激。

您的问题似乎来自非常细微的不同来源,目标颜色也非常细微的不同。

MakeTransparent 不提供 any 容差。

这是一个具有必要公差的函数。它将使每一个比 delta 更接近目标颜色的像素透明。 (距离是三个通道增量的简单总和..)

public static Bitmap MakeTransparent(Bitmap bmp, Color col, int delta)
{
    // we expect a 32bpp bitmap!
    var bmpData = bmp.LockBits(
                            new Rectangle(0, 0, bmp.Width, bmp.Height),
                            ImageLockMode.ReadWrite, bmp.PixelFormat);

    long len = bmpData.Height * bmpData.Stride;
    byte[] data = new byte[len];
    Marshal.Copy(bmpData.Scan0, data, 0, data.Length);

    for (int i = 0; i < len; i += 4)
    {
        int dist = Math.Abs(data[i + 0] - col.B);
        dist += Math.Abs(data[i + 1] - col.G);
        dist += Math.Abs(data[i + 2] - col.R);
        if (dist <= delta) data[i + 3] = 0;
    }
    Marshal.Copy(data, 0, bmpData.Scan0, data.Length);
    bmp.UnlockBits(bmpData);
    return bmp;
}

这里有四张图片:1) 您提供的来源和 2) - 3) 使用 deta 值 5、10 和 50 调用函数的结果。我将它们放在纯红色背景上,这样您可以看到透明像素..:[=​​14=]