【问题标题】:Different results for Bitmap.Maketransparent functionBitmap.Maketransparent 函数的不同结果
【发布时间】:2015-04-13 04:58:11
【问题描述】:

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 你在完全相同的源图像上得到不同的结果吗?
  • 是的,同一张图片在不同的机器上会给出不同的结果。
  • 这听起来很奇怪。您可以发布显示问题的图像或小示例的链接吗? (一个来源和两个修改版本最好..)
  • drive.google.com/file/d/0Bwjj96tG2KSiNmpnbmVMVTNja1E/… 无法上传真实图片,但上面的函数会发生这种情况(黑色背景透明)
  • OK,结果包含黑色、各种深浅不一的白色和一些边缘颜色。原件也应该有助于更接近解释。对不起,如果我再次问这个问题:机器是否使用相同的文件,或者它们是否从相同的进程和相同的源创建源? GDI+ 不应该创建不同的 resilts imo。有没有一种模式,至少有些机器得到了相同的结果..?

标签: c# image-processing graphics bitmap


【解决方案1】:

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

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) 调用函数的结果,其 deta 值为 5、10 和 50。我将它们放在纯红色背景上,以便您查看透明像素..:

【讨论】:

  • 谢谢你。只是一个简单的问题,不应该是 i+0, i+1, i+2 从所有 RGB 中获取值,所以这适用于所有情况吗?
猜你喜欢
  • 2010-12-05
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多