雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

c#无损压缩图片代码,可设置压缩质量

2024-10-16 19

之前写过一篇文章《使用htmlagilitypack+xpath抓取网页内容示例》,提到使用htmlagilitypack抓取网页信息。想做一个网络爬虫,但是想把网页上的图片也下载到本地,于是写了下载图片的功能。但是第三方网站上的图片大小尺寸各异,有些特别大,考虑到磁盘空间和大小统一,便需要图片的等比例缩放和压缩。

直接上代码吧:

/// <summary>
/// 图片设置大小并压缩
/// </summary>
/// <param name="iSource">源图片</param>
/// <param name="dFile">压缩后保存位置</param>
/// <param name="flag">压缩质量(数字越小压缩率越高) 1-100</param>
/// <param name="maxWidth">最大宽度(如果图片的宽度大于这个值就等比例缩放)</param>
/// <returns></returns>
public static bool Compress(Image iSource, string dFile,  int flag,int maxWidth)
{
    ImageFormat tFormat = iSource.RawFormat;
    int newW = 0, newH = 0;
    if (iSource.Width > maxWidth)
    {
        newW = maxWidth;
        newH = maxWidth * iSource.Height / iSource.Width;
    }
    else {
        newW = iSource.Width;
        newH = iSource.Height;
    }
    //按比例缩放
    using (Bitmap ob = new Bitmap(newW, newH)) {
        using (Graphics g = Graphics.FromImage(ob)) {
            g.Clear(Color.WhiteSmoke);
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.DrawImage(iSource, new Rectangle(0, 0, newW, newH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
            g.Dispose();
            //以下代码为保存图片时,设置压缩质量  
            EncoderParameters ep = new EncoderParameters();
            long[] qy = new long[1];
            qy[0] = flag;//设置压缩的比例1-100  
            EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
            ep.Param[0] = eParam;
            try
            {
                ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo jpegICIinfo = null;
                for (int x = 0; x < arrayICI.Length; x++)
                {
                    if (arrayICI[x].FormatDescription.Equals("JPEG"))
                    {
                        jpegICIinfo = arrayICI[x];
                        break;
                    }
                }
                if (jpegICIinfo != null)
                {
                    ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径  
                }
                else
                {
                    ob.Save(dFile, tFormat);
                }
                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                iSource.Dispose();
                ob.Dispose();
            }
        }
    }
}

这里有个签名是最大宽度,意思是如果原来图片的宽度大于这个值的话就按这个宽度等比例缩放后压缩,否则就按原来的尺寸压缩。

实测下来发现,原来已经很小的图片,效果不明显,如果很大的图片效果还是很明显的。如图所示,原来一张2M多的图片,按90质量压缩后,大小为1439kb,如果设置宽度800再按96质量压缩后仅为250,并且三张图片肉眼看不出有什么质量损失。

那么压缩质量如何控制呢,我这里也做了测试,分别按80,60,40来压缩,大家可以看下下面三张图。分别是原图(126kb),80质量(97kb),60质量(64kb),40质量(49kb)的图。

大家可以根据需要调整压缩质量,粗略来看调整到40后,肉眼看上去还是相当清晰接近无损的。

更新于:20天前
赞一波!

文章评论

评论问答