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不提供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的详细值调用函数的结果。我把它们放在纯红色背景上,这样你就可以看到透明像素..:

四个版本