В моем приложении 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
Применение фильтров кажется довольно простым. Почему это не так?
В какой теме вы, когда называете это? –
Хмм, оба GetImageAcceptButton_Click() и GetCroppedBitmapAsync() - это асинхронные вызовы, поэтому каждый из них запускается на своем (рабочем) потоке. – jerry
Это предположение неправильно, я боюсь. Вероятно, вы используете поток пользовательского интерфейса/диспетчера. Async не означает одновременный, это просто означает, что завершение метода может возникнуть позже. Чтобы фактически опубликовать работу в пуле потоков, вызываемый метод должен сделать это явно (например, с помощью Task.Run). Таким образом, в принципе всегда существует синхронная часть, начинающаяся с асинхронного метода. Обычно он становится асинхронным при первом «ожидании». Что-то нужно иметь в виду. –