1、需求分析 用winform窗體程式,開發一個能夠自動、批量對圖片進行縮放和裁剪的程式。 原本想直接從網上找類型的工具直接用,但是無奈現在網上能找到的工具,要麼不能用,要麼就是很 噁心的下載完後還有一堆插件的,要麼就是我用不來的。 這個程式是我根據個人需求,想要把所有拍好的人像照,直接批處理成1寸 ...
1、需求分析
用winform窗體程式,開發一個能夠自動、批量對圖片進行縮放和裁剪的程式。
原本想直接從網上找類型的工具直接用,但是無奈現在網上能找到的工具,要麼不能用,要麼就是很
噁心的下載完後還有一堆插件的,要麼就是我用不來的。
這個程式是我根據個人需求,想要把所有拍好的人像照,直接批處理成1寸的照片,就能省去很多裁剪圖片的時間。
這裡要對生成的1寸圖片做個說明:1寸圖片我網上查到的大小是:照片規格(英寸) (釐米) (像素)
1寸 2.5*3.5cm 413*295
由於在拍攝時可能存在橫拍和豎拍,所以生成後圖片雖然也是1寸的,但是方向不一樣,這個不影響,還可以根據需求在代碼中修改。
先看效果:
可以看出縮放圖片後,圖片的質量也會隨之變低,而裁剪則不會有這個問題。
2、圖片裁剪代碼
1 /// <summary> 2 /// 裁剪按鈕 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void Button1_Click(object sender, EventArgs e) 7 { 8 OpenFileDialog dialog = new OpenFileDialog(); //打開文件夾,選擇圖片 9 dialog.Filter = "(*.jpg,*.png,*.jpeg,*.bmp,*.gif)|*.jgp;*.png;*.jpeg;*.bmp;*.gif;*.JPG;*.PNG;|All files(*.*)|*.*"; 10 dialog.Multiselect = true; 11 if (dialog.ShowDialog() == DialogResult.OK) 12 { 13 string path = dialog.FileName; 14 Bitmap img = new Bitmap(path); 15 Image img2 = ImageTailor(img, 319, 449); //設置大小為1寸照片 16 string imgSaveUrl = @"D:/我的圖片/處理完成/" + dialog.SafeFileName; //保存圖片到文件夾 17 img2.Save(imgSaveUrl); 18 img2.Dispose(); //釋放資源 19 } 20 } 21 22 public Image ImageTailor(Bitmap bmp,int nowWidth,int nowHeight) 23 { 24 Bitmap newbm = new Bitmap(nowWidth, nowHeight); 25 Graphics g = Graphics.FromImage(newbm); 26 g.InterpolationMode = InterpolationMode.HighQualityBicubic; 27 g.SmoothingMode = SmoothingMode.HighQuality; 28 g.CompositingQuality = CompositingQuality.HighQuality; 29 //前Rectangle代表畫布大小,後Rectangle代表裁剪後右邊留下的區域 30 g.DrawImage(bmp, new Rectangle(0, 0, nowWidth, nowHeight), new Rectangle(0, 0, bmp.Width / 2, bmp.Height), GraphicsUnit.Pixel); 31 g.Dispose(); 32 return newbm; 33 }
裁剪按鈕方法還沒完善好,目前只完成了單張圖片的裁剪。要想修改成批量的,只需在openfiledialog控制項設置成允許多選,然後根據選中的圖片數量進行迴圈處理,就可以了。
後面的縮放按鈕是比較完善的,可以允許多選圖片,併進行批處理。
3、圖片縮放代碼:
縮放圖片的代碼看起來會比較複雜些,但是邏輯並不難。一些代碼也是在網上看其他人寫的,拿過來用(那個“中間件確實是自己寫著玩的,懶得改回去,哈哈”)
1 /// <summary> 2 /// 顯示圖片 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void Button_SelectImg_Click(object sender, EventArgs e) 7 { 8 OpenFileDialog dialog = new OpenFileDialog(); 9 dialog.Filter = "(*.jpg,*.png,*.jpeg,*.bmp,*.gif)|*.jgp;*.png;*.jpeg;*.bmp;*.gif;*.JPG;*.PNG;|All files(*.*)|*.*"; 10 dialog.Multiselect = true; //允許文件多選 11 string folder = ""; 12 if (Directory.Exists(@"D:/我的圖片/處理完成/")) 13 { 14 folder = @"D:/我的圖片/處理完成/"; 15 } 16 else 17 { 18 Directory.CreateDirectory(@"D:/我的圖片/處理完成/"); 19 folder = @"D:/我的圖片/處理完成/"; 20 } 21 if (dialog.ShowDialog() == DialogResult.OK) 22 { 23 int fileCount = dialog.FileNames.Length; //獲取選中圖片數量 24 int countNum = fileCount; 25 for (int i = 0; i < fileCount; i++) 26 { 27 string path = dialog.FileNames[i]; //圖片絕對路徑,包含圖片名稱 28 Image img = GetReducedImage(path); 29 string imgSaveUrl = folder + dialog.SafeFileNames[i]; //保存圖片到文件夾 30 img.Save(imgSaveUrl); 31 img.Dispose(); //釋放資源 32 countNum--; 33 if (countNum == 0) 34 { 35 MessageBox.Show("處理圖片完成,總計處理:" + fileCount + "張"); 36 } 37 } 38 } 39 } 40 41 /// <summary> 42 /// 中間件,寫著玩 43 /// </summary> 44 /// <param name="fileName"></param> 45 /// <returns></returns> 46 public Image GetReducedImage(string fileName) 47 { 48 Image ResourceImage = Image.FromFile(fileName); 49 Bitmap img = new Bitmap(ResourceImage); 50 return ZoomImage(img, 449, 319); 51 } 52 53 #region 等比例縮放圖片 54 /// <summary> 55 /// 等比例縮放圖片 56 /// </summary> 57 /// <param name="bitmap"></param> 58 /// <param name="destHeight"></param> 59 /// <param name="destWidth"></param> 60 /// <returns></returns> 61 private Bitmap ZoomImage(Bitmap bitmap, int destHeight, int destWidth) 62 { 63 try 64 { 65 Image sourImage = bitmap; 66 ImageCodecInfo ici = GetEncoder(ImageFormat.Jpeg); 67 int width = 0, height = 0; 68 //按比例縮放 69 int sourWidth = sourImage.Width; 70 int sourHeight = sourImage.Height; 71 if (sourHeight > destHeight || sourWidth > destWidth) 72 { 73 if ((sourWidth * destHeight) > (sourHeight * destWidth)) 74 { 75 width = destWidth; 76 height = (destWidth * sourHeight) / sourWidth; 77 } 78 else 79 { 80 height = destHeight; 81 width = (sourWidth * destHeight) / sourHeight; 82 } 83 } 84 else 85 { 86 width = sourWidth; 87 height = sourHeight; 88 } 89 Bitmap destBitmap = new Bitmap(destWidth, destHeight); 90 Graphics g = Graphics.FromImage(destBitmap); 91 g.Clear(Color.Transparent); 92 //設置畫布的描繪質量 93 g.CompositingQuality = CompositingQuality.HighQuality; 94 g.SmoothingMode = SmoothingMode.HighQuality; 95 g.InterpolationMode = InterpolationMode.HighQualityBilinear; 96 g.DrawImage(sourImage, new Rectangle((destWidth - width) / 2, (destHeight - height) / 2, width, height), 0, 0, sourImage.Width, sourImage.Height, GraphicsUnit.Pixel); 97 g.Dispose(); 98 //設置壓縮質量 99 EncoderParameters encoderParams = new EncoderParameters(); 100 long[] quality = new long[1]; 101 quality[0] = 100; 102 EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); 103 encoderParams.Param[0] = encoderParam; 104 sourImage.Dispose(); 105 return destBitmap; 106 } 107 catch 108 { 109 return bitmap; 110 } 111 } 112 #endregion 113 114 public static ImageCodecInfo GetEncoder(ImageFormat format) 115 { 116 ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 117 foreach (ImageCodecInfo codec in codecs) 118 { 119 if (codec.FormatID == format.Guid) 120 { 121 return codec; 122 } 123 } 124 return null; 125 }
4、總結:
以上,就完成了簡單的圖片批量縮放(裁剪)成1寸圖片的功能。