欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF Bitmap转成Imagesource的性能优化

程序员文章站 2022-04-04 08:29:17
之前有个需求是在WPF中生成二维码,用的是QRCoder。 QRCoder生成的是Bitmap,在wpf中需要转换成ImageSource才能显示。 之前的转换方式是: 之后客户用了一段时间,出现内存不足的情况,找了好久,才找到原来是这里特别耗内存,每生成一次会占用100多M。 研究了下,是因为没有 ......

之前有个需求是在wpf中生成二维码,用的是qrcoder。

qrcoder生成的是bitmap,在wpf中需要转换成imagesource才能显示。

之前的转换方式是:

 intptr hbitmap = qrcodeimage.gethbitmap();
 imagesource wpfbitmap = system.windows.interop.imaging.createbitmapsourcefromhbitmap(
                hbitmap,
                intptr.zero,
                int32rect.empty,
                bitmapsizeoptions.fromemptyoptions());

之后客户用了一段时间,出现内存不足的情况,找了好久,才找到原来是这里特别耗内存,每生成一次会占用100多m。

研究了下,是因为没有释放的问题。修改了下终于解决了这个问题。

        [dllimport("gdi32.dll", entrypoint = "deleteobject")]
        [return: marshalas(unmanagedtype.bool)]
        public static extern bool deleteobject([in] intptr hobject);

        public imagesource imagesourceforbitmap(bitmap bmp)
        {
            var handle = bmp.gethbitmap();
            try
            {
                imagesource newsource = imaging.createbitmapsourcefromhbitmap(handle, intptr.zero, int32rect.empty, bitmapsizeoptions.fromemptyoptions());

                deleteobject(handle);
                return newsource;
            }
            catch (exception ex)
            {
                deleteobject(handle);
                return null;
            }
        }

WPF Bitmap转成Imagesource的性能优化

单独只用deleteobject效果也不是特别好,最后再手动加个gc.collect(),内存没有再出现疯狂增长。