C#实现对图片文件的压缩、裁剪操作实例
本文实例讲述了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+ 绘图图面。
关于graphics类可点此查看官方教程:。
第三步,保存
第二步操作中返回的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#程序设计有所帮助。