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

简介: 我们在实际项目开发过程中,曾经遇到过一个需求,就是要开发一个对大量图片进行整理(删除掉一些不符合要求的图片)、归类(根据格式进行分类,比如jpg格式、bmp格式等)、压缩(因为有的图片很大很占空间,看能否在保证清晰可辨、尺寸适中的前提下,适当的压缩掉一部分空间)的小程序。

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

目录
相关文章
|
5月前
|
NoSQL 程序员 API
解决 PHP PHP Startup: Unable to load dynamic library ‘ixed.8.0.lin’以及PHP版本的问题-优雅草卓伊凡
解决 PHP PHP Startup: Unable to load dynamic library ‘ixed.8.0.lin’以及PHP版本的问题-优雅草卓伊凡
167 5
解决 PHP PHP Startup: Unable to load dynamic library ‘ixed.8.0.lin’以及PHP版本的问题-优雅草卓伊凡
|
7月前
|
机器学习/深度学习 小程序 数据挖掘
Multi-Agent 的灵活编排之路
本文探讨了Copilot 3.0架构中规划模块结合DeepSeek R1强化学习(GRPO)的实践,重点分析多智能体架构下大模型如何灵活调度多个智能体解决实际问题。文章从背景、问题分析、Planning角色、难点、效果对比到解决方案进行了深入讲解,并通过实验现象展示了有无思考过程对模型性能的影响。结果显示,GRPO训练后推理长度显著降低,准确率提升7.4个百分点,同时解决了复杂问题与简单问题处理间的平衡问题。
674 11
Multi-Agent 的灵活编排之路
|
8月前
|
关系型数据库 Linux 数据库
2025 年 Odoo 安装与部署全攻略
本文介绍了 Odoo 的手工安装与自动化部署方案。手工安装需完成 Docker 安装、镜像拉取及容器运行,但存在安装复杂、配置困难、管理繁琐等问题。Websoft9 提供了自动化部署方案,通过控制台实现快速创建数据库、初始化环境和后台配置,大幅降低技术门槛,将部署时间从 2 小时缩短至 10 分钟。对比显示,Websoft9 在时间成本、技术要求和稳定性上更具优势,适合中小团队使用,助力企业聚焦业务流程优化。
1691 1
|
9月前
|
自然语言处理 安全 测试技术
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
568 0
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
|
数据采集 存储 数据可视化
基于Python 网络爬虫和可视化的房源信息的设计与实现
本文介绍了一个基于Python Scrapy框架和echart库的房源信息采集与可视化系统,该系统通过自动化爬虫提高房地产数据采集效率,并通过Flask服务器实现数据的Web可视化展示,旨在帮助房地产从业人员和政策制定者高效、直观地了解房源信息。
369 1
|
存储 Java 数据处理
Spring揭秘:ClassPathScanningProvider接口应用场景及实现原理!
ClassPathScanningCandidateComponentProvider是Spring框架中一个非常核心的类,它主要用于在类路径下扫描并发现带有特定注解的组件,支持诸如@ComponentScan、@Component、@Service、@Repository和@Controller等注解的自动扫描和注册。
468 0
Spring揭秘:ClassPathScanningProvider接口应用场景及实现原理!
|
定位技术
利用MultCloud在线复制传输不同网盘之间的数据:支持谷歌Drive、百度网盘等
利用MultCloud在线复制传输不同网盘之间的数据:支持谷歌Drive、百度网盘等
1192 2
|
监控 安全 测试技术
ms17-010(永恒之蓝)漏洞复现
ms17-010(永恒之蓝)利用的端口是445端口。 本文主要讲解ms17-010(永恒之蓝)漏洞复现,分为四个部分:了解渗透测试流程,使用nmap工具对win7进行扫描,尝试ms17-010漏洞利用,结果展示。第一部分“了解渗透测试流程”可以略过,可以直接从第二部分“使用nmap工具对win7进行扫描”开始看起。
2897 5
ms17-010(永恒之蓝)漏洞复现
|
Python
Python 串口发送十六进制数据
Python 串口发送十六进制数据
800 0
Python 串口发送十六进制数据