删除图像透明度
Posted
技术标签:
【中文标题】删除图像透明度【英文标题】:Remove image transparency 【发布时间】:2014-12-01 17:07:46 【问题描述】:我在大学里研究机器学习问题,我的第一份工作是将图像转换为黑白。
问题是我的图片有透明度,不知道怎么去掉。
我正在尝试什么:
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,那么您发布的代码将起作用。因此,这并不意味着您遗漏了有关原始图像的一些关键信息。您应该发布一个完整的代码示例,包括源位图的独立初始化。见***.com/help/mcve
为了记录:我下载了问题中包含的确切图像,运行了问题中的代码,并将结果保存到一个新的 .png 文件中。正如预期的那样,它工作正常。您得到的答案可能是解决您的代码中存在的其他一些错误的解决方法,但如果您希望原始位图具有在您的位图中找到的透明度,那么这并不是解决此问题的正确方法回答了你的问题。
@PeterDuniho 你在这里传播错误信息。我也下载了图片。它具有透明的黑色像素。 Graphics
对象的默认 CompositingMode
是 SourceCopy
。 “...并将结果保存到一个新的 .png 文件中。”您的 PNG 文件具有透明度,因此您的输出也只有透明的黑色像素。尝试保存为没有 Alpha 通道的 JPG。你会发现你的图像全是黑色的,因为在白色背景上绘制透明黑色像素时没有使用 alpha 混合。
@PeterDuniho 见这里:en.wikipedia.org/wiki/Alpha_compositing
@TimothyShields:我通过陈述我做了什么来“传播错误信息”?在我的测试中,保存的位图没有透明像素并且看起来很好(即带有黑色字体和红线的白色背景)。
【参考方案1】:
您需要将Graphics
对象的CompositingMode
设置为SourceOver
,然后再在其上绘制另一个图像。
g.Clear(Color.White);
g.CompositingMode = CompositingMode.SourceOver;
g.DrawImage(src, 0, 0);
默认的CompositingMode
是SourceCopy
,它会将src
图像中的透明黑色(R=G=B=A=0)像素渲染为黑色像素。 SourceOver
将进行 alpha 混合,这正是您要寻找的。p>
详情请看这里:CompositingMode Enumeration
【讨论】:
感谢您的帮助@Timothy,我可以继续使用 Bitmap 吗?还是我必须使用图像?它继续使用位图返回黑色 =/ @Crasher 在这里使用Bitmap
类很好。我绝对确定问题和修复就是我上面描述的。除了您在这里描述的问题之外,肯定还有其他问题。
@TimothyShields:如果原始位图使用 0,0,0 的 RGB 来表示透明像素,那么为什么原始位图中的黑色数字是可见的?请注意,他在文章中发布的位图具有真正的透明度,并且可以与他发布的代码一起正常工作。
Image 是一个类,它可以包含一些其他图像格式的位图,如 WMF 或图标。它根本不是 Bitmap 的替代品,但对于大多数人来说,它使用相同的东西,一次,就像一个人总是需要做的那样,一个人已经转换为 Bitmap!
@PeterDuniho “为什么原始位图中的黑色数字可见?”因为 Stack Overflow 使用白色背景,而您的浏览器进行 alpha 混合(白色背景 + 顶部透明黑色 = 白色)。 :) 没有“真正的透明度”之类的东西:每个像素都有 (R,G,B,A),您可以在固定 A=0 的同时改变所有 (R,G,B)。这就是为什么有“透明黑色”、“透明白色”、“透明洋红色”等的原因。以上是关于删除图像透明度的主要内容,如果未能解决你的问题,请参考以下文章