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#程序设计有所帮助。