0

У меня трудное время конвертирования кода SDK 2.0 с изображением люмисии в SDK3.0 ниже конкретного случая. Я использовал для увеличения/уменьшения качества изображения JPG-файл с помощью ниже кода в Windows Phone 8.1 RT приложения:Не удается порт Lumia imaging SDK2.0 to SDK 3.0 (UWP)

using (StreamImageSource source = new StreamImageSource(fileStream.AsStreamForRead())) 
        { 
         IFilterEffect effect = new FilterEffect(source); 
         using (JpegRenderer renderer = new JpegRenderer(effect)) 
         { 
          renderer.Quality = App.COMPRESSION_RATIO/100.0; // higher value means better quality 
          compressedImageBytes = await renderer.RenderAsync(); 
         } 
        } 

Теперь, так как FilterEffect класс был заменен в SDK 3.0 с EffectList(), я изменил код

using (BufferProviderImageSource source = new BufferProviderImageSource(fileStream.AsBufferProvider())) 
       { 
        using (JpegRenderer renderer = new JpegRenderer()) 
        { 
         IImageProvider2 source1 = new EffectList() { Source = source }; 
         renderer.Source = source1;      
         renderer.Quality = App.COMPRESSION_RATIO/100.0; 
         try 
         { 
          var img = await renderer.RenderAsync(); 
         } 
         catch (Exception ex) 
         { 
          ; 
         } 
        } 
       } 

Я получаю исключение InvalidCastException. Я попробовал несколько комбинаций, но не повезло.

+0

Где вы получаете недопустимое исключение произнесения? Когда вы предоставляете, то есть называть renderAsync()? Или же произойдет исключение даже раньше? –

+0

На самом деле я просто попытался рендеринга с пустым списком и работал без проблема, поэтому я беру это обратно. Возможно, это что-то с вашим потоком? Если вы просто создаете источник ColorImageSource в качестве источника, будет ли он работать для вас? –

ответ

0

Я действительно не знаю, что происходит с InvalidCastException, мы можем продолжить эту дискуссию в комментариях, так как это, скорее всего, понадобится немного назад и вперед.

Это означает, что вы можете продолжать без списка эффектов и эффектов цепи обычным способом. Таким образом, чтобы переписать сценарий:

using (var soruce = new StreamImageSource(...)) 
using (var renderer = new JpegRenderer(source)) 
{ 
    renderer.Quality = App.COMPRESSION_RATIO/100.0; 
    var img = await renderer.RenderAsync(); 
} 

Если вы хотите добавить эффект (например, в CarttonEffect), просто сделать:

using (var soruce = new StreamImageSource(...)) 
using (var caroonEffect = new CartoonEffect(source)) 
using (var renderer = new JpegRenderer(caroonEffect)) 
{ 
    renderer.Quality = App.COMPRESSION_RATIO/100.0; 
    var img = await renderer.RenderAsync(); 
} 

и так далее. Если у вас были эффекты A, B, C и D, просто создайте цепочку Source -> A -> B -> C -> D -> JpegRenderer.

+0

Я отредактировал ответ и удалил бит о пустом EffectList, поскольку это кажется для работы без проблем. –

+0

Спасибо, Дэвид за ответ. Я получаю это исключение при вызове renderAsync(). Я не хочу добавлять никакого эффекта, но чтобы уменьшить качество изображения, которое я смог достичь, установив свойство Quality. Я попробовал решение, которое вы разместили выше (без эффе ct), но не работает. Получение системы.Исключение: компонент не найден. (Исключение из HRESULT: 0x88982F50) – harshbodhi

+0

Если вы не хотите применять какие-либо эффекты к изображению, вам не нужен EffectList. В соответствии с компонентом не может быть найдено исключение, которое некоторое время выглядит как ошибка VS. Вы запускаете Visual Studio 2013 Update 4? Рассматривали ли вы обновление/обновление? –

0

Я нахожусь на версии сообщества VS 2015. В то время как копание вокруг этого, я получил ниже кода, который работает точно так же, как SDK 2.0. Все, что я сделал, было указано Размер JpegRenderer. Он работает для всех пейзажных изображений, но не позволяет преобразовать портретные изображения в правильную ориентацию. Не исключение, но результатом портретного изображения является широко растянутый ландшафтный образ. Я инициализировал размер для портретных изображений до размера (765, 1024), но никакого эффекта.

using (JpegRenderer renderer = new JpegRenderer(source)) 
        { 
         renderer.Quality = App.COMPRESSION_RATIO/100.0; 

         try 
         { 
          var info = await source.GetInfoAsync(); 
          renderer.Size = new Size(1024, 765); 
          compressedImageBytes = await renderer.RenderAsync(); 

         } 
         catch (Exception ex) 
         { 
          new MessageDialog("Error while compressing.").ShowAsync(); 
         } 
        } 
+0

Чтобы проверить, можете ли вы удалить вызов GetInfoAsync()? Помимо этого не требуется в вашем фрагменте, он также устарел в Lumia Imaging SDK 3.0. Поэтому я просто хочу проверить, удалить его или получить другое исключение, если вы не совершаете этот вызов? –

+0

Что касается растяжки, что вы установили для OutputOpetion на JpegRenderer? Убедитесь, что у вас установлен «PreserveAspectRatio». Если изображение все еще растянуто, это может быть ошибкой. Не могли бы вы предоставить выходное изображение, чтобы я мог видеть, какое растяжение происходит? –

0

Извините, что в рабочем коде использовался BufferProviderImageSource вместо StreamImageSource. Ниже приведен фрагмент. Несколько пунктов здесь:

1) Если я не использую свойство Size, я получаю «Невозможно найти исключение».

2) GetInfoAsync(): Да, это было бесполезно для кода выше, но мне нужно использовать его, чтобы узнать, является ли изображение Пейзаж или Портрет, чтобы я мог инициализировать свойство размера результирующего изображения.

3) Если размер собственности выходит за рамки 1024х1024 для портретных изображения, которые я получаю исключение «Значение не попадает в ожидаемый диапазон»

Почему Lumia сделал эту версию так сложно. :(

var stream = FileIO.ReadBufferAsync(file); 

      using (var source = new BufferProviderImageSource(stream.AsBufferProvider())) 
      { 
       EffectList list = new EffectList() { Source = source }; 
       using (JpegRenderer renderer = new JpegRenderer(list)) 
       { 
        renderer.Quality = App.COMPRESSION_RATIO/100.0; 
        renderer.OutputOption = OutputOption.PreserveAspectRatio; 
        try 
        { 
         var info = await source.GetInfoAsync(); 
         double width = 0; 
         double height = 0; 
         if (info.ImageSize.Width > info.ImageSize.Height) //landscape 
         { 
          width = 1024; 
          height = 765; 
          if (info.ImageSize.Width < 1024) 
           width = info.ImageSize.Width; 
          if (info.ImageSize.Height < 765) 
           height = info.ImageSize.Height; 
         } 
         else //portrait.. 
         { 
          width = 765; 
          height = 1024; 
          if (info.ImageSize.Width < 765) 
           width = info.ImageSize.Width; 
          if (info.ImageSize.Height < 1024) 
           height = info.ImageSize.Height; 
         } 

         renderer.Size = new Size(width, height); 
         compressedImageBytes = await renderer.RenderAsync(); 
        } 
        catch (Exception ex) 
        { 
         new MessageDialog(ex.Message).ShowAsync(); 
        } 
       } 
      }