1

Я использую Lumia Imaging SDK ver 2.0 для обрезки изображений в приложении Windows Phone 8.1 RT. Код работает нормально, но JpegRenderer.RenderAsync() иногда выбрасывает InvalidOperationException, Operation is not valid due to the current state of the object.Lumia Imaging SDK JpegRenderer.RenderAsync InvalidOperationException

Эта проблема воспроизводится каждый раз с некоторыми изображениями и вызывает сбой приложения. Я использую следующий код для обрезки:

using (StorageFileImageSource inputImageSource = new StorageFileImageSource(inputImageFile)) 
{ 
    using (FilterEffect filterEffect = new FilterEffect(inputImageSource)) 
    { 
     // Create cropping filter. 
     List<IFilter> filters = new List<IFilter>(); 
     CropFilter cropFilter = new CropFilter(croppedImageSize); 
     filters.Add(cropFilter); 

     // Add filters to effects. 
     filterEffect.Filters = filters; 

     // Create renderer with above filters and render new image. 
     using (JpegRenderer renderer = new JpegRenderer(filterEffect)) 
     { 
       IBuffer croppedImage = await renderer.RenderAsync(); 
       return croppedImage.ToArray(); 
     } 
    } 
} 

я упомянул this resource и говорит JpegRenderer.RenderAsync() броски InvalidOperationException при изменении значения свойства фильтра в то время рендеринга в процессе. Я не изменяю значение свойства после его установки, тогда почему исключение выбрасывается?

+1

Каков размер, который вы передаете в CropFilter (croppedImageSize)? Урожай принимает размер в абсолютных координатах, а размер не должен быть больше изображения, иначе будет выбрано исключение. Я не могу сказать больше без каких-либо подробностей, но это может объяснить, почему это происходит для некоторых изображений. –

+0

Да, спасибо. Я понял. Я пропускал неправильные размеры, потому что получал неправильные значения из «BitmapDecoder» для изображений с данными EXIF. – Flipper

+0

@ DavidBožjak, я удалил «BitmapDecoder» и использовал «ImageProperties» для расчета высоты и ширины изображения. Но это дало мне новую проблему: «ImageProperties» работает для изображения только в том случае, если расширение сохраняется. Я сохраняю изображения после удаления их расширений. Следовательно, высота/ширина изображений, хранящихся в моем приложении, равна 0. Как это можно обойти? Я действительно не хочу использовать «BitmapDecoder»; должны открыть для этого полный поток. – Flipper

ответ

1

Я понял, что проблема, и как David сказал, я проходил неправильные размеры, которые были больше размера изображения. Я использовал BitmapDecoder.PixelHeight и BitmapDecoder.PixelWidth для расчета размеров.

Однако на некоторых изображениях, имеющих данные ориентации в данных EXIF, BitmapDecoder.PixelHeight дал ширину изображения и наоборот. Для этого мне пришлось использовать BitmapDecoder.OrientedPixelHeight и BitmapDecoder.OrientedPixelWidth, чтобы получить фактическую высоту и ширину изображения, с учетом ориентации изображения.

+1

Рад, что вы это поняли. Это абсолютно справедливо, но я просто хотел указать, что у Lumia Imaging SDK есть способ сообщить размер изображения: GetInfoAsync(): он возвращает объект ImageProviderInfo, который содержит свойство ImageSize. Поэтому, если вы * хотели *, вы могли бы получить размеры из sdk lumia imaging и не манипулировать двумя разными API. –

+0

@ DavidBožjak только что получил приглашение 'ImageProviderInfo.ImageSize' устарел. Есть ли какой-либо более новый метод для расчета размеров изображений? – Flipper

+1

Это устарело в Lumia Imaging SDK 3.0. Если я правильно помню (прошло много времени с тех пор, как я увидел Lumia imaging sdk 2.0 code), это правильный способ получить размер изображения в коде SDK2.0. –

 Смежные вопросы

  • Нет связанных вопросов^_^