web-dev-qa-db-fra.com

conversion rapide de Bitmap en BitmapSource wpf

J'ai besoin de dessiner une image sur le composant Image à 30 Hz. J'utilise ce code:

public MainWindow()
    {
        InitializeComponent();

        Messenger.Default.Register<Bitmap>(this, (bmp) =>
        {
            ImageTarget.Dispatcher.BeginInvoke((Action)(() =>
            {
                var hBitmap = bmp.GetHbitmap();
                var drawable = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                  hBitmap,
                  IntPtr.Zero,
                  Int32Rect.Empty,
                  BitmapSizeOptions.FromEmptyOptions());
                DeleteObject(hBitmap);
                ImageTarget.Source = drawable;
            }));
        });
    }

Le problème est qu'avec ce code, mon utilisation du processeur est d'environ 80% et, sans la conversion, elle est d'environ 6%.

Alors pourquoi convertir un bitmap est si long?
Existe-t-il une méthode plus rapide (avec un code dangereux)?

17
Epitouille

Voici une méthode qui (selon mon expérience) est au moins quatre fois plus rapide que CreateBitmapSourceFromHBitmap.

Il nécessite que vous définissiez le PixelFormat correct du BitmapSource résultant.

public BitmapSource Convert(System.Drawing.Bitmap bitmap)
{
    var bitmapData = bitmap.LockBits(
        new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
        System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat);

    var bitmapSource = BitmapSource.Create(
        bitmapData.Width, bitmapData.Height,
        bitmap.HorizontalResolution, bitmap.VerticalResolution,
        PixelFormats.Bgr24, null,
        bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride);

    bitmap.UnlockBits(bitmapData);
    return bitmapSource;
}
33
Clemens