c#目录以及子目录下图片批量缩放,像素不变,图像大小改变
采用多线程,整体效果
图像根目录黏贴或者手工选择,点击开始,进行目录底下图片筛查。采用多线程,点击开始按钮,开启线程,这样UI不会卡住
private void button2_Click(object sender, EventArgs e) { var foldPath = textBox1.Text.Trim(); if (string.IsNullOrEmpty(foldPath)) { return; } ImageZoomThread(foldPath); }
线程方法:
private void ImageZoomThread(string foldPath) { ThreadStart threadStart = delegate { listBox1.Items.Clear(); ZoomImage(foldPath); }; Thread thread = new Thread(threadStart); thread.IsBackground = true; thread.Start(); }
缩放图像,核心代码:
private void ZoomImage(string foldPath) { DirectoryInfo dir = new DirectoryInfo(foldPath); FileInfo[] files = dir.GetFiles("*.jpg"); DirectoryInfo[] dii = dir.GetDirectories(); foreach (var file in files) { listBox1.Items.Add(file.FullName); listBox1.SelectedIndex = -1; ChangeImageSize(file.FullName, file.FullName.Replace(".jpg", "_zoom.jpg")); } //获取子文件夹内的文件列表,递归遍历 foreach (DirectoryInfo d in dii) { ZoomImage(d.FullName); } } /// <summary> /// 压缩图片 /// </summary> /// <param name="filePath">要压缩的图片的路径</param> /// <param name="newfilePath">压缩后的图片的路径</param> public void ChangeImageSize(string filePath, string newfilePath) { Bitmap bmp = null; ImageCodecInfo ici = null; System.Drawing.Imaging.Encoder ecd = null; EncoderParameter ept = null; EncoderParameters eptS = null; try { ici = this.getImageCoderInfo("image/jpeg"); ecd = System.Drawing.Imaging.Encoder.Quality; eptS = new EncoderParameters(1); ept = new EncoderParameter(ecd, 35L); eptS.Param[0] = ept; if (File.Exists(newfilePath)) { File.Delete(newfilePath); } bmp = new Bitmap(filePath); bmp.Save(newfilePath, ici, eptS); if (bmp != null) bmp.Dispose(); ept.Dispose(); eptS.Dispose(); } catch (Exception ex) { //throw new Exception(ex.Message); } finally { } } /// <summary> /// 获取图片编码类型信息 /// </summary> /// <param name="coderType">编码类型</param> /// <returns>ImageCodecInfo</returns> private ImageCodecInfo getImageCoderInfo(string coderType) { ImageCodecInfo[] iciS = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo retIci = null; foreach (ImageCodecInfo ici in iciS) { if (ici.MimeType.Equals(coderType)) retIci = ici; } return retIci; }