さて、wpf 画像オブジェクトがあり、ライブ画像が表示されます。そのため、タイマーを使用して画像を更新しました。
public void LoadLiveImage()
{
System.Windows.Media.PixelFormat pf = PixelFormats.Bgr24;
int stride = 4 * ((24 * cameraFrame.img_width + 31) / 32);
BitmapSource bmpImage= BitmapSource.Create(cameraFrame.img_width, cameraFrame.img_height, cameraFrame.img_width, cameraFrame.img_height, pf, null, cameraFrame.img_pixel, stride);
RemoteCameraImage.Source = bmpImage;
}
void dispatcherTimer_Tick(object sender, EventArgs e)
{
LoadLiveImage();
}
問題ありません。これは正常に機能しています。しかし、これをスレッドに移動しようとしましたが、画像が表示されません。
private void showLiveImage()
{
while (this.isCameraViewOpen)
{
if (RemoteCameraImage.Dispatcher.CheckAccess())
{
System.Windows.Media.PixelFormat pf = PixelFormats.Bgr24;
int stride = 4 * ((24 * cameraFrame.img_width + 31) / 32);
BitmapSource bmpImage = BitmapSource.Create(cameraFrame.img_width, cameraFrame.img_height, cameraFrame.img_width, cameraFrame.img_height, pf, null, cameraFrame.img_pixel, stride);
RemoteCameraImage.Source = bmpImage;
System.Threading.Thread.Sleep(5);
}
else
this.RemoteCameraImage.Dispatcher.Invoke(DispatcherPriority.Normal, new ImageUpdater(this.showLiveImage));
}
}
showLiveImage はスレッドとして実行されています。画像は受信しており、問題ありません。img_pixel 配列を bmp ファイルに保存してテストしたところ、ファイルが生成されました。画像が表示されないだけです。そこで、ソースが割り当てられた後に表示されるメッセージボックスを配置すると、 Image オブジェクトで画像を見ることができます。SOスリープ時間を増やしたのが問題だと思いますが、画像もリフレッシュされません。何が問題になる可能性がありますか?
編集:画像を更新していたコードを別の関数に移動した後、正常に動作します。そして、すべて正常に動作するように呼び出す代わりに、BeginInvoke() を使用しました。