用C#开发一个WinForm版的批量图片压缩工具
我们在实际项目开发过程中,曾经遇到过一个需求,就是要开发一个对大量图片进行整理(删除掉一些不符合要求的图片)、归类(根据格式进行分类,比如jpg格式、bmp格式等)、压缩(因为有的图片很大很占空间,看能否在保证清晰可辨、尺寸适中的前提下,适当的压缩掉一部分空间)的小程序。这里只是重点分享一下如何对图片进行压缩。
我们也不是水平非常高的图像处理专家,但是实际项目中又有这个需求,作为普通的程序员应该如何满足这个要求呢?
很显然,最简单的思路就是适当的缩小原图的尺寸大小或者是适当的降低原图的质量要求,这样就能有效地降低原图所占的空间。
先上一个程序的截图:
我们通过选择图片的原目录以及目标目录,设置好压缩大小和压缩质量,点击开始压缩按钮,即可进行批量图片压缩。
在图片的原目录选择当中,能够遍历根目录下的所有图片(包括子目录下的图片)。
好了,很简单的一个界面,下面我们直接上几段核心代码:
/// <summary> /// 压缩图片方法 /// </summary> /// <param name="sourcePath">原目录</param> /// <param name="targetPath">目标目录</param> /// <returns>压缩是否成功</returns> 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; } }
/// <summary> /// 保存为JPEG格式,支持压缩质量选项 /// </summary> /// <param name="bmp">原始位图</param> /// <param name="FileName">新文件地址</param> /// <param name="Qty">压缩质量,越大越好,文件也越大(0-100)</param> /// <returns>成功标志</returns> 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("p_w_picpath/jpeg"), ps); return true; } catch { return false; } }
/// <summary> /// 保存JPG时用 /// </summary> /// <param name="mimeType"></param> /// <returns>得到指定mimeType的ImageCodecInfo</returns> private static ImageCodecInfo GetCodecInfo(string mimeType) { ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders(); foreach (ImageCodecInfo ici in CodecInfo) { if (ici.MimeType == mimeType) return ici; } return null; }
/// <summary> /// 遍历文件 /// </summary> /// <param name="info"></param> 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); p_w_picpathList.Add(file.FullName); } } else { ListFiles(files[i]); //对于子目录,进行递归调用 } } }
源代码下载地址:WinForm批量图片压缩工具源码