我的问题是我想让图像背景透明。以下功能对我来说很好,但在不同的机器上测试时,我发现有很多神器颜色,透明度不如我的机器和其他机器上的透明度那么清晰。 我正在使用调试版本,测试是在发布版本上完成的。但即使使用发布版本,我们也会在不同的计算机上看到不同
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();
}
}
任何帮助都会非常感激。
答案 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调用该函数的结果。我已将它们置于纯红色背景上,以便您可以看到透明像素..: