像PS,QQ影像等都有该功能,将图片大小压缩至指定kb以下。

  我也来山寨一把,到目前为止,控制图片的大小,平时的解决方案通过分辨率和质量来控制的。

  假定最后压缩的大小是100kb,那么在保证不大于100kb的前提下,图片质量尽可能高。图片质量越高,图片占用大小就越大。但是大小与质量的关系,没有一个固定的公式,如y= nx 之类的,而且我也试过将win7系统的图片收藏夹的图,每一张保存10次,从质量为10,递增到100,发现只能得出之前的结论,图片质量高,占用大小就大。

  既然这样,那只能找到满足1ookb大小的最合适的质量参数了。这里使用了二分法来查找。

        /// <summary>/// 压缩图片至n Kb以下/// </summary>/// <param name="img">图片</param>/// <param name="format">图片格式</param>/// <param name="targetLen">压缩后大小</param>/// <param name="srcLen">原始大小</param>/// <returns>压缩后的图片内存流</returns>public static MemoryStream Zip(Image img, ImageFormat format, long targetLen, long srcLen = 0){//设置允许大小偏差幅度 默认10kbconst 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);return ms;}//获取目标大小最低值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);}return ms;}

测试过程中发现,每张图的处理时间差不多为1s。完成需求,倒是没问题,但总觉得是不是应该有更合适的方案呢,如果有知道的朋友,欢迎提供知了一起探讨!

测试代码下载

压缩图片大小至指定Kb以下相关推荐

  1. 怎么压缩图片大小到指定kb?如何自定义图片压缩大小?

    大多网络平台对用户发布的图片大小是有规定的,如果想要发布高清大图的话,需要把图片缩小kb到平台规定大小.那么有没有自定义压缩图片大小的方法呢?下面分享一款图片压缩指定大小(图片压缩到指定大小 图片压缩 ...

  2. 【问题帖】压缩图片大小至指定Kb以下

    像PS,QQ影像等都有该功能,将图片大小压缩至指定kb以下. 我也来山寨一把,到目前为止,控制图片的大小,平时的解决方案通过分辨率和质量来控制的. 假定最后压缩的大小是100kb,那么在保证不大于10 ...

  3. 图片压缩怎么在线处理?如何压缩图片大小kb?

    有没有在线图片压缩(https://www.yasuola.com)的工具直接压缩图片大小kb呢?在这里我们推荐使用压缩啦的图片压缩在线处理功能,用起来十分的方便,小白也可以轻松上手,一起来看看吧. ...

  4. 如何将图片压缩到指定大小?压缩图片大小的方法

    很多报名平台都对图片大小有固定的数值要求,所以不少小伙伴来问,怎么压缩图片200k以下(图片压缩到指定大小 图片压缩大小至指定kb以下-压缩图)?想要把图片压缩指定大小就要用到一些比较专业的工具,今天 ...

  5. 如何降低图片kb大小?教你两个快速压缩图片大小的方法!

    我们在日常拍照过程中可能不注意照片kb大小,但当需要发送照片时,会发现照片太大不方便传送.或者当你需要上传到一些需要照片大小的场景时,找到照片kb太大了,上传不了,需要降低照片kb大小,这时候就要进行 ...

  6. 如何快速在线压缩图片大小(包括放大、缩小图片,指定图片尺寸和压缩图片品质)

    在日常的学习和工作中,我们经常会遇到压缩和修改图片大小的问题,如果我们不是专业的设计人员,一般电脑上不会安装ps软件,那么我们如何通过网页,在线快速简单的来完成操作呢?下面小编和大家一块分享下具体如何 ...

  7. 电脑怎么压缩图片大小kb?图片太大怎么缩小kb?

    相信大家在平时都会使用到图片,在需要将图片上传到某些平台使用的时候应该都会遇到由于图片太大上传失败的情况,这时我们就需要先压缩图片大小后再进行使用了,那么如何快速将图片压缩呢?今天来给大家分享一款非常 ...

  8. 图片的大小kb与什么有关?如何有效压缩图片大小?

    图片是我们在平时的生活中经常需要使用到的东西,但是在使用图片的时候经常会遇到图片太大无法上传的问题,那么图片大小与什么有关呢?如果需要使用的图片过大应该如何压缩图片呢?今天就来为大家具体介绍一下. 图 ...

  9. 如何将图片调整为固定大小?怎么自定义压缩图片大小?

    很多平台对用户发布的图片大小是有规定的.如果我们发布的图片太大的话,就需要对图片进行压缩处理了.想要缩小图片kb可以使用压缩图的图片压缩指定大小(图片压缩到指定大小 图片压缩大小至指定kb以下-压缩图 ...

最新文章

  1. supervisor 管理进程
  2. Indy10收发Hotmail邮件
  3. 教你怎么上传本地代码到github
  4. 没什么本钱怎么做生意?
  5. linux 行首加特定字符串,【Linux】行首、行尾添加字符串
  6. pb模型文件与.pbtxt配置不匹配导致OpenCV调用dnn模块出错(Mask R-CNN为例)
  7. 蝴蝶蓝暂排第一:第四届橙瓜网络文学奖20年十佳游戏大神
  8. 使用ntop监控局域网网络流量
  9. 洪磊父亲详述被拘细节:银行卡共100万
  10. Freeswitch呼入及呼出录音问题
  11. 【C语言--斐波拉契数列】
  12. Android Adb命令(4) - ps 查看进程信息
  13. 网页上ajax异步加载数据,网页的异步请求(Ajax)
  14. LaTex 插入图片技巧
  15. android 短视频编辑,短视频编辑制作大师
  16. 单曲循环 翻译_Loop, repeat and replay “单曲循环” 用哪个词?
  17. cv曲线面积的意义_【CV现状-3.1】图像分割
  18. oppo版root软件获取,oppo如何获取root
  19. IINA for Mac(万能视频播放器)中文版
  20. 考研数学二大纲22年考研

热门文章

  1. 第13节 eclipse简介
  2. 【C语言入门简单程序】三子棋——新手轻松学
  3. 腾讯首次攻破屏下指纹识别技术;苹果新Mac Pro最贵将卖到4.2万;Haxe 4.0发布 | 极客头条...
  4. SAP FICO 固定资产的四种折旧方式
  5. 微信公众平台官方接口
  6. 对一个公益项目的探究(r8笔记第65天)
  7. 第1章第1节:启动PowerPoint并创建和放映幻灯片 [PowerPoint精美幻灯片实战教程]
  8. 华为云服务器型号解析——通用计算型
  9. STM32模拟IIC读取PCF8563
  10. 支付系统就该这么设计(万能通用),稳的一批!