3

Я пытаюсь загрузить изображения из FileOpenPicker и сохранить его в WritableBitmap, чтобы работать с ним позже. Он работает, но когда я загружаю изображение с высоким разрешением (например, jpg 2592x3888), мое приложение разбивается. И обработка больших изображений занимает слишком много времени. Поэтому мой вопрос: что я делаю неправильно здесь? Каков наилучший подход?Как обрабатывать фотографии с высоким разрешением в Windows Phone 8.1


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: Это действительно рабочая версия - я не буду использовать эту ширину и высоту.

+1

Nokia имеет библиотеку изображений высокого разрешения (возможно, это может помочь вам): http://developer.nokia.com/resources/library/ Lumia/imaging/working-with-high-resolution-photos.html –

+0

Спасибо, но «проблема с writeableBitmapEx» все еще здесь. В этой статье изображение загружается (и декодируется на меньший) BitmapImage. Я хотел бы загрузить его в WriteableBitmapEx. Есть ли простой и эффективный способ этого? WriteableBitmap не имеет DecodePixelWidth и Height :( –

ответ

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