图片的截取和压缩主要通过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
}
}