3

Web カメラから画像フレームをキャプチャしていますが、それらを WPF の画像コントロールに設定すると、空白に見えます。

私が使用しているライブラリは Bitmap を返すので、それを BitmapImage に変換し、Dispatcher を介して Image コントロールのソースを BitmapImage に設定します。

void OnImageCaptured(Touchless.Vision.Contracts.IFrameSource frameSource, Touchless.Vision.Contracts.Frame frame, double fps)
    {
        image = frame.Image; // This is a class variable of type System.Drawing.Bitmap 
        Dispatcher.Invoke(new Action(UpdatePicture));
    }

    private void UpdatePicture()
    {
        imageControl.Source = null;
        imageControl.Source = BitmapToBitmapImage(image);
    }

    private BitmapImage BitmapToBitmapImage(Bitmap bitmap)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            bitmap.Save(ms, ImageFormat.Png);
            ms.Position = 0;
            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            bi.StreamSource = ms;
            bi.EndInit();
            return bi;
        }
    }

私の Image コントロールの XAML 宣言は、可能な限り一般的です。

<Image x:Name="imageControl" HorizontalAlignment="Left" Height="100" Margin="94,50,0,0" VerticalAlignment="Top" Width="100"/>

イメージ コントロールに何も表示されません。実行時エラーはありません。私は何を間違っていますか?
どうもありがとうございました!

4

2 に答える 2

3

画像を一時的な MemoryStream に書き込む代わりに、次のように呼び出してBitmapから直接変換することもできます。BitmapSourceImaging.CreateBitmapSourceFromHBitmap

private void UpdatePicture()
{
    imageControl.Source = Imaging.CreateBitmapSourceFromHBitmap(
        image.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
        BitmapSizeOptions.FromEmptyOptions());
}
于 2013-03-06T20:10:33.483 に答える
3

bi.CacheOption = BitmapCacheOption.OnLoadBitmapImage を作成するときに設定する必要があります。それがないと、ビットマップは遅延してロードされ、ストリームは UI がそれを要求するまでに閉じられます。Microsoft は、BitmapImage.CacheOptionのドキュメントでこれを指摘しています。

于 2013-03-06T19:35:53.103 に答える