前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WPF Image控件中的ImageSource与Bitmap的互相转换

WPF Image控件中的ImageSource与Bitmap的互相转换

作者头像
zls365
发布2020-12-29 11:50:12
1.5K0
发布2020-12-29 11:50:12
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全
代码语言:javascript
复制
 [DllImport("gdi32.dll", SetLastError = true)]
        private static extern bool DeleteObject(IntPtr hObject);
 
        /// <summary>
        /// 从bitmap转换成ImageSource
        /// </summary>
        /// <param name="icon"></param>
        /// <returns></returns>
        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的枚举。如下:

代码语言:javascript
复制
              Uri uri = new Uri("/Images/" + curImage,UriKind.Relative);
            BitmapImage bitmap = new BitmapImage(uri);
            myImage.Source = bitmap;

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

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

代码语言:javascript
复制
    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);
        }
代码语言:javascript
复制
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档