2013-06-14 14 views
15

私は画像にフィルタを適用するWindows 8 Metroアプリケーションで作業しています。私はアプリのウェブ版を持っていて、それを移植したかった。しかし、われわれ全員が知っているように、WinRTには.NETが提供するすばらしいものはありません。/C#Windows 8 Store(Metro、WinRT)BitmapImageへのバイト配列

現在、私はバイト配列にフィルタを適用しています。だから過去数日間私はStorageFileをbyte []に​​変換し、次にbyte []をBitmapImageに変換する方法を探してきました。

これまでのところ、私は最初のファイルを管理しています(StorageFile to byte [])。ここで私はそれを行う方法です。

public async Task<Byte[]> 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(); 
    } 

コードのこの作品はBGRAような画素データが含まれているbyte[]を返します。

ここではトリッキーな部分があります。私は正常にバイト配列をBitmapImageに変換できません。私は場所を探し回っており、多くの人がWriteableBitmapの使用を提案していますが、それは私にはあまり役に立ちません。私は、動作するはずのコードをいくつか見つけましたが、そうではありません。私はこのようなInMemoryRandomAccessStreamを使用しているしようとしたソリューションの

一つは:

はタイプの例外「のSystem.Exception」をmscorlibで発生しました:

public async Task<BitmapImage> 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; 
    } 

この1つは、次の例外がスローされます。 dllがユーザーコードで処理されませんでした

追加情報:コンポーネントが見つかりません。 (HRESULTからの例外: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; 
     } 

とコードの最初の部分と同じ例外を取得します。

また、通常のストリームを使用してIRandomAccessStreamに変換するなどいくつかの方法を試しましたが、どちらも機能しませんでした。

上記のコードはすべて私にとってうまくいくようです。だから今私の推測では、問題はbyte[]にあるということです。私は内部のpixelDataのフォーマットが有効ではないと推測していますので、RGBAに変更しようとしましたが、どちらも役に立ちませんでした。またPixelHeightとのBitmapImageのPixelWidthは0

+0

解決策が見つかりましたか?私も同じ問題を抱えています。 – TheQuestioner

答えて

12

これは、これはそれが役立つ私の最初のanswer..hopeある

private async Task<BitmapImage> ByteArrayToBitmapImage(byte[] byteArray) 
    { 
     var bitmapImage = new BitmapImage(); 

     var stream = new InMemoryRandomAccessStream(); 
     await stream.WriteAsync(byteArray.AsBuffer()); 
     stream.Seek(0); 

     bitmapImage.SetSource(stream); 
     return bitmapImage; 
    } 
+0

はゼロ(stream.Seek(0))を働かせなければなりませんでした:)ありがとう:) –

1

、私のために働いているされています。

私はまったく同じ問題を抱えていましたが、私はこれを念入りにしようと6時間以上続けました。 これは私が思いついたものです: あなたが言ったことは正しかったです。BYTEARRAYに画像を変換する2 wayeがあります

まずaproach(あなた)

 public async Task<byte[]> 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(); 
    } 

第aproach

 public async Task<byte[]> 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; 
    } 

のyoullはない画素に、PICをデコードするために第2のaproachを使用する場合、このコンバータは動作します:

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(); 
    } 

あなたはWriteablで作業する必要がありますあなたが言ったようにeBitmap。

関連する問題