C# 优化的图片压缩

前言:

用了网上百度的图片压缩以后发现并不合适,
压缩参数 new EncoderParameter(Encoder encoder, long value) 的参数 value 和图片的大小并不是线性相关。
我也没有去深层研究内部构造,根据试参,重新写了算法。

代码:

	/// <summary>
    /// 压缩图像
    /// </summary>
    /// <param name="image">需要压缩的图片</param>
    /// <param name="copyFileSize">不能大于多少(默认8M)</param>
    /// <param name="flag"></param>
    /// <returns></returns>
    public static Image CompressImage(
        this Image image, 
        int copyFileSize = 8388608, 
        double flag = 99)
    {
    
    
        var imgMs = new MemoryStream();
        image.Save(imgMs, image.RawFormat);
    
        if (imgMs.Length >= copyFileSize)
        {
    
    
            var bmp = new Bitmap(image);
            try
            {
    
    
                var imageCode = GetImageCoderInfo("image/jpeg");
                var eps = new EncoderParameters(1);
                var ep = new EncoderParameter(Encoder.Quality, (long)Math.Ceiling(flag));
                eps.Param[0] = ep;
    
                // 该流释放以后会报错
                var ms = new MemoryStream();
                bmp.Save(ms, imageCode, eps);
                bmp.Dispose();
                ep.Dispose();
                eps.Dispose();
                var newImg = Image.FromStream(ms);
                imgMs.Dispose();
                return CompressImage(newImg, copyFileSize, flag - 1);
            }
            catch
            {
    
    
                bmp.Dispose();
                imgMs.Dispose();
                return null;
            }
        }
        imgMs.Dispose();
        return image;
    }
    
    /// <summary>
    /// 获取图片编码类型信息
    /// </summary>
    /// <param name="codeType"></param>
    /// <returns></returns>
    private static ImageCodecInfo GetImageCoderInfo(string codeType)
    {
    
    
        var codeInfos = ImageCodecInfo.GetImageEncoders();
        ImageCodecInfo codeInfo = null;
        foreach (var codeItem in codeInfos)
        {
    
    
            if (codeItem.MimeType.Equals(codeType)) {
    
     codeInfo = codeItem; break; }
        }
        return codeInfo;
    }

调用时

    Image img = Image.FromFile("F:/1.jpg");
    // 压缩到小于8M
    Image newImg = img.CompressImage(8388608);
    newImg.Save("F:/2.jpg");
    newImg.Dispose();
    img.Dispose();

猜你喜欢

转载自blog.csdn.net/Upgrader/article/details/107190302
今日推荐