我有一个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指令或程序集引用?)
一些帮助会非常感谢我。谢谢。
答案 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。