Неверный указатель на Nokia.Graphics.Imaging.BitmapRender.RenderAsync()

Я работаю над приложением для работы с изображениями, используя nokia imaging SDK 1.1. Задача, кажущаяся довольно простой (пусть пользователь выбирает изображение и применяет к нему несколько фильтров), в настоящее время блокирует меня на 2 дня. Я написал сотни строк и просмотрел все образцы Nokia Dev (которые, в большинстве случаев, очень хорошо продуманы, но слишком сложны для начинающего разработчика SDK, такого как я), но я всегда получаю следующее исключение:

{System.NullReferenceException: Invalid pointer at Nokia.Graphics.Imaging.BitmapRenderer.RenderAsync()

Вот код (я сократил часть, где передаются фильтры, поэтому для простоты передается только пустой FilterEffect):

 PhotoChooserTask task = new PhotoChooserTask();
 task.Completed += async (result,choosen) =>
     {
         Stream stream = choosen.ChosenPhoto;
         BitmapImage bitmapImage = new BitmapImage();
         bitmapImage.SetSource(stream);
         WriteableBitmap bitmap = new WriteableBitmap(bitmapImage);
         WriteableBitmapRenderer renderer = new WriteableBitmapRenderer(new FilterEffect(), bitmap, OutputOption.PreserveAspectRatio);
             await renderer.RenderAsync();
     };
 task.ShowCamera = true;
 task.Show();

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

Во всяком случае, вот трассировка стека

   at Nokia.Graphics.Imaging.BitmapRenderer.RenderAsync()
at Nokia.Graphics.Imaging.WriteableBitmapRenderer.<<RenderAsync>b__0>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at RealtimeFilterDemo.MainPage.<<ShutterButton_Tap>b__1a>d__1c.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__0(Object state)

1 ответ

Решение

Вы не устанавливаете исходное изображение для FilterEffect, а вместо этого по какой-то причине передаете исходный поток непосредственно в целевой WriteableBitmap.

Когда вы запускаете операцию RenderAsync, свойство FilterEffect Source имеет значение null, и именно это вызывает исключение. Вы должны передать источник изображения либо в конструктор FilterEffect, либо установить его свойство Source.

Я рекомендую StreamImageSource, поскольку у вас есть System.IO.Stream с данными изображения.

Концептуально, это как думать об этом:

выбранный поток фотографий -> StreamImageSource -> FilterEffect -> WriteableBitmapRenderer -> записываемое растровое изображение

И более конкретно:

using(var streamSource = new StreamImageSource(stream))
using(var filterEffect = new FilterEffect(streamSource, filters))
using(var writeableBitmapRenderer = new WriteableBitmapRenderer(filterEffect, writeableBitmap))
{
    await writeableBitmapRenderer.RenderAsync();
    ....
}
Другие вопросы по тегам