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

本文介绍如何使用Silverlight/WPF中的WriteableBitmap类来截取和压缩图像,并将其保存为JPEG格式。通过实例代码展示了从获取画布内容到保存图片的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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, 0, binaryData.Length);
        } 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值