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#添加PDF文件水印的具体代码,供大家参考,具体内容如下using System;using System.Colle
- 一、Netty简介Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现
- Android开发过程中,特别是新开的项目,底部状态栏的切换使用的频率非常的高,主要的实现方式有:(1)、TabLayout + Fragm
- Mybatis Log Plugin使用今天发现大部分猿友关于查看执行sql语句的方法,只知道将其输出到控制台。然而还有更简便的方法,就是使
- 目录@Configuration + @Bean@Componet + @ComponentScan@Import注解导入@Import直接
- 如下所示:Synchronized是内置的java关键字,Lock是一个java类。Synchronized无法判断是否获取到了锁,Lock
- 前言最近在知乎上面看到一篇关于程序员面试的问题,面试官问我们一般有几种注入的方法,这几种注入的方法分别在什么时候运用比合理,当时我看到这个时
- 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。程序分析:请抓住分子与分母的变化规
- Android实现环形进度条的效果图如下:自定义控件:AttendanceProgressBar代码如下:public class Atte
- 本文为大家分享了JAVA语言课程设计:连连看小游戏,供大家参考,具体内容如下1.设计内容界面中有5*10的界面,图中共有6种不同的图片,每两
- 1.这是一个通过Java反射机制解析的工具类2.使用时只需创建对应的对象,并在Excel的第一行填上对应的属性名3.首先要添加相关的jar包
- 冒泡排序法:关键字较小的记录好比气泡逐趟上浮,关键字较大的记录好比石块下沉,每趟有一块最大的石块沉底。算法本质:(最大值是关键点,肯定放到最
- 1.什么是PDF/UA文件PDF/UA,即Universally Accessible PDF,该格式的PDF文件是于2012年8月以ISO
- 本文实例为大家分享了Java实现医院管理系统的具体代码,供大家参考,具体内容如下1.开发工具NetBeans8.2Mysql5.7mysql
- 前言我通常是不太关心代码的具体实现的,因为我的开发语言很杂,倾向于一些最简单通用的方式去解决。今儿不小心在群里看到一位朋友发了下面的java
- 冒泡排序算法演示图:public static void bubbleSort(int[] array) { &
- 目录1. SpringMVC默认三个异常处理类2. @ExceptionHandler注解异常3. @ResponseStatus注解异常4
- 一、@ConditionalOnClass() Spring中存在指定class对象时,注入指定配置和ConditionalOnBean()
- 引言最新有一个winform项目使用的是DevExpress的控件,所以最近都在摸索使用这套控件,实在是佩服整套控件的强大,同时代码写起来也
- 一.什么是泛型当我们不确定数据类型时,我们可以暂时使用一个字母 T代替数据类型。例如写一个方法,但是我们不知道它是传递的是什么数据类型,我们