将 BitmapImage 转换为位图(Windows Phone 8.1 使用 Accord.net 便携式库)

Converting BitmapImage to Bitmap (Windows Phone 8.1 using Accord.net Portable Library)

我正在 Windows Phone 8.1 中创建一个简单的图像处理应用程序,它使用 Accord.net 便携式图书馆。我的主要目标是使用灰度从我的图片库(在 .jpeg 中)过滤彩色图像。 Accord.net 可移植库允许在 System.Drawing[=40= 下的 Windows Phone 中使用 Bitmap ] 以便我可以执行图像处理方法。

问题是我正在使用 Open File Picker,它在从图片库中获取图像时使用 BitmapImage。这是我的代码:

public async void ContinueFileOpenPicker(FileOpenPickerContinuationEventArgs args)
    {
        if (args.Files != null)
        {
            StorageFile file = args.Files[0];
            bitmapImage = new BitmapImage();

            using (var stream = await file.OpenReadAsync())
            {
                await bitmapImage.SetSourceAsync(stream);
            }
        }
        img_Original.Source = bitmapImage;
    }

https://github.com/cureos/accord/blob/portable/Sources/Accord.Imaging/AForge/Filters/Color%20Filters/Grayscale.cs 中提供的示例 Grayscale.cs class 表明我可以简单地使用以下代码来执行灰度滤镜:

Grayscale filter = new Grayscale( 0.2125, 0.7154, 0.0721 );
Bitmap grayImage = filter.Apply( image );

image应该是Bitmap的一种。如您所见,我无法使用 bitmapImage 变量,因为它是 BitmapImage 的一种类型。另一个问题是,Bitmap 不包含任何构造函数(与在 WinForms 中不同)。所以我真的无法选择如何将灰度滤镜应用于现有图像。另一个可能有帮助的信息是,当我将鼠标悬停在 filter.Apply 构造函数时,它包含不同于 Bitmap 的数据类型。 BitmapDataUnmanagedImage。但是我不知道如何使用这些数据类型。

任何我可以利用的解决方法,将不胜感激。

正如所讨论的 here,在应用任何 AForge/ 之前,您需要从 WriteableBitmap 中施放 对应图像操作,图像处理操作完成后回退WriteableBitmap

另见 this 回答。