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

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

这里的MSDN文章工作正常,但它删除了alpha通道。

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

你应该看看使用矩阵的图像变换。

特别是, 本文介绍如何使用ColorMatrix将位图转换为灰度。 (它是用VB.NET编写的,但它应该很容易转换为C#)。

我没有测试它是否适用于alpha通道,但我认为它值得一试,它肯定是一种快速有效的修改位图的方法。

这实际上取决于你的源PixelFormat是什么。 假设您的源是PixelFormats.Bgra32并且您想要转到灰度,您可以考虑使用PixelFormats.Gray16的目标像素格式。 但是, Gray16不支持alpha。 它只有65,535个黑色和白色之间的刻度,包括在内。

你有几个选择。 一个是留在Bgra32 ,只需将蓝色,绿色和红色通道设置为相同的值。 这样你就可以保持alpha通道。 如果您不需要8位Alpha通道(对于每个像素的不同alpha级别),这可能会浪费。

另一种选择是使用索引像素格式,如PixelFormats.Indexed8并创建一个包含所需灰色和alpha值的调色板。 如果您不需要混合alpha,则可以使位置0处的调色板颜色完全透明(alpha为零),然后在255中将索引1中的纯黑色转换为白色。

如果依赖API调用失败。 您可以随时尝试“自己动手”方法:只需访问图片的RGBA字节,并且每个RGBA都用MMMA替换它,其中M =(R + G + B)/ 3;

如果您希望它更完美,您应该为RGB组件的贡献添加权重。 我相信你的眼睛更容易接受绿色,因此价值应该更重。

虽然不是那么快速和简单,但ShaderEffect可以完成这项工作并且表现相当不错。 我自己做了,效果很好。 本文介绍了如何执行此操作并将源关联。 我没有使用他的来源,所以我不能保证它。 如果遇到问题,请询问,我也许可以发布一些代码。

不是每天都可以在LOB应用程序中使用HLSL 。 🙂