1

我正在使用诺基亚成像 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();

因此,如果我对所有内容都理解得很好,那么应用程序就会崩溃,因为传递了某种无效的指针,但它有效的位图 - 或者至少它的大小是正确的,所以我猜,数据也已经传递了.

无论如何,这是堆栈跟踪

   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)
4

1 回答 1

4

您没有为 FilterEffect 设置源图像,而是出于某种原因将源流直接传递到目标WriteableBitmap。

当您启动 RenderAsync 操作时,FilterEffect Source 属性为空,这就是导致异常的原因。您应该将图像源传递给 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();
    ....
}
于 2014-03-27T20:09:11.830 回答