V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
abelyao
V2EX  ›  问与答

有什么 JPG 压缩库 可以达到接近 TinyPNG 的效果

  •  
  •   abelyao · 2021-03-22 16:50:52 +08:00 · 3392 次点击
    这是一个创建于 1347 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一张 23.8M 的照片,通过 TinyPNG 可以压缩到 2M,但 Tinify API 限制每月 500 次免费,限制手头上有将近 20000 张图要处理。

    试过 node.js 的几个库,包括:
    - sharp
    - imagemin + jpegtran
    - imagemin + mozjpeg

    如果指定输出质量在 100 则顶多就比原图小 1-2M,和 TinyPNG 对比还是差异巨大。虽然不知道 TinyPNG 压缩后的 jpg 质量是多少,但肉眼看的差距极其细微。

    各位大佬有没有什么压缩 jpg 的库推荐一下,node.js / php / c-sharp 的都可以,或者桌面软件也行。

    最好最好,希望是大佬亲自使用过、对比过的,非常感谢!
    29 条回复    2021-03-23 11:10:58 +08:00
    66beta
        1
    66beta  
       2021-03-22 17:04:53 +08:00
    jpg 压缩损失巨大
    参考同类问题: https://www.v2ex.com/t/508416

    photoshop 的批处理考虑一下,质量选 70 感觉是极限了
    alexkkaa
        2
    alexkkaa  
       2021-03-22 17:13:38 +08:00 via Android
    输出质量在 100, 你这个要求体积没办法缩啊。
    abelyao
        3
    abelyao  
    OP
       2021-03-22 17:28:42 +08:00
    @alexkkaa @66beta

    就如我在主贴说的,我不确定 TinyPNG 给的图片质量是多少,但无论我设置多少输出质量,要么比 TinyPNG 的结果大很多、要么比它失真很多。

    换而言之,如果我选定一个肉眼上看起来跟 TinyPNG 结果差不多的质量,那图片体积可能是 TinyPNG 的三五倍;而如果选一个体积差不多的质量,则肉眼可见的失真非常大。

    所以很头疼…
    66beta
        4
    66beta  
       2021-03-22 17:30:42 +08:00
    @abelyao PNG 损失少很多,你现在是 jpg,就很难了
    youthfire
        5
    youthfire  
       2021-03-22 17:42:20 +08:00
    有没有试过 ImageOptim,质量控制在 90%或者 80%?
    lonewolfakela
        6
    lonewolfakela  
       2021-03-22 17:53:51 +08:00
    先确认一个问题:当你说“TinyPNG”的时候,你是不是其实想指的是 tinypng 网站上提供的 jpg 压缩功能而不是 png 压缩功能,或者换句话说,你想要的(以及在题目里作为对比的)其实是 TinyJPG ?
    dawangyezi
        7
    dawangyezi  
       2021-03-22 17:55:13 +08:00
    从文件格式角度比较好解释这个问题:

    * jpg 是基于整个图像中的区块使用压缩算法压缩后保存的。
    * png 文件标准中有多种格式
    o 调色板模式。文件头保存一个颜色表,然后保存每个像素的时候只存储颜色表索引
    o 灰度图模式,如果你的图像是灰度的(有亮度的黑白),只需要保存每个像素点的亮度。
    o 二值模式。假设你的图像只有黑和白,比如曲谱。那你可以用 1 个 bit 位保存一个像素点。
    o 全彩模式,和 jpg 相同。
    o 动图

    因为日常使用的 png 大多是全彩模式的。tinyPNG 后端应使用的 pngquant 命令行工具或者相同的算法,将全彩模式的 png 图转换成调色板模式。这样,就可以通过减少颜色数量来达到降低质量,压缩图片的目的。

    如果你确实有批量压缩质量的需求,可以先用工具批量转换成 png 再压缩图像质量。
    批量处理图像可以用 imgmagic 工具组
    lonewolfakela
        8
    lonewolfakela  
       2021-03-22 17:57:35 +08:00
    @zhangyufei49 虽然楼主说的是 TinyPNG,但是我严重怀疑他一直就是指的是 TinyJPG,因为他说了什么“TinyPNG 压缩后的 jpg 质量”之类的。所以整个帖子的问题和 PNG 其实没啥关系,就是想找个好点的 JPEG 优化编码工具
    wdy3334
        9
    wdy3334  
       2021-03-22 18:00:46 +08:00
    TinyPNG 有 ps 插件版吧 那个没有限制次数吧
    dawangyezi
        10
    dawangyezi  
       2021-03-22 18:03:22 +08:00
    再补充几个实用的说明:

    1. 怎么选择用 png 还是 jpg
    如果有透明通道,就用 png 。没有透明通道,图片中的颜色又很多,比如拍摄的大自然风景,用 jpg 。

    2. 怎么选择 png 模式

    颜色数量很少,有大面积的色块。比如动漫卡通,用调色板模式。
    黑白照片,用灰度模式。
    用作游戏动画中的遮照层,或者黑白曲谱(不需要抗锯齿),AI 轮廓识别,用二值图。
    全彩模式适用日常图片。尤其在游戏和 app 资源中适用。
    abelyao
        11
    abelyao  
    OP
       2021-03-22 18:34:50 +08:00 via iPhone
    @lonewolfakela

    其实我用的是 Tinify 这个域名的接口,因为 TinyPNG / TinyJPG 在线版限制最大图片体积为 5M 。

    TinyPNG 和 TinyJPG 都是他们的品牌而已,实际不管通过哪个入口,都能压缩 jpg 图片,这里仅寻求 jpg 图片的压缩方案。
    abelyao
        12
    abelyao  
    OP
       2021-03-22 18:37:08 +08:00 via iPhone
    @youthfire

    试过的,在 ImageOptim 的选项界面可以看到,它在处理 jpg 时,也是用的我在主帖提到的两个插件,结果一样。
    abelyao
        13
    abelyao  
    OP
       2021-03-22 18:41:00 +08:00 via iPhone
    @wdy3334

    谢谢回复复。我希望优先寻找能集成在程序中的办法,因为还有其它自动化流程要做。

    另外我也不确定那个 PS 插件是不是联网处理的,如果是联网处理,上万张图上传再下载,也不是很优雅…
    love
        14
    love  
       2021-03-22 18:44:21 +08:00
    mozjpeg 为何要指定质量为 100 ??就不能指定到你能看出区别的分界点看看和 tinypng 大小差多少? tinypng 绝对不可能是 100
    dawangyezi
        15
    dawangyezi  
       2021-03-22 18:49:59 +08:00
    @lonewolfakela 了解了, 那可以用这个: https://www.picdiet.com/zh-cn
    dawangyezi
        16
    dawangyezi  
       2021-03-22 18:54:21 +08:00
    @zhangyufei49 tinypng 压缩后的质量不是 100,放到到一定倍数就能看出来和原图的差异。你用的 imagemin + mozjpeg 就挺好,
    dawangyezi
        17
    dawangyezi  
       2021-03-22 18:59:00 +08:00
    @abelyao 可以用 imgemin + mozjpeg 这个方案。我对比了 tinypng 输出的颜色数量,你可以把质量调整到 65 - 70 之间
    superrichman
        18
    superrichman  
       2021-03-22 19:01:21 +08:00 via iPhone
    irfanview 转图片,里面能转各种格式,还有一堆参数,自己去折腾看哪个组合合适。
    abelyao
        19
    abelyao  
    OP
       2021-03-22 19:24:51 +08:00 via iPhone
    @love 看我在 #3 的回复
    oott123
        20
    oott123  
       2021-03-22 20:23:42 +08:00 via Android
    love
        21
    love  
       2021-03-22 22:10:43 +08:00
    @abelyao 那就无法了。如果是自用的话可以试试新一代的图象格式如 avif
    mon6912640
        22
    mon6912640  
       2021-03-22 22:30:13 +08:00 via Android
    一个账号每个月 500 次,当时我的做法是申请了十几个账号,把账号丢库里轮询执行
    duola
        23
    duola  
       2021-03-22 22:34:35 +08:00
    难道用谷歌的压缩不好用? https://squoosh.app/
    mon6912640
        24
    mon6912640  
       2021-03-22 22:38:16 +08:00   ❤️ 1
    两年前的代码,不知道现在还能不能执行,把申请的 key 往代码里面的一个数组变量丢就是了,只要我申请足够多的 key,就能白嫖到底
    https://github.com/mon6912640/TinyPngTool
    siknet
        25
    siknet  
       2021-03-22 23:36:18 +08:00 via Android
    riot win 下的软件,可以批量处理
    abelyao
        26
    abelyao  
    OP
       2021-03-23 00:24:36 +08:00
    @mon6912640 同个 IP 地址用几十个 key 轮番上不会触发什么屏蔽吗,稳定的话我也想试试了…
    ByteCat
        27
    ByteCat  
       2021-03-23 08:55:05 +08:00
    https://squoosh.app/
    Google 开源项目可以看看?
    abelyao
        28
    abelyao  
    OP
       2021-03-23 10:18:46 +08:00
    @ByteCat @duola

    从官网的在线版看,本质也是 MozJPEG
    xingshu1990
        29
    xingshu1990  
       2021-03-23 11:10:58 +08:00
    @abelyao #26 数量大的时候,上阿布云买 1 个小时的 IPdaili,IP 循环+上面帐号轮询。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5452 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 127ms · UTC 09:14 · PVG 17:14 · LAX 01:14 · JFK 04:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.