微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Silverlight/WPF 截图保存功能的实现---我得用这个方式试下,把项目里的功能修改下

Silverlight/WPF 截图保存功能的实现

时间:2011-08-18 06:08 来源:新浪博客 作者:刘欢博客点击: 1491次
图片截取和压缩主要通过WriteableBitmap 这个类实现的,对它进行相应的变换就可以实现截取和压缩。 由WriteableBitmap转换成byte我调用了FluxJpeg这个三方的。 这个在博客园上有很多说明,在博客园上搜索FluxJpeg就可以找的到 用户点击保存图片按钮的时候,触发一个事件: private void btnSavePic_Click( object sender
  

  图片截取和压缩主要通过WriteableBitmap 这个类实现的,对它进行相应的变换就可以实现截取和压缩。 由WriteableBitmap转换成byte我调用了FluxJpeg这个三方的。

  这个在博客园上有很多说明,在博客园上搜索“FluxJpeg”就可以找的到

  用户点击保存图片按钮的时候,触发一个事件:

        private  void btnSavePic_Click( object sender, RoutedEventArgs e)
        {
            WriteableBitmap bitmap =  new WriteableBitmap(parentCanvas,  null);  //声明一个WriteableBitmap对象,参数parentCanvas是绘制图形的区域
             if (bitmap !=  null)
            {
                SaveFileDialog saveDlg =  new SaveFileDialog(); //调用保存文件对话框
                saveDlg.Filter =  "JPEG Files (*.jpeg)|*.jpeg";
                saveDlg.DefaultExt =  ".jpeg";
                 if (saveDlg.ShowDialog().Value)
                {
                     using (Stream fs = saveDlg.OpenFile())
                    {
                        savePicToFile(bitmap, fs);   //调用savePicToFile方法保存图片,下面会介绍这个方法的实现
                        MessageBox.Show( string.Format( "图片已经保存到“{0}”",saveDlg.SafeFileName));
                    }
                }
            }

        } 

  下面是savePicToFile方法的实习,会用到FluxJpeg组件:

         private  void savePicToFile(WriteableBitmap bitmap, Stream fs)
        {
             int width = bitmap.PixelWidth;  
             int height = bitmap.PixelHeight;
             int bands = 3;
             byte[][,] raster =  new  byte[bands][,];   //用来保存bitmap中每个像素点的RGB分量的数组
             for ( int i = 0; i < bands; i++)
            {
                raster[i] =  new  byte[width, height];
            }
             for ( int row = 0; row < height; row++)
            {
                 for ( int column = 0; column < width; column++)
                {
                     int pixel = bitmap.Pixels[width * row + column];
                    raster[0][column, row] = ( byte)(pixel >> 16);   //R
                    raster[1][column, row] = ( byte)(pixel >> 8);    //G
                    raster[2][column, row] = ( byte)pixel;           //B
                }
            }
            FluxJpeg.Core.ColorModel model =  new FluxJpeg.Core.ColorModel { colorspace = FluxJpeg.Core.ColorSpace.RGB };
            FluxJpeg.Core.Image img =  new FluxJpeg.Core.Image(model, raster);

             //使用jpeg编码方式
            MemoryStream stream =  new MemoryStream();
            FluxJpeg.Core.Encoder.JpegEncoder encoder =  new FluxJpeg.Core.Encoder.JpegEncoder(img, 100, stream);
            encoder.Encode();
             //回到stream的起始
            stream.Seek(0, SeekOrigin.Begin);
             //读取stream中的内容放入binaryData中,然后通过fs参数写到本地磁盘上,图片保存完成。
             byte[] binaryData =  new  byte[stream.Length];
             long bytesRead = stream.Read(binaryData, 0, ( int)stream.Length);
            fs.Write(binaryData, binaryData.Length);
        } 

  这样,我们就可以成功的将用户在canvas中绘制的内容作为一张图片保存起来了。

  本文来自刘欢博客斋的博客,原文地址:http://blog.sina.com.cn/s/blog_7fff68b90100x7j3.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐