C#Windows 8 Store(Metro,WinRT)Byte数组到BitmapImage
我正在开发一个将filter应用于图像的Windows 8 Metro应用程序。 我有一个网络版的应用程序,并希望移植它。 但是众所周知,WinRT没有.NET提供的所有好处:/
目前我在字节数组上应用filter,我想保持这种方式,因为它超快! 因此,在过去的几天里,我一直在寻找将StorageFile转换为byte []然后将byte []转换为BitmapImage的方法。
到目前为止,我已经成功完成了第一个(StorageFile到byte [])。 我是这样做的:
public async Task ImageFileToByteArray(StorageFile file) { IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); PixelDataProvider pixelData = await decoder.GetPixelDataAsync(); return pixelData.DetachPixelData(); }
这段代码返回一个byte[]
,其中包含像素数据BGRA。
这是棘手的部分。 我无法成功将字节数组转换为BitmapImage。 我搜遍了所有的地方,很多人建议使用WriteableBitmap,但这对我没什么好处。 我还发现了一些应该起作用的代码片段……但它们没有。
我尝试过的解决方案之一是使用InMemoryRandomAccessStream,如下所示:
public async Task ByteArrayToBitmapImage(Byte[] pixels) { var stream = new InMemoryRandomAccessStream(); await stream.WriteAsync(pixels.AsBuffer()); stream.Seek(0); var image = new BitmapImage(); await image.SetSourceAsync(stream); return image; }
这个抛出以下exception:
mscorlib.dll中出现“System.Exception”类型的exception,但未在用户代码中处理
附加信息:找不到该组件。 (HRESULTexception:0x88982F50)
我尝试使用这一行代替:
PixelDataProvider pixelData = await decoder.GetPixelDataAsync( BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, new BitmapTransform(), ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.DoNotColorManage);
但是,由于我一直得到这个例外,这对我没有好处。
我也试过这个:
var bitmapImage = new BitmapImage(); var pixels = await ImageFileToByteArray(file); ImageSource imgSource; using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream()) { using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0))) { writer.WriteBytes(pixels); await writer.StoreAsync(); } await bitmapImage.SetSourceAsync(ms); imgSource = bitmapImage; }
并获得与第一段代码相同的exception。
我还尝试了其他几种方法,包括使用普通Stream然后转换为IRandomAccessStream,但它们也不起作用。
以上所有代码对我来说都很好。 所以我现在的猜测是问题在于byte[]
。 我猜测pixelData里面的格式是无效的,所以我尝试将它改为RGBA,但这也无济于事。 BitmapImage的PixelHeight和PixelWidth也是0。
这对我有用,
private async Task ByteArrayToBitmapImage(byte[] byteArray) { var bitmapImage = new BitmapImage(); var stream = new InMemoryRandomAccessStream(); await stream.WriteAsync(byteArray.AsBuffer()); stream.Seek(0); bitmapImage.SetSource(stream); return bitmapImage; }
这是我的第一个答案..希望它会有所帮助。
我有完全相同的问题,我花了6个多小时试图弄清楚这个问题。 这就是我想出的:你说的是对的。 有2个方法将图像转换为byteArray:
第一个方法(你的)
public async Task ImageFileToByteArrayAsync(StorageFile file) { IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); PixelDataProvider pixelData = await decoder.GetPixelDataAsync(); return pixelData.DetachPixelData(); }
第二个方法
public async Task ImageFileToByteArrayAsync(StorageFile file) { var inputStream = await file.OpenSequentialReadAsync(); var readStream = inputStream.AsStreamForRead(); var buffer = new byte[readStream.Length]; await readStream.ReadAsync(buffer, 0, buffer.Length); return buffer; }
如果你使用第二个aproach解码pic,没有像素,这个转换器将工作:
public class ByteArrayToImageConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { if (value == null || !(value is byte[])) return null; using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream()) { using (DataWriter writer = new DataWriter(stream.GetOutputStreamAt(0))) { writer.WriteBytes((byte[])value); writer.StoreAsync().GetResults(); } BitmapImage image = new BitmapImage(); image.SetSource(stream); return image; } } public object ConvertBack(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); }
对于第一个aproach,你需要使用WriteableBitmap,如你所说。
上述就是C#学习教程:C#Windows 8 Store(Metro,WinRT)Byte数组到BitmapImage分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/958294.html