c# 无损高质量压缩图片代码「建议收藏」

c# 无损高质量压缩图片代码「建议收藏」最近,项目上涉及到了图像压缩,发现原有的图像压缩功能,虽然保证了图像的大小300K以内,但是压缩后的图像看的不在清晰,并且,限定了图片的Heig

大家好,欢迎来到IT知识分享网。

最近,项目上涉及到了图像压缩,发现原有的图像压缩功能,虽然保证了图像的大小300K以内,但是压缩后的图像看的不在清晰,并且,限定了图片的Height或者是Width。

在CSDN上看到了一个压缩算法:http://blog.csdn.net/qq_16542775/article/details/51792149

经过测试这个算法,发现,将原始图像的大小进行对半处理,然后迭代跳转压缩质量参数,可以得到不错的效果。

修改后的算法如下:

c# 无损高质量压缩图片代码「建议收藏」

/// <summary>/// 无损压缩图片/// </summary>/// <param name="sFile">原图片地址</param>/// <param name="dFile">压缩后保存图片地址</param>/// <param name="flag">压缩质量(数字越小压缩率越高)1-100</param>/// <param name="size">压缩后图片的最大大小</param>/// <param name="sfsc">是否是第一次调用</param>/// <returns></returns>public static bool CompressImage(string sFile, string dFile, int flag = 90, int size = 300, bool sfsc = true){//如果是第一次调用,原始图像的大小小于要压缩的大小,则直接复制文件,并且返回true    FileInfo firstFileInfo = new FileInfo(sFile);    if (sfsc == true && firstFileInfo.Length < size * 1024)    {        firstFileInfo.CopyTo(dFile);        return true;    }    Image iSource = Image.FromFile(sFile);    ImageFormat tFormat = iSource.RawFormat;

IT知识分享网

IT知识分享网int dHeight = iSource.Height / 2;
    int dWidth = iSource.Width / 2;
    int sW = 0, sH = 0;
    //按比例缩放
    Size tem_size = new Size(iSource.Width, iSource.Height);
    if (tem_size.Width > dHeight || tem_size.Width > dWidth)
    {
        if ((tem_size.Width * dHeight) > (tem_size.Width * dWidth))
        {
            sW = dWidth;
            sH = (dWidth * tem_size.Height) / tem_size.Width;
        }
        else
        {
            sH = dHeight;
            sW = (tem_size.Width * dHeight) / tem_size.Height;
        }
    }
    else
    {
        sW = tem_size.Width;
        sH = tem_size.Height;
    }

    Bitmap ob = new Bitmap(dWidth, dHeight);
    Graphics g = Graphics.FromImage(ob);

    g.Clear(Color.WhiteSmoke);
    g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 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是压缩后的新路径
            FileInfo fi = new FileInfo(dFile);
            if (fi.Length > 1024 * size)
            {
                flag = flag - 10;
                CompressImage(sFile, dFile, flag, size, false);
            }
        }
        else
        {
            ob.Save(dFile, tFormat);
        }
        return true;
    }
    catch
    {
        return false;
    }
    finally
    {
        iSource.Dispose();
        ob.Dispose();
    }
}
c# 无损高质量压缩图片代码「建议收藏」

效果图如下:

第一张的大小是2.82M,尺寸是3680*4640。

c# 无损高质量压缩图片代码「建议收藏」

第二张的大小是274KB,尺寸是1740*2320,清晰度方面还是不错的。

c# 无损高质量压缩图片代码「建议收藏」

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/6777.html

(0)
上一篇 2022-12-20 16:50
下一篇 2022-12-20 17:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信