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; } }
单独只用deleteobject效果也不是特别好,最后再手动加个gc.collect(),内存没有再出现疯狂增长。
下一篇: 华硕zenfone 5拍照功能令人满意