我遇到了将BitmapImage(WPF)转换为灰度,同时保留Alpha通道的问题。源图像是PNG。
MSDN文章here运行正常,但它删除了Alpha通道。
有没有快速有效的方法将BitmapImage转换为灰度?
答案 0 :(得分:2)
你应该看看使用矩阵的图像转换。
特别是,this article介绍了如何使用ColorMatrix
将位图转换为灰度。 (它是用VB.NET编写的,但它应该很容易转换为C#)。
我没有测试它是否适用于alpha通道,但我认为它值得一试,它肯定是一种快速有效的修改位图的方法。
答案 1 :(得分:2)
这实际上取决于您的来源PixelFormat
。假设您的来源为PixelFormats.Bgra32
并且您想要进行灰度,则可以考虑使用PixelFormats.Gray16
的目标像素格式。但是,Gray16
不支持alpha。它只有65,535个黑白分级,包括在内。
您有几个选择。一个是留在Bgra32
,只需将蓝色,绿色和红色通道设置为相同的值即可。这样你就可以保留alpha通道。如果您不需要8位Alpha通道(每个像素的alpha级别不同),这可能会造成浪费。
另一种选择是使用索引像素格式,例如PixelFormats.Indexed8
,并创建一个包含所需灰色和alpha值的调色板。如果您不需要混合alpha,则可以使位置0处的调色板颜色完全透明(alpha为零),然后在255中将指数1中的纯黑色转换为白色。
答案 2 :(得分:1)
如果依赖API调用失败。您可以随时尝试“自己动手”的方法:只需访问图片的RGBA字节,并为每个RGBA替换为MMMA,其中M =(R + G + B)/ 3;
如果您希望它更完美,您应该为RGB组件的贡献添加权重。我相信你的眼睛更容易接受绿色,因此价值应该更重。
答案 3 :(得分:0)
虽然不是非常简单快捷,但ShaderEffect可以完成这项工作并且表现相当不错。我自己做了,效果很好。 This article引用了如何执行此操作并将源关联起来。我没有使用他的来源,所以我不能保证它。如果您遇到问题,请询问,我可能会发布一些代码。
并非每天都可以在LOB应用中使用HLSL。 :)