2016-03-19 24 views
3

BitmapImageオブジェクトをUWPのバイト配列に変換するにはどうすればよいですか?以前のWinRTバージョンでも簡単に実現できましたが、成功しなかったのですが、解決策の1つはanswerのようなWriteableBitmapを使用することでしたが、現在のバージョンのUWPではWriteableBitmap BitmapImageを使用することはできません。UWPでBitmapImageをバイト配列に変換する

+0

どのようにBitmapImageを取得しますか? URLまたは何から? – fillobotto

+1

@fillobotto:URLから、ウェブのURL。 – AymenDaoudi

+0

私は空白のUWPプロジェクトで私のために働いて答えを精緻化しました – fillobotto

答えて

9

イメージURLから始めるので、私が把握できる唯一の方法はイメージのストリームを取得することです。これを行うには、RandomAccessStreamReference.CreateFromUri()メソッドが本当に便利です。

Windows.Storage.Streams.IRandomAccessStream random = await Windows.Storage.Streams.RandomAccessStreamReference.CreateFromUri(new Uri("http://...")).OpenReadAsync(); 

次に、後で使用するためにすべてのピクセルを読み取るためにストリームをデコードする必要があります。

Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(random); 
Windows.Graphics.Imaging.PixelDataProvider pixelData = await decoder.GetPixelDataAsync(); 

最後に、このような方法でピクセルバッファにアクセスできます。

byte[] bytes = pixelData.DetachPixelData(); 
+0

URLを渡さずに実際のBitmapImageオブジェクト自体を変換する方法はありますか?シナリオは説明するのが難しいです... – AymenDaoudi

+2

@AymenDaoudiグーグルでこれは不可能だと言っているMSDNのフォーラムから投稿を見つけました。もう一度見つけたらリンクを投稿しますhttps://social.msdn.microsoft.com/Forums/en-US/8974f4a4-f116-499b-ad00-e0c8a00a6494/convert-bitmapimage-to-byte?forum=winappswithcsharp – fillobotto

2

ええ、バイト[あまりにも複雑ではない、私はあなたがそれを得ることができると思います。私はそれがより簡単だったと思うが、そうではない。

http://codepaste.net/ijx28i

このコードは実際にはさらに一歩進んで、(シリアル化)Base64文字列に[]バイトを変換しますが、あなたは右、その余分なステップを無視することができますか?

// using System.Runtime.InteropServices.WindowsRuntime; 

private async Task<string> ToBase64(Image control) 
{ 
    var bitmap = new RenderTargetBitmap(); 
    await bitmap.RenderAsync(control); 
    return await ToBase64(bitmap); 
} 

private async Task<string> ToBase64(WriteableBitmap bitmap) 
{ 
    var bytes = bitmap.PixelBuffer.ToArray(); 
    return await ToBase64(bytes, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight); 
} 

private async Task<string> ToBase64(StorageFile bitmap) 
{ 
    var stream = await bitmap.OpenAsync(Windows.Storage.FileAccessMode.Read); 
    var decoder = await BitmapDecoder.CreateAsync(stream); 
    var pixels = await decoder.GetPixelDataAsync(); 
    var bytes = pixels.DetachPixelData(); 
    return await ToBase64(bytes, (uint)decoder.PixelWidth, (uint)decoder.PixelHeight, decoder.DpiX, decoder.DpiY); 
} 

private async Task<string> ToBase64(RenderTargetBitmap bitmap) 
{ 
    var bytes = (await bitmap.GetPixelsAsync()).ToArray(); 
    return await ToBase64(bytes, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight); 
} 

private async Task<string> ToBase64(byte[] image, uint height, uint width, double dpiX = 96, double dpiY = 96) 
{ 
    // encode image 
    var encoded = new InMemoryRandomAccessStream(); 
    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, encoded); 
    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, height, width, dpiX, dpiY, image); 
    await encoder.FlushAsync(); 
    encoded.Seek(0); 

    // read bytes 
    var bytes = new byte[encoded.Size]; 
    await encoded.AsStream().ReadAsync(bytes, 0, bytes.Length); 

    // create base64 
    return Convert.ToBase64String(bytes); 
} 

private async Task<ImageSource> FromBase64(string base64) 
{ 
    // read stream 
    var bytes = Convert.FromBase64String(base64); 
    var image = bytes.AsBuffer().AsStream().AsRandomAccessStream(); 

    // decode image 
    var decoder = await BitmapDecoder.CreateAsync(image); 
    image.Seek(0); 

    // create bitmap 
    var output = new WriteableBitmap((int)decoder.PixelHeight, (int)decoder.PixelWidth); 
    await output.SetSourceAsync(image); 
    return output; 
} 

これは重要な部分だった:

var bytes = (await bitmap.GetPixelsAsync()).ToArray(); 

は、あなたがそれを文脈を見て楽しむかもしれないと思いました。

幸運のベスト。

関連する問題