去除图像透明度。

4

我正在大学里研究机器学习问题,我的第一项任务是将图像转换为黑白。

问题是我的图像带有透明度,我不知道如何去除它。

我正在尝试的方法:

public static Bitmap RemoveTransparency (Bitmap src)
{            
    Bitmap   target = new Bitmap (src.Size.Width, src.Size.Height);
    Graphics g      = Graphics.FromImage (target);

    g.Clear (Color.White);            
    g.DrawImage (src, 0, 0);

    return target;
}

一个输入图片的例子:

我的验证码图片

“RemoveTransparency”调用后输出图片的示例:

输出图片

有人知道这是怎么回事吗?似乎背景和字母颜色相同...而且如果我把颜色改为白色,我的背景是黑色?
谢谢!

你的 src 图像的来源是什么?它以何种方式“具有透明度”?如果它实际上是一个32bpp位图,其中透明像素具有alpha值为0,则您发布的代码将起作用。因此,这表明您在原始图像方面遗漏了一些关键信息。您应该发布一个完整的代码示例,包括源位图的自包含初始化。请参阅http://stackoverflow.com/help/mcve。 - Peter Duniho
记录一下:我下载了问题中包含的确切图像,运行了问题中的代码,并将结果保存到一个新的.png文件中。它正常工作,就像预期的那样。你得到的答案可能是解决你代码中其他错误的一种方法,但如果你希望使用原始位图具有与你在问题中得到的位图相同的透明度,那么这并不是真正的修复方法。 - Peter Duniho
@PeterDuniho,您在这里散布错误信息。我也下载了该图像。它有透明的黑色像素。Graphics对象的默认CompositingModeSourceCopy。"...并将结果保存到新的.png文件中。"您的PNG文件具有透明度,因此您的输出也只有透明的黑色像素。尝试保存为没有alpha通道的JPG。您会发现您的图像全是黑色的,因为在白色背景上绘制透明的黑色像素时没有使用alpha混合。 - Timothy Shields
@PeterDuniho 请看这里:http://en.wikipedia.org/wiki/Alpha_compositing - Timothy Shields
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Peter Duniho
1个回答

5

在将另一张图片绘制在当前图片上方之前,您需要将Graphics对象的CompositingMode设置为SourceOver

g.Clear(Color.White);
g.CompositingMode = CompositingMode.SourceOver;
g.DrawImage(src, 0, 0);

默认的 CompositingModeSourceCopy,这会将你的 src 图像中透明的黑色像素(R=G=B=A=0)渲染成黑色像素。使用 SourceOver 可以实现透明度混合,这正是您想要的效果。
详见此处: CompositingMode 枚举

谢谢你的帮助,@Timothy。我可以继续使用Bitmap吗?还是必须使用Image?使用Bitmap时它仍然返回黑色 =/ - briba
@Crasher 在这里使用 Bitmap 类是可以的。我非常确定问题和解决方法就是我上面所描述的。除了你在这里描述的问题之外,一定还有其他的问题。 - Timothy Shields
Image是一个类,可以包含位图或其他图像格式(如WMF或图标)。它根本不是Bitmap的替代品,但对于大多数用途来说,它们是相同的东西。一旦使用了Image,那么总是需要将其转换为Bitmap! - TaW
@PeterDuniho “为什么原始位图中的黑色数字可见?” 因为Stack Overflow使用白色背景,而您的浏览器进行了alpha混合(白色背景+透明黑色在顶部=白色)。 :) 没有“真正的透明度”:每个像素都有(R,G,B,A),您可以变化所有的(R,G,B),同时固定A = 0。这就是为什么有“透明黑色”,“透明白色”,“透明品红色”等的原因。 - Timothy Shields
@TimothyShields:抱歉,我显然没有很好地解释我的观点。我太含蓄了,这是我的错。我知道你写的一切。但问题是,通常情况下不需要显式设置“CompositingMode”就可以正常工作;默认值已经是“SourceOver”。 - Peter Duniho
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接