5

我想知道如何将ImageSource对象(在我的情况下是图像元素的源属性)转换为WriteableBitmap. 构造WriteableBitmap(BitmapSource)函数在 Windows 8 Metro 中不起作用,所以我不能这样做。

我试图将ImageSource对象加载到流中然后使用WriteableBitmap.SetSource(stream),但我也不知道如何将图像加载到流中。

InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream();
BitmapEncoder enc = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, ras);

byte[] pixelArray = new byte[(uint)photoBox.Height * (uint)photoBox.Width * 4];

enc.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Straight,
                 (uint)photoBox.Width, (uint)photoBox.Height, 96, 96, pixelArray);

我还添加了我在网上找到的这个辅助方法:

public Byte[] BufferFromImage(BitmapImage imageSource)
{
    Stream stream = imageSource.StreamSource;
    Byte[] buffer = null;
    if (stream != null && stream.Length > 0)
    {
        using (BinaryReader br = new BinaryReader(stream))
        {
            buffer = br.ReadBytes((Int32)stream.Length);
        }
    }

    return buffer;
}

问题是BitmapImage不再有StreamSource方法了。

4

2 回答 2

2

WinRT XAML 平台在位图类中有一些不幸的限制。WinRT XAML 工具包有一个您可以查看的FromBitmapImage方法。它基本上采用原始源并基于该源加载 WriteableBitmap。目前它仅限于安装应用程序的位图,但这应该很容易扩展到来自网络的文件(例如,使用WebFile类下载图像)。您需要执行一些特定于应用程序的代码的唯一情况是,如果您使用 SetStream 加载 BitmapImage - 原始 Uri 会丢失,但在这种情况下 - 您也可以使用 WriteableBitmap 而不是 BitmapImage 和可以在 WriteableBitmaps 之间复制像素/字节。

于 2012-08-03T17:13:08.840 回答
-1

我在 MSDN 论坛上得到了答案。

无法从 ImageSource 中提取图像数据。您将需要跟踪信息的原始来源,并从原始来源在 WriteableBitmap 中重新创建图像。如果您知道您将需要这样做,您最好只使用 WriteableBitmap 作为您的 ImageSource 开始。

来源

于 2012-08-03T17:08:10.537 回答