c# image转换为bitmap_WPF Image控件中的ImageSource与Bitmap的互相转换

本文记录了在WPF应用中遇到的问题,如何将C#的Image转换为Bitmap,并设置给WPF Image控件的Source属性。同时,解决在使用Timer更新图片时遇到的线程访问异常,通过Dispatcher.Invoke异步更新图片。
摘要由CSDN通过智能技术生成
 [DllImport("gdi32.dll", SetLastError = true)]        private static extern bool DeleteObject(IntPtr hObject);         ///         /// 从bitmap转换成ImageSource        ///         ///         ///         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;        }

最近想弄个基于WPF的动态影集,主要思想就是一个Image控件显示图片,添加一个Timer定时设置每秒更新一张图片。在弄的过程中发现一些小问题,在这里记下来留着以后查看!

  1:设置Iamge的Source属性的时候,在前台Xaml文件可以设置为路径的字符串格式,但是在后台cs文件需要构造一个Bitmap的实例赋值给Image的Source属性,还要注意实例化Uri类的时候需要传进来一个UriKind.Relative的枚举。如下:

              Uri uri = new Uri("/Images/" + curImage,UriKind.Relative);
BitmapImage bitmap = new BitmapImage(uri);
myImage.Source = bitmap;

  2:实现图片每秒更新的时候,需要注意不能用一个timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);事件直接实现更新,会报出“调用线程无法访问此对象,因为另外一个线程拥有此对象”的异常。

                                     a3c32349ca7c8d3bb94143fa24c129d3.png

  这时的解决方案是定义一个委托,用异步Dispatcher.Invoke()实现!如下所示:

    private delegate void TimerDispatcherDelegate();        private void autoShow_Click(object sender, RoutedEventArgs e)        {            timer = new Timer();            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);            timer.Interval = 1000;            timer.Enabled = true;            timer.Start();        }        void timer_Elapsed(object sender, ElapsedEventArgs e)        {            this.Dispatcher.Invoke(DispatcherPriority.Normal, new TimerDispatcherDelegate(UpdataImage));        }void UpdataImage()        {            NextImage(imageList, imageIndex, curImage, uri);        }
     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值