• <tr id='xvfe6'><strong id='xvfe6'></strong><small id='xvfe6'></small><button id='xvfe6'></button><li id='xvfe6'><noscript id='xvfe6'><big id='xvfe6'></big><dt id='xvfe6'></dt></noscript></li></tr><ol id='xvfe6'><table id='xvfe6'><blockquote id='xvfe6'><tbody id='xvfe6'></tbody></blockquote></table></ol><u id='xvfe6'></u><kbd id='xvfe6'><kbd id='xvfe6'></kbd></kbd>

    <code id='xvfe6'><strong id='xvfe6'></strong></code>
  • <i id='xvfe6'></i>
    <i id='xvfe6'><div id='xvfe6'><ins id='xvfe6'></ins></div></i>
    <dl id='xvfe6'></dl>

          <ins id='xvfe6'></ins>

            <acronym id='xvfe6'><em id='xvfe6'></em><td id='xvfe6'><div id='xvfe6'></div></td></acronym><address id='xvfe6'><big id='xvfe6'><big id='xvfe6'></big><legend id='xvfe6'></legend></big></address>

          1. <fieldset id='xvfe6'></fieldset>
          2. <span id='xvfe6'></span>

            质量监控-图片减包

            • 时间:
            • 浏览:3
            • 来源:124软件资讯网

              文章链接

              经由多个版本迭代 ,项目在release设置下的打包体积依旧轻松破百  ,应用体积过大导致的问题包罗:

              • 更长的构建时间  ,换个词就是加班

              • TEXT段体积过大会导致审核失败

              • 用户不愿意下载应用

              通常来说  ,资源文件能在应用体积包中占有1/3或者更多的体积 ,相比起代码(5kb/千行)的平均占用来说  ,对图片举行减包是最直接高效的手段  ,对图片资源的处置惩罚方式包罗四种:

              1. 通过请求下载大图

              2. 使用工具压缩图片

              3. 查找删除重复图片

              4. 查找复用相似图片

              思量到由于项目开发分工的问题  ,方式1需要推动落地  ,以是本文不讨论这种处置惩罚方式  。其他三种都能通过编写剧本实现自动化处置惩罚

              图片压缩

              图片压缩分为有损压缩和无损压缩两类  ,有损压缩放弃了一部门图片的质量换取更高的压缩比  。网上主流的压缩工具有tinypng、pngquant、ImageAlpha和ImageOptim等 ,划分接纳了一种或者多种压缩手艺完成图片压缩

              为什么png能够无损压缩

              由于png花样的天真性  ,统一张图片可以使用多种方式举行表现 ,差别方式占用的巨细纷歧样  。一样平常的软件会接纳效率更高的方式来表现图片 ,以是这种情形下png图片存在庞大的优化空间  。通常来说  ,从png文件中能去除的数据包罗:

              • iTXt、tEXt和zTXt这些可以存储恣意文本的数据区段

              • iCCP数据区段存储的profile等等

              • photoshop导出的png图片存在大量的分外信息

              png图片有两种类型的数据块  ,一种是必不行缺的数据块称为要害数据块 。另一种叫做辅助数据块 ,png文件花样规范指定的辅助数据块包罗:

              • 配景颜色数据块bKGD

              • 基色和白色数据块cHRM

              • 图像γ数据块gAMA

              • 图像直方图数据块hIST

              • 物理像素尺寸数据块pHYs

              • 样本有用位数据块sBIT

              • 文本信息数据块tEXt

              • 图像最后修改时间数据块tIME

              • 图像透明数据块tRNS

              • 压缩文本数据块zTXt

              其中tEXt和zTXt数据段中存在的数据包罗:

              要害字
              Title图像名称
              Author图像作者
              Description图像说明
              Copyright版权声明
              CreationTime原图创作时间
              Software创作图像使用的软件
              Disclaimer弃权
              Warning图像内容忠告
              Source创作图像使用的装备
              Comment注释信息

              由上可见 ,辅助数据块在png文件中可能占有了极大的篇幅  ,正是这些数据块组成了png的无损压缩条件

              tinypng

              tinypng接纳了一种称作Quantization的压缩手艺  ,通过合并图片中相似的颜色  ,将24bit的图片文件压缩成8bit图片  ,同时去除图片中不须要的元数据  ,图片最高能到达70%以上的压缩率  。停止文章完成之前  ,tinypng仅提供了线上压缩功效  ,暂未提供工具下载

              pngquant

              凭据官方先容  ,pngquant将24bit以上的图片转换成8bit的保留透明度通道的压缩图片  ,压缩算法的压缩比很是显著 ,通常都能淘汰70%的巨细 。pngquant提供了下令行工具来完成解压使命:

              pngquant --quality=0-100 imagepath

              下令行更多调试参数可以在官网参阅

              ImageAlpha

              ImageAlpha是一个macOS系统下的有损图片压缩工具  ,内置了pngquant、pngnq-s9等多个压缩工具  ,多数情形下通过将图片降至8bit来获取高压缩比 。由于ImageAlpha的可视化界面无法批量处置惩罚图片  ,直接使用提供的下令工具可以实现批量压缩图片:

              for file in $(ls $1); do
                  imagepath=$1"/"$file
                  if [ -d imagepath ]
                  then
                      /// 路径为文件夹
                  else
                      if [[ $file == *.png ]]
                      then
                          beforeSize=`ls -l $imagepath | awk '{print $5}'`
                          /Applications/ImageAlpha.app/Contents/MacOS/pngquant $imagepath
                          afterSize=`ls -l ${imagepath/.png/-fs8.png} | awk '{print $5}'`
                          
                          if [[ $afterSize -lt $beforeSize]]
                          then
                              mv ${imagepath/.png/-fs8.png} $imagepath
                          fi
                      fi
                  fi
              done

              使用ImageAlpha需要注重两点:

              1. 压缩后的图片命名会自动添加-fs8后缀  ,需要使用mv下令实现替换

              2. 有损压缩会修改要害数据块  ,可能导致压缩图片尺寸增大  ,需要过滤

              在使用有损压缩时需要注重单张png图片是可以被多次压缩的  ,但这会导致图片的清晰度和色彩都受到影响  ,不建议对图片凌驾一次以上的有损压缩

              ImageOptim

              ImageOptim是先容的四种工具中唯一的无损压缩  ,它接纳了包罗去除exif信息、重新排列像素存储方式等手段实现图片的压缩  。无损代表着一张图片被ImageOptim压缩后  ,后续无法再次举行压缩  ,同时它的压缩比往往比不上其他的有损压缩方案 ,但最大水平上保证了图片的原始清晰度和色彩

              for file in $(ls $1); do
                  imagepath=$1"/"$file
                  if [ -d imagepath ]
                  then
                      /// 路径为文件夹
                  else
                      if [[ $file == *.png ]]
                      then
                          /Applications/ImageOptim.app/Contents/MacOS/ImageOptim $imagepath
                      fi
                  fi
              done

              ImageOptim同样存在可视化的工具而且支持批量压缩图片

              多方案对比

              思量到ImageAlpha险些都是使用pngquant作为压缩工具  ,因此只列出三种压缩工具的对比:

              原始尺寸压缩工具压缩后尺寸压缩比
              319.5KBtinypng120.5KB62%
              319.5KBImageAlpha-pngquant395KB-24%
              319.5KBImageOptim252KB21%

              测试图片接纳qq谈天截图天生的png  ,tinypng压缩率很是高  ,而pngquant的体现不尽人意

              删除重复图片

              通常来说  ,泛起重复图片的缘故原由包罗模块间需求开发没有买通或是缺少统一的图片命名规范 。通过图片MD5摘要是识别重复图片的最快要领  ,以python为例  ,匹配重复图片的代码如下:

              md5list = {}
              for file in files:
                  if os.path.isdir(file.path):
                      continue
                      
                  md5obj = hashlib.md5()
                  fd = open(file.path, 'rb')
                  while True:
                      buff = fd.read(2048)
                      if not buff:
                          break
                      md5obj.update(buff)
                  fd.close()
                  
                  filemd5 = str(md5obj.hexdigest()).lower()
                  if filemd5 in md5list:
                      md5list[filemd5].add(file.path)
                  else:
                      md5list[filemd5] = set([file.path])
                      
              for key in md5list:
                  list = md5list[key]
                  if len(list) > 1:
                      print (list)

              遍历中以文件MD5字符串作为key ,维护具备相同MD5的图片路径 ,最后遍历这个map查找存在一个以上路径的数组而且输出

              寻找相似图片

              相似图片在图片内容、色彩上都十分的靠近  ,多数时间可以思量复用这些图片  ,但相似图片的问题在于无法通过MD5直接匹配 。为了确认两个图片是否相似  ,要使用简朴的一个数学公式来帮助查找: