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

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,(int)stream.Length);
            fs.Write(binaryData,binaryData.Length);
        }

        #endregion
    }
}

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

相关推荐