Неверный указатель на 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();
....
}