C#实现对图片文件的压缩、裁剪操作实例
本文实例讲述了C#对图片文件的压缩、裁剪操作方法,在C#项目开发中非常有实用价值。分享给大家供大家参考。具体如下:
一般在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便。毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意。
于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小、尺寸的目标图片。
具体步骤如下:
先说图片压缩:
第一步:需要读取一个图片文件,读取方法:
//<paramname="ImageFilePathAndName">图片文件的全路径名称</param> publicImageResourceImage=Image.FromFile(ImageFilePathAndName);
说明:
Image类:引用自System.Drawing,为源自Bitmap和Metafile的类提供功能的抽象基类。
主要属性:Size->获取此图像的以像素为单位的宽度和高度。
PhysicalDimension->获取此图像的宽度和高度(如果该图像是位图,以像素为单位返回宽度和高度。如果该图像是图元文件,则以0.01毫米为单位返回宽度和高度。)。
PixelFormat->获取此Image的像素格式。
Height、Width->获取此Image的高度、宽度(以像素为单位)。
主要方法:FromFile(String)->从指定的文件创建Image。
FromStream(Stream)->从指定的数据流创建Image。
Save(StringfileName)->将该Image保存到指定的文件或流。
Save(Stream,ImageFormat)->将此图像以指定的格式保存到指定的流中。
Save(String,ImageFormat)->将此Image以指定格式保存到指定文件。
更多属性和方法说明请点击。
第二步,生成缩略图,并且将原图内容按指定大小绘制到目标图片。
///<summary> ///生成缩略图重载方法1,返回缩略图的Image对象 ///</summary> ///<paramname="Width">缩略图的宽度</param> ///<paramname="Height">缩略图的高度</param> ///<returns>缩略图的Image对象</returns> publicImageGetReducedImage(intWidth,intHeight) { try { //用指定的大小和格式初始化Bitmap类的新实例 Bitmapbitmap=newBitmap(Width,Height,PixelFormat.Format32bppArgb); //从指定的Image对象创建新Graphics对象 Graphicsgraphics=Graphics.FromImage(bitmap); //清除整个绘图面并以透明背景色填充 graphics.Clear(Color.Transparent); //在指定位置并且按指定大小绘制原图片对象 graphics.DrawImage(ResourceImage,newRectangle(0,0,Width,Height)); returnbitmap; } catch(Exceptione) { ErrMessage=e.Message; returnnull; } }
说明:
1、Bitmap类
引用自System.Drawing,封装GDI+位图,此位图由图形图像及其特性的像素数据组成。Bitmap是用于处理由像素数据定义的图像的对象。
关于封装图像的对象,详细介绍可参看官方文档:http://msdn.microsoft.com/zh-cn/library/system.drawing.bitmap.aspx。
2、Graphics类
引用自System.Drawing,(处理图像的对象),封装一个GDI+绘图图面。
关于Graphics类可点此查看官方教程:http://msdn.microsoft.com/zh-cn/library/system.drawing.graphics.aspx。
第三步,保存
第二步操作中返回的Image对象,暂时命名为:iImage:
iImage.Save(pathAndName,System.Drawing.Imaging.ImageFormat.Jpeg);
以上是压缩操作,做了下试验,101k的图片,经过压缩后是57k。这个应该和尺寸有关系。
以下是图片裁剪,其实原理和上面相似,无非也就是对图片进行重画操作。
///<summary> ///截取图片方法 ///</summary> ///<paramname="url">图片地址</param> ///<paramname="beginX">开始位置-X</param> ///<paramname="beginY">开始位置-Y</param> ///<paramname="getX">截取宽度</param> ///<paramname="getY">截取长度</param> ///<paramname="fileName">文件名称</param> ///<paramname="savePath">保存路径</param> ///<paramname="fileExt">后缀名</param> publicstaticstringCutImage(stringurl,intbeginX,intbeginY,intgetX,intgetY,stringfileName,stringsavePath,stringfileExt) { if((beginX<getX)&&(beginY<getY)) { Bitmapbitmap=newBitmap(url);//原图 if(((beginX+getX)<=bitmap.Width)&&((beginY+getY)<=bitmap.Height)) { BitmapdestBitmap=newBitmap(getX,getY);//目标图 RectangledestRect=newRectangle(0,0,getX,getY);//矩形容器 RectanglesrcRect=newRectangle(beginX,beginY,getX,getY); Graphics.FromImage(destBitmap); Graphics.DrawImage(bitmap,destRect,srcRect,GraphicsUnit.Pixel); ImageFormatformat=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); returnsavePath+"\\"+"*"+fileName.Split('.')[0]+"."+fileExt; } else { return"截取范围超出图片范围"; } } else { return"请确认(beginX<getX)&&(beginY<getY)"; } }
说明:
Rectangle类:矩形,详情可参考官方文档:http://msdn.microsoft.com/zh-cn/library/system.windows.shapes.rectangle(v=vs.85).aspx
以上就是裁剪一个图片文件的示例代码。
本文所使用代码,是项目中真实代码,已经过测试。
希望本文所述对大家的C#程序设计有所帮助。