1

nokia イメージング SDK 1.1 を使用してイメージング アプリに取り組んでいます。かなり単純に見えるタスク (ユーザーが画像を選択し、それにいくつかのフィルターを適用する) が、現在 2 日間ブロックされています。何百もの行を書き、すべての Nokia Dev Samples を確認しました (ほとんどの場合、非常によく構成されていますが、私のようなイメージング 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 プロパティが null になり、これが例外の原因です。画像ソースを FilterEffect コンストラクターに渡すか、その Source プロパティを設定する必要があります。

画像データを含む System.IO.Stream があるので、StreamImageSource をお勧めします。

概念的には、次のように考えることができます。

選択したフォト ストリーム -> 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 に答える