V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
juneszh
V2EX  ›  PHP

WebP 图片格式真是个巨坑, 折腾了几天 PHP 都不能正常处理, PHP 是最好的语言!

  •  
  •   juneszh · 2015-08-15 10:01:17 +08:00 · 14993 次点击
    这是一个创建于 3417 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在撸一个跟微信相关的项目, 涉及到图片上传处理. 微信居然会偶然上传WebP格式的图片.

    服务器环境: PHP 5.5.28, 所有扩展均为最新版本

    试了GD和Imagick两个扩展均不能正常读取:
    Imagick里new完直接为NULL, 后续操作全部报错找不到tmp临时文件;
    GD里使用imagecreatefromwebp读出是泛黄的图片. 后面输出各种格式更是惨不忍睹.
    (stackoverflow里类似的情况: http://stackoverflow.com/questions/26314508/convert-jpg-to-webp-using-imagewebp)

    目前想到唯一可行的使用命令行"dwebp img.webp -o img.jpg"的方法, 先转jpg再处理. 问题是人家为了安全考虑, PHP禁用了exec等命令... 无解中

    PHP是最好的语言!
    PHP是最好的语言!
    PHP是最好的语言!
    24 条回复    2015-08-17 10:34:45 +08:00
    anubiskong
        1
    anubiskong  
       2015-08-15 10:09:46 +08:00
    虽然讨厌php, 但是你的问题确实和php无关
    leopardwei
        2
    leopardwei  
       2015-08-15 10:16:26 +08:00
    典型的自我催眠,其实我知道楼主不爱 PHP,但必须要用,所以…… 你懂的,:D
    oott123
        3
    oott123  
       2015-08-15 10:30:39 +08:00 via Android
    为啥为了安全要禁用 exec
    ljbha007
        4
    ljbha007  
       2015-08-15 10:38:44 +08:00
    assassinpig
        5
    assassinpig  
       2015-08-15 10:51:01 +08:00
    准备跳坑
    kslr
        6
    kslr  
       2015-08-15 11:20:15 +08:00
    Imagick webp库装好没
    kslr
        7
    kslr  
       2015-08-15 11:21:25 +08:00
    @oott123 exec可以执行系统命令,如果系统被入侵,执行个passwd什么的,不过这都什么年代了。
    kiwi95
        8
    kiwi95  
       2015-08-15 12:09:25 +08:00
    何必用PHP呢,是不是?楼主
    bigdude
        9
    bigdude  
       2015-08-15 14:14:49 +08:00
    建议楼主多研究研究微信图片链接的参数,很容易就绕过这种问题,不要在这上面钻牛角尖。
    realpg
        10
    realpg  
       2015-08-15 15:05:10 +08:00
    我的环境imagick扩展可以正确处理webp格式,微信过来的颜色也不偏。
    juneszh
        11
    juneszh  
    OP
       2015-08-15 15:58:05 +08:00
    @realpg 有没有哪里需要注意的?我的imagick怎么弄都支持不了在PHP里读webp, 但是命令行可以操作webp
    realpg
        12
    realpg  
       2015-08-15 16:11:07 +08:00
    @juneszh
    编译imagemagick时候加上相关lib支持webp,然后编译imagick扩展时配置指向本机编译的imagemagick,出来的貌似就直接支持。
    不过我们基本不这么处理webp,性能比较差,都是丢给后台进程处理
    csx163
        13
    csx163  
       2015-08-15 16:15:58 +08:00
    我看见有项目用七牛处理图片的
    wdlth
        14
    wdlth  
       2015-08-15 20:11:50 +08:00
    LZ不检查GD和ImageMagick,怪到语言上也没用。
    menc
        15
    menc  
       2015-08-15 20:14:15 +08:00
    微信URL中的webp改成jpg或者jpeg就是jpg了
    juneszh
        16
    juneszh  
    OP
       2015-08-15 23:57:32 +08:00
    juneszh
        17
    juneszh  
    OP
       2015-08-15 23:59:58 +08:00
    @menc
    @bigdude
    这个接口的"下载多媒体"文件怎么通过参数改格式?
    http://mp.weixin.qq.com/wiki/12/58bfcfabbd501c7cd77c19bd9cfa8354.html
    iyaozhen
        18
    iyaozhen  
       2015-08-16 00:04:58 +08:00
    @juneszh 表示关注,这个接口不应该会获得 webp 格式的图片呀。
    Balthild
        19
    Balthild  
       2015-08-16 12:27:10 +08:00 via Android
    楼主你不知道php exec可以指定只能执行某个目录中的可执行文件吗?故意黑php有意思吗
    bombless
        20
    bombless  
       2015-08-17 08:13:06 +08:00 via Android
    嘛,另外开个服务做转换,或者写扩展吧。PHP的C扩展都写不出你敢说你能写PHP?(逃
    juneszh
        21
    juneszh  
    OP
       2015-08-17 10:04:00 +08:00
    @realpg 感谢!的确是编辑扩展时出了问题, 现在 imagick 在 PHP 可以支持 webp 了.
    juneszh
        22
    juneszh  
    OP
       2015-08-17 10:30:01 +08:00
    最后总结下: 在 PHP 5.5 中, 对于 WEBP 的支持还是很初级的阶段(可以看到最近的版本更新都有 webp 的 BUG 修复), GD 库真的很多问题, 偏黄移位等等. 目前唯一可用的是 imagick 库, 不过编译时需要先安装 libwebp, 并且编译扩展时要注意点(看 12 楼).

    另外, 一句"PHP 是最好的语言"真是很好的钓鱼句, 也看尽了 PHPer 的众生相.
    break
        23
    break  
       2015-08-17 10:32:41 +08:00
    @juneszh 下面两个手册内容不知道有没有帮助 php 本身就可以生成 webp 格式的
    http://php.net/manual/zh/function.imagecreatefromwebp.php
    http://php.net/manual/zh/function.imagewebp.php
    juneszh
        24
    juneszh  
    OP
       2015-08-17 10:34:45 +08:00
    @break 这个就是 GD 库的, 很多问题.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2721 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:06 · PVG 17:06 · LAX 01:06 · JFK 04:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.