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)?
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;
}