博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用C#开发一个WinForm版的批量图片压缩工具
阅读量:6365 次
发布时间:2019-06-23

本文共 2733 字,大约阅读时间需要 9 分钟。

我们在实际项目开发过程中,曾经遇到过一个需求,就是要开发一个对大量图片进行整理(删除掉一些不符合要求的图片)、归类(根据格式进行分类,比如jpg格式、bmp格式等)、压缩(因为有的图片很大很占空间,看能否在保证清晰可辨、尺寸适中的前提下,适当的压缩掉一部分空间)的小程序。这里只是重点分享一下如何对图片进行压缩。

我们也不是水平非常高的图像处理专家,但是实际项目中又有这个需求,作为普通的程序员应该如何满足这个要求呢?

很显然,最简单的思路就是适当的缩小原图的尺寸大小或者是适当的降低原图的质量要求,这样就能有效地降低原图所占的空间。

先上一个程序的截图:

我们通过选择图片的原目录以及目标目录,设置好压缩大小和压缩质量,点击开始压缩按钮,即可进行批量图片压缩。

在图片的原目录选择当中,能够遍历根目录下的所有图片(包括子目录下的图片)。

好了,很简单的一个界面,下面我们直接上几段核心代码:

///   /// 压缩图片方法  ///   /// 原目录  /// 目标目录  /// 
压缩是否成功
private bool CompressPicture(string sourcePath, string targetPath) { try { double sizeRate = double.Parse(cbSizeRate.Text) / 100;// 大小比率 int qualityRate = int.Parse(cbQualityRate.Text);// 品质比率 Image sourceImage = Image.FromFile(sourcePath); //调整图片大小 Bitmap bmp = new Bitmap(sourceImage, new Size((int)(sourceImage.Width * sizeRate), (int)(sourceImage.Height * sizeRate))); //压缩图片 SaveAsJPEG(bmp, targetPath, qualityRate); GC.Collect(); return true; } catch { return false; } }
///   /// 保存为JPEG格式,支持压缩质量选项  ///   /// 原始位图  /// 新文件地址  /// 压缩质量,越大越好,文件也越大(0-100)  /// 
成功标志
public static bool SaveAsJPEG(Bitmap bmp, string FileName, int Qty) { try { EncoderParameter p; EncoderParameters ps; ps = new EncoderParameters(1); p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Qty); ps.Param[0] = p; bmp.Save(FileName, GetCodecInfo("image/jpeg"), ps); return true; } catch { return false; } }
///   /// 保存JPG时用  ///   ///   /// 
得到指定mimeType的ImageCodecInfo
private static ImageCodecInfo GetCodecInfo(string mimeType) { ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders(); foreach (ImageCodecInfo ici in CodecInfo) { if (ici.MimeType == mimeType) return ici; } return null; }
///   /// 遍历文件  ///   ///   public void ListFiles(FileSystemInfo info)  {      if (!info.Exists) return;      DirectoryInfo dir = info as DirectoryInfo;      if (dir == null) return;      FileSystemInfo[] files = dir.GetFileSystemInfos();      for (int i = 0; i < files.Length; i++)      {          FileInfo file = files[i] as FileInfo;          if (file != null && file.Name.Trim().LastIndexOf(".") > -1)          {              if (file.Name.Substring(file.Name.LastIndexOf(".")).ToUpper() == ".JPG")              {                  this.lvSourceFolderList.Items.Add(file.FullName);                  imageList.Add(file.FullName);              }          }          else          {              ListFiles(files[i]); //对于子目录,进行递归调用          }      }  }

源代码下载地址:

你可能感兴趣的文章
艾伟:C#中抽象类和接口的区别
查看>>
Flink - NetworkEnvironment
查看>>
BZOJ4374 : Little Elephant and Boxes
查看>>
【.Net Framework 体积大?】不安装.net framework 也能运行!?开篇叙述-1
查看>>
LLDP协议、STP协议 笔记
查看>>
如何使用 GroupBy 计数-Count()
查看>>
有了这个课件制作工具,还怕备课有难题?
查看>>
jquery之clone()方法详解
查看>>
Delphi 用文件流读取文本文件字符串的方法
查看>>
php中怎么导入自己写的类
查看>>
C# 委托
查看>>
Using Information Fragments to Answer the Questions Developers Ask
查看>>
JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html...
查看>>
getParameter和getAttribute的区别
查看>>
自动工作负载库理论与操作(Automatic Workload Repository,AWR)
查看>>
Redis两种方式实现限流
查看>>
CentOS 7 中使用NTP进行时间同步
查看>>
在MongoDB数据库中查询数据(上)
查看>>
Python import其他文件夹的文件
查看>>
Jvm(22),回收策略-----标记清除算法
查看>>