为了账号安全,请及时绑定邮箱和手机立即绑定

快速将位图转换为BitmapSource wpf

快速将位图转换为BitmapSource wpf

C#
慕的地10843 2019-10-21 10:45:23
我需要以Image30Hz的频率在组件上绘制图像。我使用此代码: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%。那为什么转换位图这么长呢?是否有更快的方法(使用不安全的代码)?
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

根据我的经验,这是一种比至少快四倍的方法CreateBitmapSourceFromHBitmap。


它要求您设置正确PixelFormat的结果BitmapSource。


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;

}


查看完整回答
反对 回复 2019-10-21
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

在克莱门斯回答之前,我回答了自己:


[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]

public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);


 WriteableBitmap writeableBitmap = new WriteableBitmap(1280, 1024, 96.0, 96.0, PixelFormats.Bgr24, null);

        public MainWindow()

        {

            InitializeComponent();


            ImageTarget.Source = writeableBitmap;


            Messenger.Default.Register<Bitmap>(this, (bmp) =>

            {

                ImageTarget.Dispatcher.BeginInvoke((Action)(() =>

               {

                    BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);

                    writeableBitmap.Lock();

                    CopyMemory(writeableBitmap.BackBuffer, data.Scan0,

                        (writeableBitmap.BackBufferStride * bmp.Height));

                    writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, bmp.Width, bmp.Height));

                    writeableBitmap.Unlock();

                    bmp.UnlockBits(data);

                }));

            });

        }

现在我的CPU使用率约为15%


查看完整回答
反对 回复 2019-10-21
  • 2 回答
  • 0 关注
  • 691 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信