重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
我们在实际项目开发过程中,曾经遇到过一个需求,就是要开发一个对大量图片进行整理(删除掉一些不符合要求的图片)、归类(根据格式进行分类,比如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("p_w_picpath/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); p_w_picpathList.Add(file.FullName); } } else { ListFiles(files[i]); //对于子目录,进行递归调用 } } }
源代码下载地址:WinForm批量图片压缩工具源码