在Windows Phone 8.1 Runtime中将BitmapImage转换为byte[]数组

3

有一些样例可以实现这个,但它们是针对Windows Phone 8.0或8.1 Silverlight的。

但是如何在Windows Phone 8.1 Runtime上实现呢?


关于此事有一些需要考虑的因素。 - marcinax
@marcinax,你看了标题吗?还是我发布的内容?我知道有100个样例和问题可以做到这一点...你发的链接是给Windows Phone“7”用的!!! - Bayern
这里有另一个链接供您参考:http://stackoverflow.com/questions/12963508/bitmapimage-to-byte-windows-8-metro-winrt。它是针对WinRT的。请使用搜索功能。 - marcinax
@marcinax 不起作用。 - Bayern
2个回答

7

您无法从Windows.UI.Xaml.Media.Imaging.BitmapImage中提取像素。

最常见的解决方案是使用WriteableBitmap而不是BitmapImage。这些类都是BitmapSources,并且可以几乎互换使用。WriteableBitmap通过其PixelBuffer属性提供对其像素数据的访问:

byte[] pixelArray = myWriteableBitmap.PixelBuffer.ToArray(); // convert to Array
Stream pixelStream = wb.PixelBuffer.AsStream();  // convert to stream

否则,您需要从BitmapImage获取像素。根据BitmapImage的初始化方式,您可能可以通过其UriSource属性找到其来源。WinRT Xaml Toolkit具有一个FromBitmapImage扩展方法,可以基于其UriSource从BitmapImage创建WriteableBitmap。
一种不太美观的选择是将BitmapImage渲染为图像,基于该图像创建RenderTargetBitmap,然后使用RenderTargetBitmap.CopyPixelsAsync()获取其像素。

1
这是我获取和显示图像的方式: StorageFile storageFile = args.Files[0]; var stream = await storageFile.OpenAsync(FileAccessMode.Read); var bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage(); await bitmapImage.SetSourceAsync(stream);var decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(stream); - Bayern
我在不同的地方看到了同样的代码片段,我想知道像素流是否需要处理? - thumbmunkeys
必须添加 using System.Runtime.InteropServices.WindowsRuntime; 才能访问 AsStream() 扩展方法。 - Felix

-1

尝试过这个吗?

private byte[] ConvertToBytes(BitmapImage bitmapImage)
{
    byte[] data = null;
    using (MemoryStream stream = new MemoryStream())
    {
        WriteableBitmap wBitmap = new WriteableBitmap(bitmapImage);
        wBitmap.SaveJpeg(stream, wBitmap.PixelWidth, wBitmap.PixelHeight, 0, 100);
        stream.Seek(0, SeekOrigin.Begin);
        data = stream.GetBuffer();
    }

    return data;
}

2
这对于 Windows Phone Runtime 应用程序不起作用,因为 Windows.UI.Xaml.Media.Imaging.WriteableBitmap 没有接受 BitmapImage 的构造函数。 - Rob Caplan - MSFT
4
不,这不是UWP代码。UWP也没有这样的构造函数。 - Rhywden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接