我正在使用诺基亚成像SDK 1.1开发成像应用程序。看似相当简单的任务(让用户选择图像并对其应用一些过滤器)目前阻止我2天。 我已经写了数百行,并回顾了所有的诺基亚开发样本(大多数情况下,它都是非常好的,但对于像我这样的成像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();
因此,如果我理解了一切,应用程序崩溃了,因为传递了某种无效指针,但它有效的位图 - 或者至少它的大小是正确的,所以我猜,数据已经传递,以及。
无论如何,这是stacktrace
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)
答案 0 :(得分:4)
您没有为FilterEffect设置源图像,而是出于某种原因将源流直接传递到目标 WriteableBitmap。
当您启动RenderAsync操作时,FilterEffect Source属性为null,这就是导致异常的原因。您应该将图像源传递给FilterEffect构造函数,或者设置其Source属性。
我推荐一个StreamImageSource,因为你有一个带有图像数据的System.IO.Stream。
从概念上讲,这就是如何思考它:
选择的照片流 - &gt; StreamImageSource - &gt; FilterEffect - &gt; WriteableBitmapRenderer - &gt;可写位图
更具体地说:
using(var streamSource = new StreamImageSource(stream))
using(var filterEffect = new FilterEffect(streamSource, filters))
using(var writeableBitmapRenderer = new WriteableBitmapRenderer(filterEffect, writeableBitmap))
{
await writeableBitmapRenderer.RenderAsync();
....
}