首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

【WPF】Bit地图转为Image控件Source效率,内存释放有关问题

2013-09-10 
【WPF】Bitmap转为Image控件Source效率,内存释放问题?背景:做了一个WPF程序,其中有一个Image的控件。通过相机

【WPF】Bitmap转为Image控件Source效率,内存释放问题?
背景:做了一个WPF程序,其中有一个Image的控件。通过相机采集实时图像(20帧左右),并返回给WPF程序一个Bitmap图像,通过Image控件来显示。

细节问题:我在WPF程序中定义了一个Timer,基本上也是一秒钟执行20多次,用来刷新Image中的图像,但是Image.Source不能够直接用Bitmap,所以在这里需要将其转换。

我在网上找了很多种方法,虽然能够实现,但是在效率和释放内存上面不能够兼顾。
代码如下:
主程序中的生成Bitmap

System.Drawing.Bitmap bmp = ImageAndBytes.ToGrayBitmap(ImageAndCurveSwitcherRecieveByte, ImageParmterSetting.ImageWidth, ImageParmterSetting.ImageHeight, 500 + ImageParmterSetting.ImageWidth * ImageParmterSetting.ImageHeight * i);
                                Image.Source = BitmapToBitmapSourceHelper.BitmapToBitmapSourceHelper.BitmapToBitmapSource(bmp);


转化代码:
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);

        public static IntPtr ptr;
        public static System.Windows.Media.Imaging.BitmapSource result;
        public static System.Windows.Media.Imaging.BitmapSource BitmapToBitmapSource(System.Drawing.Bitmap bitmap)
        {
            ptr = bitmap.GetHbitmap();
            result = null;
            result = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                ptr, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
            //release resource
            DeleteObject(ptr);

            return result;
        }


        public static BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap)
        {
            BitmapImage bitmapImage = new BitmapImage();

            using (System.IO.MemoryStream ms = new System.IO.MemoryStream())


            {
                bitmap.Save(ms, bitmap.RawFormat);
                bitmapImage.BeginInit();
                bitmapImage.StreamSource = ms;
                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapImage.EndInit();
                bitmapImage.Freeze();
            }

            return bitmapImage;
        }

        public static ImageSource ChangeBitmapToImageSource(Bitmap bitmap)
        {
            //Bitmap bitmap = icon.ToBitmap();
            IntPtr hBitmap = bitmap.GetHbitmap();
            ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                hBitmap,
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());

            if (!DeleteObject(hBitmap))
            {
                throw new System.ComponentModel.Win32Exception();
            }
            return wpfBitmap;
        }


代码中使用了三种方式来转换,如果Timer是每秒一次,那么能够正常的释放内存,但是如果将速度提高,那么在内存释放的操作上不能够正常的实现,程序占用内存会越来越高,但是如果立即降低频率,那么之前所占用的内存会立即释放掉。

 目前通过:
if (TimerTimes > 29) GC.Collect(); TimerTimes = 0; 


来释放内存,但是总是觉得不够好。

希望各位能给出点帮助建议,比如在WPF中显示Bitmap是否还有其他的方式,将Bitmap转化为Image控件能用的资源有没有其他方法,或者能够实现内存的有效清理……

不胜感激!!












WPF bitmap 内存释放 效率
[解决办法]
http://blog.sina.com.cn/s/blog_3f2c72ea0100srdg.html
[解决办法]
你可以试试DrawingSurface,也就是D3D那部分
[解决办法]
wpf里面轻量绘图可以使用DrawingVisual
http://msdn.microsoft.com/zh-cn/library/system.windows.media.drawingvisual(v=vs.100).aspx
楼主可以看看
[解决办法]
“通过相机采集实时图像”会不会跟这部分有关系?

热点排行