文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>SilverLight搭建WCF聊天室详细过程(十一)发送图片

SilverLight搭建WCF聊天室详细过程(十一)发送图片

时间:2010-12-26  来源:fugitiver

        上一节为大家讲解了离线消息的收发过程,到此,文本消息的发送暂时完成,后面我们会讲到一些代码优化,这节内容应该是大家最关心的发送图片问题,SilverLight4版本相对以前版本有了很大改进,以前的版本只能访问我的文档之类的低限制文件夹,现在我们可以访问我们电脑上大部分文件夹,只是这种访问必须由用户产生选择文件对话窗,不能由程序隐式访问,不过,已经足够我们实现文件的上传和下载了。

        虽然我们无法序列化复杂控件,但是我们可以把图片等简单控件序列化称二进制流,这给图片,文件传输带来很大方便,本文就是利用图片的二进制序列化达到WCF传输目的。

        1.先看下流程图:

        流程图讲解:用户选择一个图片,调用WCF的picture()接口函数,从而访问服务端的picture()函数实现,如何返回图片我们下界会继续讲,同时我们要生成发送方的图片在RichTextBox显示,这样我们就不必再浪费资源从服务端返回,直接调用creatImage()函数把二进制流转换成图片,并添加到RichTextBox中。

        给出关键代码:

 

代码 private void btImageSend_Click(object sender, RoutedEventArgs e)//发送图片
        {
            operation.opd.Filter = "Image Files|*.jpg;*.bmp;*.png";
            if (operation.opd.ShowDialog() == true)
            {
                Stream stream = (Stream)operation.opd.File.OpenRead();
                byte[] bytes = new byte[stream.Length];
                stream.Read(bytes, 0, (int)stream.Length);
                //发送图片
                operation.prox.pictureAsync(tbChatName.Text.ToString(), bytes);
                //创建图片
                creatImage(operation.currentUserName, stream);
            }
        }

        private void creatImage(string sendUser, Stream stream)//创建图片
        {
            rMessage(sendUser, "", System.DateTime.Now.ToLongTimeString());//添加发送用户名和时间
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.SetSource(stream);//生成图片流
            Image image = new Image();
            image.Source = bitmapImage;//把图片赋值给图片作为图片源
            Paragraph paragraph = new Paragraph();//生成RichTextBox段落
            InlineUIContainer ui = new InlineUIContainer();//生成内联图片
            ui.Child = image;
            paragraph.Inlines.Add(ui);//内联图片添加到段落
            rtbReceiveContent.Blocks.Add(paragraph);//段落添加到富文本框
            rtbReceiveContent.SelectAll();//保证滚动条在最下方
        }

 

        思路,首先由用户选择要发送的图片,当发送图片确认后我们就可以打开文件流Stream stream = (Stream)operation.opd.File.OpenRead();
,从而在定义好的byte[]数组中我们写入图片数据流生成二进制数据流,最后将二进制数据流发送到服务端,同时调用客户端函数生成图片并显示到RichTextBox中,添加到RichTextBox控件中的过程,我们在前面介绍过<Paragraph>类,这个类表示一个段落,从而就可以把图片看成段落内容添加到Blocks集合中。

相关阅读 更多 +
排行榜 更多 +
我的武侠梦手游下载

我的武侠梦手游下载

角色扮演 下载
快乐连连看下载免费版

快乐连连看下载免费版

休闲益智 下载
泛滥死者布道手机版下载

泛滥死者布道手机版下载

角色扮演 下载