3

FileOpenPicker から画像を読み込んで WritableBitmap に保存して、後で操作しようとしています。動作しますが、高解像度の画像 (たとえば jpg 2592x3888 ) を読み込むと、アプリがクラッシュします。また、大きな画像を処理するには時間がかかりすぎます。だから私の質問は、ここで何が間違っているのですか? 最善のアプローチは何ですか?


StorageFile file = args.Files[0];
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read))
{
    App.context.Image = new WriteableBitmap(1, 1);
    stream.Seek(0);
    int width = (int)Frame.ActualWidth;
    int height = (int)Frame.ActualHeight;
    App.context.Image = await BitmapFactory.New(1, 1).FromStream(stream);
    App.context.Image = App.context.Image.Resize(width, height, WriteableBitmapExtensions.Interpolation.NearestNeighbor);
    this.Frame.Navigate(typeof(RecognizingPage));
}

PS: これは実際に機能するバージョンです。この幅と高さは使用しません。

4

1 に答える 1

0

以下のコードを使用して、画像を低解像度にデコードできます。

using (var storageStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, storageStream);
var pixelStream = yourWriteableBitmap.PixelBuffer.AsStream();
var pixels = new byte[pixelStream.Length];
await pixelStream.ReadAsync(pixels, 0, pixels.Length);

encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)yourWriteableBitmap.PixelWidth, (uint)yourWriteableBitmap.PixelHeight, 48, 48, pixels);
await encoder.FlushAsync();
}

詳細については、この質問を参照してください: WriteableBitmap SaveJpeg missing for universal apps

于 2014-09-26T20:42:22.360 に答える