私はC#WindowsPhoneプログラミングをするのは初めてです。
一言で言えば、私は現在、次のようなアプリを構築しています。
ロードimage A
ロードimage B
次にロードしますimage C
次に、これら3つの画像を使用して、後処理を行います。
私のイメージBとイメージCはContent
、プロジェクト内と同じようにビルドされます。画像Aはギャラリーから選択されるか、カメラを介して撮影されます。または、画像Aが分離ストレージからロードされていると単純に想定できます。
非同期画像の読み込みが原因と思われる問題が発生しています。
これが私のコードです:
...
// I intend to load the 3 pictures by calling the method: LoadImage(int id) and LoadCImage();
else if (ListBox.SelectedIndex == 0)
{
Debug.WriteLine("Selected 0");
PhotoProcessor pp = new PhotoProcessor();
WriteableBitmap imageA = new WriteableBitmap(AImage);
WriteableBitmap imageB = LoadImage(0);
WriteableBitmap imageC = LoadCImage();
WriteableBitmap mix = pp.Mix(pp.CalcAverageColour(0), imageA, imageB, imageC);
resultPic.Source = mix;
}
...
と:
private WriteableBitmap LoadImage(int id)
{
//String uriString = "/Assets/img0.jpg";
//BitmapImage img = new BitmapImage(new Uri(uriString, UriKind.Relative));
BitmapImage img = new BitmapImage();
img.CreateOptions = BitmapCreateOptions.None;
//img.SetSource(Application.GetResourceStream(new Uri("/Assets/facetemplate0.jpg", UriKind.Relative)).Stream);
img.UriSource = new Uri("/Assets/img" + id + ".jpg", UriKind.Relative);
//img.UriSource = new Uri(uriString, UriKind.Relative);
return new WriteableBitmap(img);
}
private WriteableBitmap LoadCImage()
{
//BitmapImage img = new BitmapImage(new Uri("/Assets/imgC.jpg", UriKind.Relative));
BitmapImage bmp = new BitmapImage();
bmp.CreateOptions = BitmapCreateOptions.None;
//img.SetSource(Application.GetResourceStream(new Uri("/Assets/imgC.jpg", UriKind.Relative)).Stream);
bmp.UriSource = new Uri("/Assets/imgC.jpg", UriKind.Relative);
return new WriteableBitmap(bmp);
}
今私の質問は:
このコードを実行しようとすると、Null参照例外がスローされます。これは、関数mix
が画像ABおよびCを読み込めないためです(この画像の読み込みは非同期です)。
mix
これらの画像を順番に読み込んでから関数に渡す方法があるのでしょうか。
私が試したこと:
このすばらしいブログ投稿をチェックすることで、画像を同期的にロードする方法があることがわかりますが、コード全体でわかるように、ブログ投稿のように使用しようとしまし
SetSource(stream)
たが、残念ながら同じNullリファレンスを取得しました例外。私もその
EventHandler
方法を考えましたが、この場合は良い考えではないと思います。実装EventHandler
すると、(擬似コード)のようになりますか?imageA_Opened() { LoadImageB += imageB_Opened(); } imageB_Opened() { LoadImageC += imageC_Opened(); } imageC_Opened() { PhotoProcessor pp = new PhotoProcessor(); pp.Mix(averageColour, A, B, C); }
私は正しいですか?