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