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

作者:shichen2014 时间:2022-07-09 01:50:51 

本文实例讲述了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 是用于处理由像素数据定义的图像的对象。

关于封装图像的对象,详细介绍可参看官方文档: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>
/// <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类:矩形,详情可参考官方文档:http://msdn.microsoft.com/zh-cn/library/system.windows.shapes.rectangle(v=vs.85).aspx

本文所使用代码,是项目中真实代码,已经过测试。

希望本文所述对大家的C#程序设计有所帮助。

标签:C#,图片,操作
0
投稿

猜你喜欢

  • 浅谈Java获得多线程的返回结果方式(3种)

    2023-04-02 05:37:36
  • SpringBoot配置SSL同时支持http和https访问实现

    2023-04-25 19:42:45
  • 如何用C#实现SAGA分布式事务

    2022-11-29 20:34:49
  • Android超详细讲解组件LinearLayout的使用

    2023-11-01 01:04:27
  • C#实现自动生成电子印章

    2022-12-08 10:47:58
  • java中不定长参数的实例用法

    2021-06-17 02:49:35
  • Android基础总结篇之三:Activity的task相关介绍

    2023-06-15 14:47:17
  • Java查找并高亮PDF文本过程解析

    2022-02-17 07:20:32
  • Mybatis中Mapper映射文件使用详解

    2023-02-13 17:57:07
  • Android Tabhost使用方法详解

    2023-10-02 12:46:46
  • IDEA插件之Mybatis Log plugin 破解及安装方法

    2023-09-24 22:30:16
  • 关于国际化、OGNL表达式语言

    2023-09-04 15:20:45
  • Java将Word文件转为OFD文件

    2023-05-24 01:46:35
  • SpringBoot+微信小程序实现文件上传与下载功能详解

    2023-01-17 15:56:39
  • 简单实现Android应用的启动页

    2022-04-15 14:23:45
  • 浅谈java内存管理与内存溢出异常

    2022-04-22 15:03:18
  • Android异步回调中的UI同步性问题分析

    2022-07-31 14:10:51
  • c#解析jobject的数据结构

    2023-09-28 00:25:33
  • Android RecyclerView的简单使用

    2022-08-07 22:04:23
  • spring-boot使用AOP统一处理日志

    2023-06-09 05:12:35
  • asp之家 软件编程 m.aspxhome.com