• C# 图片压缩


            /// <summary>
            /// 压缩图片至200 Kb以下,最小可压到30KB
            /// </summary>
            /// <param name="img">图片</param>
            /// <param name="format">图片格式</param>
            /// <param name="targetLen">压缩后大小</param>
            /// <param name="srcLen">原始大小</param>
            /// <returns>压缩后的图片</returns>
            public Image ZipImage(Image img, ImageFormat format, long targetLen, long srcLen = 0)
            {
                //设置大小偏差幅度 10kb
                const long nearlyLen = 10240;
                //内存流  如果参数中原图大小没有传递 则使用内存流读取
                var ms = new MemoryStream();
                if (0 == srcLen)
                {
                    img.Save(ms, format);
                    srcLen = ms.Length;
                }
    
                //单位 由Kb转为byte 若目标大小高于原图大小,则满足条件退出
                targetLen *= 1024;
                if (targetLen > srcLen)
                {
                    ms.SetLength(0);
                    ms.Position = 0;
                    img.Save(ms, format);
                    img = Image.FromStream(ms);
                    return img;
                }
    
                //获取目标大小最低值
                var exitLen = targetLen - nearlyLen;
    
                //初始化质量压缩参数 图像 内存流等
                var quality = (long)Math.Floor(100.00 * targetLen / srcLen);
                var parms = new EncoderParameters(1);
    
                //获取编码器信息
                ImageCodecInfo formatInfo = null;
                var encoders = ImageCodecInfo.GetImageEncoders();
                foreach (ImageCodecInfo icf in encoders)
                {
                    if (icf.FormatID == format.Guid)
                    {
                        formatInfo = icf;
                        break;
                    }
                }
    
                //使用二分法进行查找 最接近的质量参数
                long startQuality = quality;
                long endQuality = 100;
                quality = (startQuality + endQuality) / 2;
    
                while (true)
                {
                    //设置质量
                    parms.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
    
                    //清空内存流 然后保存图片
                    ms.SetLength(0);
                    ms.Position = 0;
                    img.Save(ms, formatInfo, parms);
    
                    //若压缩后大小低于目标大小,则满足条件退出
                    if (ms.Length >= exitLen && ms.Length <= targetLen)
                    {
                        break;
                    }
                    else if (startQuality >= endQuality) //区间相等无需再次计算
                    {
                        break;
                    }
                    else if (ms.Length < exitLen) //压缩过小,起始质量右移
                    {
                        startQuality = quality;
                    }
                    else //压缩过大 终止质量左移
                    {
                        endQuality = quality;
                    }
    
                    //重新设置质量参数 如果计算出来的质量没有发生变化,则终止查找。这样是为了避免重复计算情况{start:16,end:18} 和 {start:16,endQuality:17}
                    var newQuality = (startQuality + endQuality) / 2;
                    if (newQuality == quality)
                    {
                        break;
                    }
                    quality = newQuality;
                    //Console.WriteLine("start:{0} end:{1} current:{2}", startQuality, endQuality, quality);
                }
                img = Image.FromStream(ms);
                return img;
            }
    
            /// <summary>
            ///获取图片格式
            /// </summary>
            /// <param name="img">图片</param>
            /// <returns>默认返回JPEG</returns>
            public ImageFormat GetImageFormat(Image img)
            {
                if (img.RawFormat.Equals(ImageFormat.Jpeg))
                {
                    return ImageFormat.Jpeg;
                }
                if (img.RawFormat.Equals(ImageFormat.Gif))
                {
                    return ImageFormat.Gif;
                }
                if (img.RawFormat.Equals(ImageFormat.Png))
                {
                    return ImageFormat.Png;
                }
                if (img.RawFormat.Equals(ImageFormat.Bmp))
                {
                    return ImageFormat.Bmp;
                }
                return ImageFormat.Jpeg;//根据实际情况选择返回指定格式还是null
            }

    引用:https://blog.csdn.net/weixin_42953003/article/details/119751529

  • 相关阅读:
    java学习:字符串比较“==”与“equals”的差异及与c#的区别
    航空8联货运单的作用详解
    flash:二次贝塞尔曲线应用生成飞机路径示意图
    javascript:双链表插入排序
    javascript:算法笔记
    玩聚RT 加入对饭否的统计
    随手小记:创业瞎聊十点
    Python的win32serviceutil之疑似BUG
    撕书记忆法
    中文锐推榜优化·二
  • 原文地址:https://www.cnblogs.com/xbding/p/16358103.html
Copyright © 2020-2023  润新知