Bitmap.Maketransparent函数的结果不同

时间:2015-02-12 12:42:44

标签: c# image-processing graphics bitmap

我的问题是我想让图像背景透明。以下功能对我来说很好,但在不同的机器上测试时,我发现有很多神器颜色,透明度不如我的机器和其他机器上的透明度那么清晰。       我正在使用调试版本,测试是在发布版本上完成的。但即使使用发布版本,我们也会在不同的计算机上看到不同

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

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

您的问题似乎来自非常不同的来源,目标颜色略有不同。

MakeTransparent并未提供任何容差。

这是一个具有必要公差的功能。它会使每个像素透明,与目标颜色的距离小于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)使用详细值为5,10和50调用该函数的结果。我已将它们置于纯红色背景上,以便您可以看到透明像素..:

four versions