在Windows Phone应用程序中将动态BitmapImage转换为灰度BitmapImage

时间:2014-10-13 00:19:34

标签: c# windows-phone-8 bitmapimage grayscale

我想将BitmapImage转换为灰度BitmapImage:我从一个方法得到的因此 - 我不知道宽度和高度。我已经尝试过查看诸如WritableBitmapEx和静态扩展方法之类的选项,但它们对我没有帮助,因为我希望返回数据类型是BitmapImage,然后我需要将它添加到List。

在使用C#的Windows Phone应用程序中是否可以实现?如果有人能对此有所了解,我将非常感激。谢谢。

3 个答案:

答案 0 :(得分:1)

不确定这里的命名空间,但这样的事情可能有效:

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

FormatConvertedBitmap bitmapGreyscale = new FormatConvertedBitmap(bitmap, PixelFormats.Gray8, BitmapPalettes.Gray256, 0.0);

答案 1 :(得分:1)

算法非常简单:

using System.Windows.Media.Imaging;
using System.IO;

private WriteableBitmap ConvertToGrayScale(BitmapImage source)
{
    WriteableBitmap wb = new WriteableBitmap(source);               // create the WritableBitmap using the source

    int[] grayPixels = new int[wb.PixelWidth * wb.PixelHeight];

    // lets use the average algo 
    for (int x = 0; x < wb.Pixels.Length; x++)
    {
        // get the pixel
        int pixel = wb.Pixels[x];

        // get the component
        int red = (pixel & 0x00FF0000) >> 16;
        int blue = (pixel & 0x0000FF00) >> 8;
        int green = (pixel & 0x000000FF);

        // get the average
        int average = (byte)((red + blue + green) / 3);

        // assign the gray values keep the alpha
        unchecked
        {
            grayPixels[x] = (int)((pixel & 0xFF000000) | average << 16 | average << 8 | average);
        }
    }



    // copy grayPixels back to Pixels
    Buffer.BlockCopy(grayPixels, 0, wb.Pixels, 0, (grayPixels.Length * 4));

    return wb;            
}

private BitmapImage ConvertWBtoBI(WriteableBitmap wb)
{
    BitmapImage bi;
    using (MemoryStream ms = new MemoryStream())
    {
        wb.SaveJpeg(ms, wb.PixelWidth, wb.PixelHeight, 0, 100);
        bi = new BitmapImage();
        bi.SetSource(ms);
    }
    return bi;
}

<Image x:Name="myImage" Source="/Assets/AlignmentGrid.png" Stretch="None" />

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{       
    WriteableBitmap wb = ConvertToGrayScale((BitmapImage)this.myImage.Source);
    BitmapImage bi = ConvertWBtoBI(wb);


    myImage.Source = bi;       
}

行动中的代码:

enter image description here

答案 2 :(得分:0)

您无法写入BitmapImage:您需要将其转换为WriteableBitmap。一旦有了WriteableBitmap,就可以轻松访问缓冲区并将像素转换为GreyScale。

WriteableBitmaps和BitmapImages的工作方式非常相似,因为它们都是BitmapSources。如果将列表创建为列表而不是列表

,则可以将它们添加到同一列表中

应用程序不太可能对List的内容做任何需要内容为BitmapImages而不是BitmapSources的内容。