在writeablebitmap图像中仅显示ARGB中的绿色分量颜色

时间:2015-07-22 05:48:52

标签: c# image-processing windows-8.1 winrt-xaml pixels

我有一个WriteableBitmap图像,我想在buttonclick事件中只显示它的绿色组件。

早些时候我试图先将它转换为灰度,然后我希望在此之后我只能显示绿色组件,但无论如何我无法破解它。

以下是我目前正在尝试将图像转换为灰度图像的代码:

public static WriteableBitmap ToGrayScale(WriteableBitmap bitmapImage) {

    for (var y = 0; y < bitmapImage.PixelHeight; y++) {
        for (var x = 0; x < bitmapImage.PixelWidth; x++) {
            var pixelLocation = bitmapImage.PixelWidth * y + x;
            var pixel = bitmapImage.Pixels[pixelLocation];
            var pixelbytes = BitConverter.GetBytes(pixel);
            var bwPixel = (byte)(.299 * pixelbytes[2] + .587 * pixelbytes[1] + .114 * pixelbytes[0]);
            pixelbytes[0] = bwPixel;
            pixelbytes[1] = bwPixel;
            pixelbytes[2] = bwPixel;
            bitmapImage.Pixels[pixelLocation] = BitConverter.ToInt32(pixelbytes, 0);
        }
    }

    return bitmapImage;
}

我收到此错误: 'Windows.UI.Xaml.Media.Imaging.WriteableBitmap'不包含'Pixels'的定义,也没有扩展方法'Pixels'接受'Windows.UI.Xaml.Media.Imaging.WriteableBitmap'类型的第一个参数可能是发现(您是否缺少using指令或程序集引用?)

一些帮助会非常感谢我。谢谢。

2 个答案:

答案 0 :(得分:0)

您必须复制图像的第二个频道:

public static WriteableBitmap ToGrayScale(WriteableBitmap bitmapImage) {

    for (var y = 0; y < bitmapImage.PixelHeight; y++) {
        for (var x = 0; x < bitmapImage.PixelWidth; x++) {
            var pixelLocation = bitmapImage.PixelWidth * y + x;
            var pixel = bitmapImage.Pixels[pixelLocation];
            var pixelbytes = BitConverter.GetBytes(pixel);
            var greenChannel = (byte)(pixelbytes[1]);
            pixelbytes[0] = greenChannel;
            pixelbytes[1] = greenChannel;
            pixelbytes[2] = greenChannel;
            bitmapImage.Pixels[pixelLocation] = BitConverter.ToInt32(pixelbytes, 0);
        }
    }

    return bitmapImage;
}

(在这段代码中我假设您的灰度转换是正确的.Windows倾向于将RGB图像作为BGR存储在内存中。我不确定alpha通道的位置。您应该检查一下测试图像,有纯色区域。)

答案 1 :(得分:0)

如上所述,Windows.UI.Xaml.Media.Imaging.WriteableBitmap没有Pixels属性:它有一个PixelBuffer,它将像素作为IBuffer返回。

您可以使用DataReader&amp; amp ;;访问IBuffer。 DataWriter或使用AsStream扩展方法转换为流,或使用ToArray扩展方法转换为byte []。一旦你有一个流或数组,它就可以直接循环,将字节转换为绿色或灰度,然后重新设置修改后的像素。

我的同事杰夫在博客文章How to: Convert an Image to Grayscale

中通过AsStream演示了灰度转换

开源WriteableBitmapEx项目还为WriteableBitmap添加了自己的扩展,以访问PixelBuffer。