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

PHP 如何不损失图片质量的添加一个小水印,并且文件大小不会显著增加?

  •  
  •   DearTanker · 2015-01-16 16:00:35 +08:00 · 6542 次点击
    这是一个创建于 3625 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有没有比较好的库或者方法推荐,现在用imagick,图片质量设置100,处理后的图片是原图的好几倍。。设置低了有肉眼可见的损耗。。
    22 条回复    2015-01-16 22:16:15 +08:00
    yyfearth
        1
    yyfearth  
       2015-01-16 16:03:17 +08:00
    可以读取jpg文件的质量设置 然后根据每张图片自己的质量设置进行压缩 这样一般情况下图片不会变大太多 而且质量不会下降太多 但是不能保证
    对于其他格式的文件 那么就95%左右压缩成jpg好了
    DearTanker
        2
    DearTanker  
    OP
       2015-01-16 16:05:30 +08:00
    @yyfearth 这也行?imagick可以做到吗,但是问题是设置100也会因为超过图片自己的质量设置而变模糊吗?
    wowo2088
        3
    wowo2088  
       2015-01-16 16:06:42 +08:00
    对于jpeg来讲,不损失图片质量那是不可能的,你需要考虑的是可以接受的质量损失程度
    yyfearth
        4
    yyfearth  
       2015-01-16 16:10:06 +08:00
    @DearTanker 我记得jpg图片一般会存储质量设置 可能有库可以读取吧
    如果jpg文件之前已经用 < 100% 的设置压缩过 那么用100% 不会造成太大的损失
    只要大小不变 不会变模糊 但是会有轻微的损失
    其实一般情况下 95-98% 就基本上看不出来了

    只是如果一个jpg已经是80%一下压缩 你用>90%从新压缩就比较浪费了
    DearTanker
        5
    DearTanker  
    OP
       2015-01-16 16:13:34 +08:00
    @yyfearth 是的,但是怎么读取啊。。

    我刚看到一篇文章说,如果需要对一张jpg进行处理,要先把jpg转换成其他格式后进行处理,然后在最后一步保存出来,不知道这样做有没有道理。。
    http://floss.zoomquiet.io/data/20130822153054/index.html
    里面的“JPEG图像文件格式”

    @wowo2088
    wowo2088
        6
    wowo2088  
       2015-01-16 16:17:24 +08:00
    使用 GD
    $logoImage = ImageCreateFromPNG('logo.png'); // 装入 LOGO
    $photoImage = ImageCreateFromJpeg($file_name); // 装入一幅图象, 准备加盖水印
    ImageAlphaBlending($photoImage, true); // 设定图像的混色模式
    ImageCopy($photoImage, $logoImage, 0, 0, 0, 0, 200, 80); // 拷贝LOGO到图像中
    ImageJPEG($photoImage,$out_file,70); // 以 JPEG 格式将图像输出到浏览器或文件,70是图片质量
    ImageDestroy($photoImage); // 消除占用的资源
    ImageDestroy($logoImage);
    DearTanker
        7
    DearTanker  
    OP
       2015-01-16 16:20:55 +08:00
    @wowo2088 GD的效果会更好吗?
    DearTanker
        8
    DearTanker  
    OP
       2015-01-16 16:22:35 +08:00
    正在尝试 「原图jpg=》(伪原图png+水印)*质量=》水印图jpg」这个处理过程。。
    wowo2088
        9
    wowo2088  
       2015-01-16 16:22:50 +08:00
    @DearTanker GD 和 imagick 没比较过,我只用 GD ~ 呵呵
    jevonszmx
        10
    jevonszmx  
       2015-01-16 16:57:26 +08:00   ❤️ 1
    imagick 可以读取原压缩质量的
    linux命令是:identify -verbose 1.jpg,可以grep 'Quality'看结果;
    php扩展后命令是:getimagecompressionquality;

    注意:
    生成目标图片的质量是:

    (水印后的图质量比)* 要生成的图片质量比 / 100

    <?php
    $quality = 80;
    $img->getimagecompressionquality() * $quality / 100;
    $img->setimagecompressionquality($quality);
    ?>
    dingyaguang117
        11
    dingyaguang117  
       2015-01-16 17:09:40 +08:00
    原来都不是100% 现在100% 是会变大的
    DearTanker
        12
    DearTanker  
    OP
       2015-01-16 17:43:01 +08:00
    @jevonszmx PHP读取原压缩质量的命令是啥呢?
    DearTanker
        13
    DearTanker  
    OP
       2015-01-16 17:52:34 +08:00
    @jevonszmx 、不好意思,你说的就是了= =囧。。。试试看~
    DearTanker
        14
    DearTanker  
    OP
       2015-01-16 17:57:29 +08:00
    @dingyaguang117 是的。
    DearTanker
        15
    DearTanker  
    OP
       2015-01-16 17:58:44 +08:00
    @jevonszmx
    @yyfearth

    对了,如果按照原图的压缩质量重新压缩,比如原图80%,输出也80%,中间不做任何处理,那损失会大吗?ヾ(´・ ・`。)ノ"
    BGLL
        16
    BGLL  
       2015-01-16 18:04:53 +08:00
    jpeg 用了不可逆的算法 解码后再次编码一定会损失质量
    质量优先就得转成其他无损格式比如 png 别再转成 jpeg 了
    DearTanker
        17
    DearTanker  
    OP
       2015-01-16 18:06:40 +08:00
    @BGLL 有道理的,等测试结果。
    explon
        18
    explon  
       2015-01-16 18:07:24 +08:00
    转成 PNG 加完水印然后调用 pngquant 压缩一下,就是原质量
    bjzhush
        19
    bjzhush  
       2015-01-16 21:05:50 +08:00
    你也可以考虑调用其它的语言及库来做这个事,如果PHP没有合适的方法的话,比如py
    走file或者url都可以考虑,搭建一个服务
    DearTanker
        20
    DearTanker  
    OP
       2015-01-16 21:46:53 +08:00
    @explon 谢谢。不过用其他语言不现实,公司的东西
    DearTanker
        21
    DearTanker  
    OP
       2015-01-16 21:47:27 +08:00
    @explon
    @bjzhush

    不好意思回复错了。。同样感谢提供思路~
    msg7086
        22
    msg7086  
       2015-01-16 22:16:15 +08:00 via iPhone
    @DearTanker 15楼。
    违反宇宙常理了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3389 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:42 · PVG 12:42 · LAX 20:42 · JFK 23:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.