代码之家  ›  专栏  ›  技术社区  ›  Mathew

PNG优化工具

  •  11
  • Mathew  · 技术社区  · 15 年前

    不久前,我使用了一个名为(我认为)“弄脏它”的PNG优化服务。你给它一个网络链接,它返回了所有PNG图像的压缩文件大小很好,嗯,弄脏了…

    我想实现一个类似的优化特性,作为我网站的图片上传过程的一部分;有人知道我可以利用一个预先存在的库(最好是php或python)吗?一个简短的谷歌已经向我指出了几个命令行风格的工具,但如果可能的话,我宁愿不走这条路。

    4 回复  |  直到 15 年前
        1
  •  14
  •   Burntime    15 年前

    使用php执行此命令行工具

      pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB -brute -l 9 -max -reduce -m 0 -q IMAGE
      optipng -o7 -q pngout.png
      pngout pngout.png -q -y -k0 -s0
      advpng -z -4 pngout.png > /dev/null
    
        2
  •  3
  •   Mike    15 年前

    只要您的PHP是用gd2支持编译的(现在很常见):

    <?php
    $image = imagecreatefromstring(file_get_contents('/path/to/image.original.png'));
    imagepng($image, '/path/to/image.smushed.png', 9);
    

    这将以任何图像格式读取gd2理解(而不仅仅是png),并输出一个gzipped为最大压缩级别的png,而不会牺牲质量。

    不过,现在它的使用可能比几年前要少;大多数图像编辑器已经这样做了,因为gzip的CPU开销并不像以前那么高。

        3
  •  2
  •   Kache    15 年前

    你听说过PNGCRUSH吗?你可以查一下来源 PNG and MNG Tools at SourceForge ,并用python对其进行转录或包装。

        4
  •  2
  •   David Jones Jake Shorty    15 年前

    我会质疑扔掉其他块(如gama和iccp)的明智性,但如果这就是你想要做的,那就相当容易使用了。 PyPNG 要删除块:

    #!/usr/bin/env python
    import png
    import sys
    
    input=sys.stdin
    out=sys.stdout
    
    def critical_chunks(chunks):
        for type,data in chunks:
            if type[0].isupper():
                yield type,data
    
    chunks = png.Reader(file=input).chunks()
    png.write_chunks(out, critical_chunks(chunks))
    

    critical_chunks函数基本上是过滤掉除关键PNG块之外的所有块(关键块的4个字母类型以大写字母开头)。