BitmapImageオブジェクトをUWPのバイト配列に変換するにはどうすればよいですか?以前のWinRTバージョンでも簡単に実現できましたが、成功しなかったのですが、解決策の1つはanswerのようなWriteableBitmap
を使用することでしたが、現在のバージョンのUWPではWriteableBitmap BitmapImageを使用することはできません。UWPでBitmapImageをバイト配列に変換する
答えて
イメージ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();
URLを渡さずに実際のBitmapImageオブジェクト自体を変換する方法はありますか?シナリオは説明するのが難しいです... – AymenDaoudi
@AymenDaoudiグーグルでこれは不可能だと言っているMSDNのフォーラムから投稿を見つけました。もう一度見つけたらリンクを投稿しますhttps://social.msdn.microsoft.com/Forums/en-US/8974f4a4-f116-499b-ad00-e0c8a00a6494/convert-bitmapimage-to-byte?forum=winappswithcsharp – fillobotto
ええ、バイト[あまりにも複雑ではない、私はあなたがそれを得ることができると思います。私はそれがより簡単だったと思うが、そうではない。
このコードは実際にはさらに一歩進んで、(シリアル化)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();
は、あなたがそれを文脈を見て楽しむかもしれないと思いました。
幸運のベスト。
- 1. PNG圧縮バイト配列をBMPバイト配列に変換する
- 2. C#バイト配列に変換
- 3. NSStringをバイト配列に変換する
- 4. D3DImageをバイト配列に変換する
- 5. バイト配列をpngに変換する
- 6. int16をバイト配列に変換する
- 7. バイナリをバイトに変換する[]配列
- 8. C#でバイト配列をshort配列に変換する
- 9. BitmapImageをsilverlight4のバイト配列に変換するにはどうすればよいですか?
- 10. サンプルを含む配列をバイト配列に変換する
- 11. バイト配列をint配列に変換する方法は?
- 12. バイト配列のExcelファイルをバイト配列のPDFファイルに変換する
- 13. バイト配列をPNG/JPGに変換
- 14. バイト配列を文字列に変換するには?
- 15. バイト配列を文字列に変換するには?
- 16. Cでバイト配列をdoubleに変換するには?
- 17. Javaで.mp4ビデオをバイト配列に変換するには?
- 18. バイト配列をイメージに変換する:パラメータが無効です
- 19. F#:文字列をバイト配列に変換する
- 20. SOAPリクエスト。文字列をバイト配列に変換する
- 21. バイト配列をBase64に変換するandroidの文字列
- 22. バイナリ文字列をバイト配列に変換する
- 23. C++ UTFバイト配列を文字列に変換する
- 24. 文字列をバイト配列に変換する
- 25. luaでバイト配列をdoubleに変換する
- 26. VB6で整数をバイト配列に変換する
- 27. go32でint32をバイト配列に変換する
- 28. 4バイト配列をJavaでfloatに変換する方法
- 29. Monoでビットマップをバイト配列に変換する方法
- 30. C#でバイト配列をint配列に変換する際のエラー
どのようにBitmapImageを取得しますか? URLまたは何から? – fillobotto
@fillobotto:URLから、ウェブのURL。 – AymenDaoudi
私は空白のUWPプロジェクトで私のために働いて答えを精緻化しました – fillobotto