我需要以 30Hz 的频率在图像组件上绘制图像。我使用以下代码:public MainWindow() { InitializeComponent(); Messenger.Default.Register
我需要以 30Hz 的频率在组件上绘制图像。我 Image
使用以下代码:
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;
}));
});
}
问题是,使用此代码,我的 CPU 使用率约为 80%,而如果没有转换,则约为 6%。
那么为什么转换位图这么长?
有没有更快的方法(使用不安全的代码)?
根据我的经验,这里有一种方法,它至少比 CreateBitmapSourceFromHBitmap
.
生成的 BitmapSource 的 PixelFormat
正确性
public static 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;
}