将BitmapImage转换为灰度,并保持alpha通道

时间:2009-09-24 06:58:26

标签: c# .net wpf .net-3.5

我遇到了将BitmapImage(WPF)转换为灰度,同时保留Alpha通道的问题。源图像是PNG。

MSDN文章here运行正常,但它删除了Alpha通道。

有没有快速有效的方法将BitmapImage转换为灰度?

4 个答案:

答案 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。 :)