用C#开发一个WinForm版的批量图片压缩工具

原创 2013年08月09日 22:21:20

我们在实际项目开发过程中,曾经遇到过一个需求,就是要开发一个对大量图片进行整理(删除掉一些不符合要求的图片)、归类(根据格式进行分类,比如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]); //对于子目录,进行递归调用
                }
            }
        }
源代码下载地址:WinForm批量图片压缩工具源码

版权声明:本文为博主原创文章,未经博主允许不得转载。

C# 压缩图片

将图片进行压缩,已节省硬盘空间。using System; using System.Collections.Generic; using System.Text; using System.D...
  • Gavin71
  • Gavin71
  • 2010年07月28日 10:31
  • 1015

将图片 按比例 压缩为JPG

 { 将图片保存到数据库时,有时因为图片的大小 太大 或 是BMP没压缩过的图片,而我们在软件只需要看小图, 怎么办呢? 直接保存太慢、而且太占数据库。用以下函数试试. Compress_...
  • shazhuyubaichi
  • shazhuyubaichi
  • 2010年11月22日 11:59
  • 611

图像原比例压缩

  • 2016年05月26日 12:49
  • 3KB
  • 下载

C#中基于GDI+(Graphics)图像处理系列之图片压缩优化

简介笔者刚开始接触计算机时是在学校里,学校的网速你懂的,学校局域网里能有5MB/s,而访问学校以外的网站时能有256KB/s就相当满意了。那时候笔者在开发网站时,处理图片时就特别小心,能用gif的不用...
  • lhtzbj12
  • lhtzbj12
  • 2017年01月06日 21:55
  • 2178

c# 无损高质量压缩图片代码

/// /// 无损压缩图片 /// /// 原图片 /// 压缩后保存位置 /// 高度 ...
  • qq_16542775
  • qq_16542775
  • 2016年06月30日 17:39
  • 11543

java 图片批量裁剪 源代码

java 图片批量裁剪 源代码
  • zengxx1989
  • zengxx1989
  • 2015年07月14日 23:02
  • 704

图片剪纸刀 (批量图片分割处理)cutterV2.0-图片任意裁剪

  • 2011年06月02日 23:06
  • 3.56MB
  • 下载

用C#开发一个WinForm版的批量图片压缩工具

原文: http://blog.csdn.net/chinacsharper/article/details/9865491 我们在实际项目开发过程中,曾经遇到过一个需求,就是要开发一个对大量图片进...
  • qq1162195421
  • qq1162195421
  • 2013年12月11日 22:14
  • 798

C#winform批量给图片加水印代码

//form后台 using System; using System.Collections.Generic; using System.ComponentModel; using System.D...
  • pukuimin1226
  • pukuimin1226
  • 2013年08月23日 22:52
  • 3722

opencv、python批量剪切图片

做图像处理需要大批量的修改图片尺寸来做训练样本,为此本程序借助opencv来实现大批量的剪切图片。 import cv2 import os def cutimage(dir,suffix): f...
  • EDS95
  • EDS95
  • 2017年03月30日 16:29
  • 4255
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C#开发一个WinForm版的批量图片压缩工具
举报原因:
原因补充:

(最多只允许输入30个字)