Silverlight/WPF 截图保存功能的实现
时间:2011-08-18 06:08来源:新浪博客
作者:刘欢博客斋 点击: 1491次
图片的截取和压缩主要通过WriteableBitmap 这个类实现的,对它进行相应的变换就可以实现截取和压缩。 由WriteableBitmap转换成byte我调用了FluxJpeg这个三方的。 这个在博客园上有很多说明,在博客园上搜索FluxJpeg就可以找的到 用户点击保存图片按钮的时候,触发一个事件: private void btnSavePic_Click( object sender
图片的截取和压缩主要通过WriteableBitmap 这个类实现的,对它进行相应的变换就可以实现截取和压缩。 由WriteableBitmap转换成byte我调用了FluxJpeg这个三方的。
这个在博客园上有很多说明,在博客园上搜索“FluxJpeg”就可以找的到
用户点击保存图片按钮的时候,触发一个事件:
private void btnSavePic_Click(object sender, RoutedEventArgs e)
{
WriteableBitmap bitmap = new WriteableBitmap(parentCanvas, null); //声明一个WriteableBitmap对象,参数parentCanvas是绘制图形的区域
if (bitmap != null)
{
SaveFileDialog saveDlg = new SaveFileDialog();//调用保存文件对话框
saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";
saveDlg.DefaultExt = ".jpeg";
if (saveDlg.ShowDialog().Value)
{
using (Stream fs = saveDlg.OpenFile())
{
savePicToFile(bitmap, fs); //调用savePicToFile方法保存图片,下面会介绍这个方法的实现
MessageBox.Show(string.Format("图片已经保存到“{0}”",saveDlg.SafeFileName));
}
}
}
}
{
WriteableBitmap bitmap = new WriteableBitmap(parentCanvas, null); //声明一个WriteableBitmap对象,参数parentCanvas是绘制图形的区域
if (bitmap != null)
{
SaveFileDialog saveDlg = new SaveFileDialog();//调用保存文件对话框
saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";
saveDlg.DefaultExt = ".jpeg";
if (saveDlg.ShowDialog().Value)
{
using (Stream fs = saveDlg.OpenFile())
{
savePicToFile(bitmap, fs); //调用savePicToFile方法保存图片,下面会介绍这个方法的实现
MessageBox.Show(string.Format("图片已经保存到“{0}”",saveDlg.SafeFileName));
}
}
}
}
下面是savePicToFile方法的实习,会用到FluxJpeg组件:
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);
}
{
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);
}
这样,我们就可以成功的将用户在canvas中绘制的内容作为一张图片保存起来了。
本文来自刘欢博客斋的博客,原文地址:http://blog.sina.com.cn/s/blog_7fff68b90100x7j3.html