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

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

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

using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace SinoChemBI.Tools
{
    public class ImageTools
    {
        #region 将内容保存为图片

        /// <summary>
        /// 将内容保存为图片
        /// </summary>
        /// <param name="_UIElement">控件</param>
        /// <returns>true:成功;false:失败</returns>
        public bool? PrintScreen(UIElement _UIElement)
        {
            try
            {
                //截图  
                WriteableBitmap wBitmap = new WriteableBitmap(_UIElement, new MatrixTransform());
                Image img = new Image();
                //img.Width = 450;
                //img.Margin = new Thickness(2);
                img.Source = wBitmap;
                //保存图片  
                if (wBitmap == null)
                {
                    return false;
                }
                SaveFileDialog saveDlg = new SaveFileDialog();
                saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";
                saveDlg.DefaultExt = ".jpeg";

                if (!(bool)saveDlg.ShowDialog())
                {
                    return null;
                }
                using (Stream fs = saveDlg.OpenFile())
                {
                    savePicToFile(wBitmap, fs);
                    return true;
                }
            }
            catch (System.Exception ex)
            {
                return false;
            }
        }
        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);
        }

        #endregion
    }
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值