【问题标题】:Showing only Green component color among ARGB in a writeablebitmap image在可写位图图像中仅显示 ARGB 中的绿色分量颜色
【发布时间】:2015-10-11 20:06:50
【问题描述】:

我有一个 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”不包含“像素”的定义,并且没有扩展方法“像素”接受“Windows.UI.Xaml.Media.Imaging.WriteableBitmap”类型的第一个参数找到(您是否缺少 using 指令或程序集引用?)

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

【问题讨论】:

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


    【解决方案1】:

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

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

    我的同事 Jeff 在他的博客文章 How to: Convert an Image to Grayscale 中演示了通过 AsStream 进行灰度转换

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

    【讨论】:

    • :[How to:Convert an Image to Grayscale],这个链接给了我灰度图像。你能告诉我我需要做什么改变才能只得到图像的绿色分量??这实际上很慢,你知道我该如何优化这个算法吗??
    【解决方案2】:

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

    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 通道的位置。您应该使用测试图像进​​行检查,这有纯色区域。)

    【讨论】:

    • bitmapImage.Pixels[pixelLocation] = BitConverter.ToInt32(pixelbytes, 0);我在这行遇到问题。没有像素参考。
    • 对不起,我忽略了这一点。如果您的灰度转换不起作用,您能否用错误消息更新您的问题?
    • 很可能,您的问题是您正在转换为Int32。像素值通常为uint8。但我不熟悉C#
    • 嗯。或者您可能需要请求并写入后台缓冲区:msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2020-10-08
    • 2011-10-28
    • 2014-02-23
    • 1970-01-01
    • 2014-04-19
    • 2016-12-27
    • 2018-07-15
    • 1970-01-01
    • 2014-06-13
    相关资源
    最近更新 更多