2009-09-24 93 views

回答

2

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

特别是,this article描述了如何使用ColorMatrix将位图转换为灰度。 (它是用VB.NET编写的,但它应该很容易转换为C#)。

我还没有测试过它是否可以与alpha通道一起工作,但我会说这是值得一试的,它绝对是一种快速而有效的修改位图的方式。

+2

我在System.Drawing.Image上使用了它,它工作的很好。除非将GDI位图转换为BitmapSources,否则不适用于WPF图像。 – Zooba 2009-09-27 21:44:23

+0

我对WPF的体验非常有限,所以你可能是对的。 – bernhof 2009-09-29 07:05:40

+0

将此标记为答案,因为我不得不使用GDI位图并将它们转换为WPF BitmapsSources发布更改 – 2009-12-14 15:47:49

1

如果依靠API调用失败。你总是可以尝试'自己动手'的方法:只需访问图片的RGBA字节,并且对于每个RGBA用MMMA代替它,其中M =(R + G + B)/ 3;

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

+0

Thanks for that。我正在研究WriteableBitmap类作为直接访问像素的最简单方法。 – 2009-09-24 07:47:23

0

ShaderEffect虽然不是非常快速和简单,但它可以完成这项工作并且表现相当好。我自己做过,而且效果很好。 This article引用如何做到这一点,并有源关联。我没有使用他的来源,所以我不能担保。如果遇到问题,请问,我可能会发布一些我的代码。

不是每天你都可以在你的LOB应用程序中使用HLSL。 :)

+0

另外...这是假设您希望在将应用程序转换为灰度后将图像显示在应用程序中。如果您希望将其作为图像处理步骤执行,然后保存图像或其他内容,则可能需要做更多工作才能使ShaderEffect在WPF效果管道之外工作。无论如何,GDI或其他答案之一可能是你最好的选择。 – dustyburwell 2009-09-24 13:50:33

2

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

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

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