一、編寫界面html
二、編寫具體的按鈕事件c#
三、重點是圖片處理方法,而後將這些方法鏈接到按鈕事件上面測試
四、測試運行。ui
具體代碼以下:spa
//選擇圖片所在目錄 private void button1_Click(object sender, EventArgs e) { FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.Description = "請選擇圖片所在文件夾"; if (dialog.ShowDialog() == DialogResult.OK) { if (string.IsNullOrEmpty(dialog.SelectedPath)) { label3.Text = "文件夾路徑不能爲空"; return; } label1.Text = dialog.SelectedPath; source = dialog.SelectedPath; } } //選擇圖片所在目錄 private void button2_Click(object sender, EventArgs e) { FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.Description = "請選擇輸出文件夾"; if (dialog.ShowDialog() == DialogResult.OK) { if (string.IsNullOrEmpty(dialog.SelectedPath)) { label3.Text = "文件夾路徑不能爲空"; return; } label2.Text = dialog.SelectedPath; output = dialog.SelectedPath; } } //單層目錄開始按鈕監聽 //按方法用於選擇單個目錄下的全部圖片文件,並調用ApplyWaterMark方法進行圖像處理 private void btnOk_Click(object sender, EventArgs e) { label3.ForeColor = Color.Black; if (string.IsNullOrEmpty(source)) { label3.ForeColor = Color.Red; label3.Text = "請選擇原文件夾"; return; } if (string.IsNullOrEmpty(output)) { label3.ForeColor = Color.Red; label3.Text = "請選擇輸出文件夾"; return; } var files = Directory.GetFiles(source); foreach (var file in files) { ApplyWaterMark(file, output); label3.Text = "正在修改" + file; } label3.ForeColor = Color.Red; label3.Text = "完成"; source = string.Empty; output = string.Empty; } //雙層目錄開始按鈕監聽 //該方法用於父目錄下還有一層子目錄,子目錄下才是圖片文件的狀況。能夠批量修改多個文件夾的圖片 private void btnOk2_Click(object sender, EventArgs e) { label3.ForeColor = Color.Black; if (string.IsNullOrEmpty(source)) { label3.ForeColor = Color.Red; label3.Text = "請選擇原文件夾"; return; } if (string.IsNullOrEmpty(output)) { label3.ForeColor = Color.Red; label3.Text = "請選擇輸出文件夾"; return; } var dirs = Directory.GetDirectories(source); //先打開父目錄 foreach (var dir in dirs) //遍歷子目錄 { foreach (var file in Directory.GetFiles(dir)) { var dirInfo = new DirectoryInfo(dir); var dirName = dirInfo.Name; var outputDirName = Path.Combine(output, dirName); ApplyWaterMark(file, outputDirName); label3.Text = "正在修改" + file; } } label3.ForeColor = Color.Red; label3.Text = "完成"; source = string.Empty; output = string.Empty; }
private void ApplyWaterMark(string file, string dir) { try { var info = new FileInfo(file); var name = info.Name; Image Im = Image.FromFile(file); var rate = (int)compressRate.Value == 0 ? 1 : (int)compressRate.Value;//讀取圖片壓縮控件設置的倍數,最大值10 var newImage = new Bitmap(Im,Im.Width/rate,Im.Height/rate);//源圖片長寬除以該倍數,縮放圖片 Graphics g = Graphics.FromImage(newImage); // 建立 solid brush 往圖片寫水印 Brush myBrush = new SolidBrush(Color.FromArgb(1, Color.LightSteelBlue)); var f = new Font(FontFamily.GenericSerif, 1); var x = (int)(coX.Value); //讀取水印座標設置的X軸值 var y = (int)(coY.Value); //讀取水印座標設置的Y軸值 g.DrawString(".", f, myBrush, new Point(x, y)); if (!Directory.Exists(dir)) //建立圖片的輸出目錄 { Directory.CreateDirectory(dir); } //初始化jpg圖片解碼器 ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); Encoder myEncoder = Encoder.Quality; EncoderParameters myEncoderParameters = new EncoderParameters(1); var qualityNum = quality.Value; //讀取圖片質量控件設置的值,最大值爲100 EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, (long)qualityNum); myEncoderParameters.Param[0] = myEncoderParameter; newImage.Save(Path.Combine(dir, name), jpgEncoder, myEncoderParameters); Im.Dispose(); newImage.Dispose(); g.Dispose(); myBrush.Dispose(); } catch (Exception ex) { File.AppendAllText("error.txt", dir + "," + ex.Message); } } private ImageCodecInfo GetEncoder(ImageFormat format) { ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); foreach (ImageCodecInfo codec in codecs) { if (codec.FormatID == format.Guid) { return codec; } } return null; }
說明:關於壓縮圖片,有時候縮放尺寸更好,有時候下降圖片質量更好,有時候兩個選項配合起來用,具體本身調節!code
下面舉個本身壓縮圖片的例子:orm
原圖片htm
壓縮後事件
壓縮了近10倍的大小,可是圖片的各項參數都沒改變,壓縮後的圖片和原圖片同樣清晰。圖片
壓縮的時候只是將圖片質量(quality)控件的值設置爲50,就達到了這樣的效果。固然,不是每張圖片都是這樣修改,有些圖片可能修改尺寸,而不修改圖片質量更好。