C# Winform版批量压缩图片程序

本文介绍了如何使用C# Winform开发一个批量压缩图片的程序,详细讲解了需求背景、实现思路以及代码实现过程。针对图片尺寸过大和品质过高的情况,采取了调整尺寸和品质的双重压缩策略,并在压缩过程中处理了文件遍历、图片信息获取、异常处理等关键步骤,最终实现了稳定且高效的批量压缩功能。
摘要由CSDN通过智能技术生成

需求

上周,领导给我分配了一个需求:服务器上的图片文件非常大,每天要用掉两个G的大小的空间,要做一个自动压缩图片的工具处理这些大图片。领导的思路是这样的:

1)打开一个图片,看它的属性里面象素是多少,大于1000就按比例缩小到1000。

2)再看它的品质属性,比如我们标准是50,如果大于这个值再修改品质。

压缩后的文件大小不能超过200k。

思路

因为服务器上的图片文件名是加密处理过的,和图片文件一起存在的还有其它附件,没有后缀名,用肉眼根本看不出来是否是图片文件。所以刚开始的时候,我的思路是先批量修改后缀名,再获取图片的像素,最后再进行压缩。后来在做的过程中,发现不用处理后缀名,直接获取图片信息就能识别文件是否是图片。

所以,最后的做法是:

1)遍历文件夹下的图片文件的时候,先根据图片信息,把图片文件提取到列表

2)然后再根据图片的像素大小进行处理。像素在1000以内的直接修改图片品质处理,像素大于1000的按尺寸大小压缩图片,然后再修改图片品质处理。

(像素大于1000这种情况之所以有两步是因为按尺寸大小进行压缩后,图片大小大于1M,不符合预期的要求,所以压缩图片后再修改图片品质。这一步为了避免混淆,我把按尺寸大小压缩图片放到另一个文件夹处理,这个文件夹在处理好图片后,会把压缩图片文件进行删除,所以这个文件夹永远是空的,不会占空间)

//做的时候一听到是自动压缩图片,批量处理文件,以为很难,很深奥,真正动手后其实是办法总比困难多。总有办法实现的,只是时间问题。

代码片段

1)因为文件的位置不固定,文件夹下面有图片,也有文件夹,里面还有图片。所以要遍历子目录。

        /// <summary>
        /// 遍历文件
        /// </summary>
        /// <param name="di"></param>
        public void ListFiles(DirectoryInfo di)
        {
            if (!di.Exists)
            {
                return;
            }

            if (di == null)
            {
                return;
            }

            //返回当前目录的文件列表
            FileInfo[] files = di.GetFiles();

            for (int i = 0; i < files.Length; i++)
            {

                try
                {
                    //判断是否具有照片信息,报错即不是照片文件
                    GetMetaData.GetExifByMe(files[i].FullName);

                    //把图片文件添加到列表视图
                    this.lvSourceFolderList.Items.Add(files[i].FullName);

                    //把图片文件添加到图片列表
                    imageList.Add(files[i].FullName);

                }
                catch (Exception)
                {
                    //Logging.Error(System.IO.Path.GetFileName(files[i].FullName) + ",非图片文件," + ex.Message);
                    continue;
                }

            }
            this.lbInfomation.Text = "共" + this.lvSourceFolderList.Items.Count + "条数据";
            //返回当前目录的子目录
            DirectoryInfo[] dis = di.GetDirectories();

            for (int j = 0; j < dis.Length; j++)
            {
                // Console.WriteLine("目录:" + dis[j].FullName);
                ListFiles(dis[j]);//对于子目录,进行递归调用
            }

        }

2)判断图片是否具有照片信息,我用的是MetadataExtractor,直接在nuget里面添加安装好,再添加一个GetExifByMe即可。这里在调用GetExifByMe的时候,不是图片文件会报错,报错的我直接忽略,继续continue。

  //判断是否具有照片信息,报错即不是照片文件
   GetMetaData.GetExifByMe(files[i].FullName);
        #regi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值