图片的截取和压缩主要通过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 举报,一经查实,本站将立刻删除。