图片的截取和压缩主要通过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 }}总结
以上是内存溢出为你收集整理的Silverlight/WPF 截图保存功能的实现全部内容,希望文章能够帮你解决Silverlight/WPF 截图保存功能的实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)