C#对图片文件的压缩、裁剪操作初探
C#对图片文件的压缩、裁剪操作初探
在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便。毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意。
于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小、尺寸的目标图片。
进入正题-->
先说图片压缩
第一步:需要读取一个图片文件,读取方法:
// <param name="ImageFilePathAndName"> 图片文件的全路径名称 </param>
public Image ResourceImage =Image.FromFile(ImageFilePathAndName);
说明:
Image类:引用自System.Drawing,为源自 Bitmap 和 Metafile 的类提供功能的抽象基类。
主要属性:Size-> 获取此图像的以像素为单位的宽度和高度。
PhysicalDimension-> 获取此图像的宽度和高度( 如果该图像是位图,以像素为单位返回宽度和高度。 如果该图像是图元文件,则以 0.01 毫米为单位返回宽度和高度。 )。
PixelFormat -> 获取此 Image 的像素格式。
Height 、 Width-> 获取此 Image 的高度、宽度(以像素为单位)。
主要方法:FromFile(String) -> 从指定的文件创建 Image 。
FromStream(Stream)-> 从指定的数据流创建 Image 。
Save(String fileName)-> 将该 Image 保存到指定的文件或流。
Save(Stream, ImageFormat)-> 将此图像以指定的格式保存到指定的流中。
Save(String, ImageFormat)-> 将此 Image 以指定格式保存到指定文件。
更多属性和方法说明 请点击 。
第二步,生成缩略图,并且将原图内容按指定大小绘制到目标图片。
/// <summary> /// 生成缩略图重载方法1,返回缩略图的Image对象 /// </summary> /// <param name="Width"> 缩略图的宽度 </param> /// <param name="Height"> 缩略图的高度 </param> /// <returns> 缩略图的Image对象 </returns> public Image GetReducedImage( int Width, int Height) { try { // 用指定的大小和格式初始化Bitmap类的新实例 Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb); // 从指定的Image对象创建新Graphics对象 Graphics graphics = Graphics.FromImage(bitmap); // 清除整个绘图面并以透明背景色填充 graphics.Clear(Color.Transparent); // 在指定位置并且按指定大小绘制原图片对象 graphics.DrawImage(ResourceImage, new Rectangle( 0 , 0 , Width, Height)); return bitmap; } catch (Exception e) { ErrMessage = e.Message; return null ; } }
说明: 1、Bitmap类
引用自System.Drawing,封装 GDI+ 位图,此位图由图形图像及其特性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。
(封装 图像的对象 ),详细介绍 请点此 。
2、Graphics类
引用自System.Drawing , ( 处理图像的对象 ), 封装一个 GDI+ 绘图图面。
详情 请点此 。
第三步,保存
第二步操作中返回的Image对象,暂时命名为:iImage:
iImage.Save(pathAndName, System.Drawing.Imaging.ImageFormat.Jpeg);
以上是压缩操作,做了下试验,101k的图片,经过压缩后是57k。这个应该和尺寸有关系。
以下是图片裁剪,其实原理和上面相似,无非也就是对图片进行重画操作。
/// <summary> /// 截取图片方法 /// </summary> /// <param name="url"> 图片地址 </param> /// <param name="beginX"> 开始位置-X </param> /// <param name="beginY"> 开始位置-Y </param> /// <param name="getX"> 截取宽度 </param> /// <param name="getY"> 截取长度 </param> /// <param name="fileName"> 文件名称 </param> /// <param name="savePath"> 保存路径 </param> /// <param name="fileExt"> 后缀名 </param> public static string CutImage( string url, int beginX, int beginY, int getX, int getY, string fileName, string savePath, string fileExt) { if ((beginX < getX) && (beginY < getY)) { Bitmap bitmap = new Bitmap(url); // 原图
if (((beginX + getX) <= bitmap.Width) && ((beginY + getY) <= bitmap.Height)) { Bitmap destBitmap = new Bitmap(getX, getY); // 目标图
Rectangle destRect = new Rectangle( 0 , 0 , getX, getY); //矩形 容器 Rectangle srcRect = new Rectangle(beginX, beginY, getX, getY); Graphics.FromImage(destBitmap);
Graphics.DrawImage(bitmap, destRect, srcRect, GraphicsUnit.Pixel); ImageFormat format = ImageFormat.Png; switch (fileExt.ToLower()) { case " png " : format = ImageFormat.Png; break ; case " bmp " : format = ImageFormat.Bmp; break ; case " gif " : format = ImageFormat.Gif; break ; } destBitmap.Save(savePath + " // " + fileName , format); return savePath + " \\ " + " * " + fileName.Split( ' . ' )[ 0 ] + " . " + fileExt; } else { return " 截取范围超出图片范围 " ; } } else { return " 请确认(beginX < getX)&&(beginY < getY) " ; } }
说明:
Rectangle类:矩形,详情 请点此 。
以上是裁剪一个图片文件的示例代码。
本文所使用代码,是项目中真实代码,已经过测试。
希望和大家交流共同学习。
分类: C#课堂 , 随笔
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于C#对图片文件的压缩、裁剪操作初探的详细内容...