2015-03-10 2 views
1

В моем приложении WP8.1 я пытаюсь обрезать изображение, используя Lumia (ранее Nokia) Imaging SDK. изображение извлекается с помощью FileOpenPicker:Исключение при рендеринге изображения с использованием Lumia Imaging SDK

public async void ContinueFileOpenPicker(Windows.ApplicationModel.Activation.FileOpenPickerContinuationEventArgs args) { 
    if (args.Files.Count > 0) { 
     _stream = await args.Files[0].OpenAsync(Windows.Storage.FileAccessMode.Read); 
     _bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage(); 
     await _bitmapImage.SetSourceAsync(_stream); 
     SelectedImage.Source = _bitmapImage; 
    } 
    else { 
     Debug.WriteLine("Operation cancelled."); 
    } 
} 

Затем фильтр, применяемый в обработчике кнопки (после того, как пользователь выбрал кадрирование области; размеры только для целей тестирования):

private async void GetImageAcceptButton_Click(object sender, RoutedEventArgs e) { 
    await GetCroppedBitmapAsync(); 
} 

async public Task GetCroppedBitmapAsync() { 
    using (var source = new RandomAccessStreamImageSource(_stream)) { 
     using (var filterEffect = new FilterEffect(source)) { 
      var filter = new CropFilter(new Windows.Foundation.Rect(0, 0, 100, 100)); 
      filterEffect.Filters = new IFilter[] { filter }; 
      var target = new WriteableBitmap(50, 50); 
      using (var renderer = new WriteableBitmapRenderer(filterEffect, target)) { 
       await renderer.RenderAsync(); 
       SelectedImage.Source = target; 
      } 
     } 
    } 
} 

RenderAsync() вызова бросает исключение:

System.Runtime.InteropServices.COMException occurred 
HResult=-2147467259 
Message=Error HRESULT E_FAIL has been returned from a call to a COM component. 
Source=mscorlib 
ErrorCode=-2147467259 

Применение фильтров кажется довольно простым. Почему это не так?

+0

В какой теме вы, когда называете это? –

+0

Хмм, оба GetImageAcceptButton_Click() и GetCroppedBitmapAsync() - это асинхронные вызовы, поэтому каждый из них запускается на своем (рабочем) потоке. – jerry

+0

Это предположение неправильно, я боюсь. Вероятно, вы используете поток пользовательского интерфейса/диспетчера. Async не означает одновременный, это просто означает, что завершение метода может возникнуть позже. Чтобы фактически опубликовать работу в пуле потоков, вызываемый метод должен сделать это явно (например, с помощью Task.Run). Таким образом, в принципе всегда существует синхронная часть, начинающаяся с асинхронного метода. Обычно он становится асинхронным при первом «ожидании». Что-то нужно иметь в виду. –

ответ

1

Вы должны включить встроенную отладку и посмотреть окно вывода. В настоящее время отсутствует реальное сообщение об исключении (которое пытается быть более конкретным). Строки сообщения об исключении «контрабандируются» через границу вызова WinRT, официально передается только HRESULT (здесь, E_FAIL).

Это Silverlight 8.1 или универсальное приложение кстати?

Мое предположение заключается в том, что вам нужно искать/перематывать поток назад. Может быть, позиция завершена.

+0

Чтобы разработать, вы начинаете с передачи потока в элемент изображения. Вероятно, этот поток до конца дошел до конца. –

+0

Это универсальное приложение. Спасибо, ребята, это, похоже, ключ. Я добавил _stream.Seek (0) и избавился от исключения. Теперь изображение не отображается, но это может быть связано с неправильными (фиктивными) мерами, которые я использовал для этого. Необходимо поближе рассмотреть его во второй половине дня. Но это, похоже, исправило это. – jerry

+0

Подтверждено - теперь работает. Спасибо! – jerry