原文: http://blog.csdn.net/chinacsharper/article/details/9865491
我們在實際項目開發過程中,曾經遇到過一個需求,就是要開發一個對大量圖片進行整理(刪除掉一些不符合要求的圖片)、歸類(根據格式進行分類,比如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("image/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);
- imageList.Add(file.FullName);
- }
- }
- else
- {
- ListFiles(files[i]); //對於子目錄,進行遞歸調用
- }
- }
- }