欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现对图片文件的压缩、裁剪操作实例

程序员文章站 2023-12-19 15:33:22
本文实例讲述了c#对图片文件的压缩、裁剪操作方法,在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#程序设计有所帮助。

上一篇:

下一篇: