首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别webp图像是静态的还是动态的?

如何识别webp图像是静态的还是动态的?
EN

Stack Overflow用户
提问于 2017-07-19 20:22:15
回答 3查看 2.7K关注 0票数 3

我在一个项目中工作,其中用户可以上传webp图像。我知道如何将webp图像转换为jpg/png,但我不知道如何识别webp图像是静态的(非动画的)还是动画的。

我想识别它们,因为我使用不同的命令进行转换:

非动画webp到jpg的命令:

dwebp nonanimated.webp -o jpg.jpg

动画webp到非动画webp的命令(第2帧):

webpmux -get frame 2 animated.webp -o nonanimated.webp

但是我找不到一个可以同时处理这两种情况的命令。

我在服务器端使用PHP,前端使用HTML和Javascript。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-20 13:41:34

经过大量的研究,我发现当在文本编辑器中打开时,动画webp图像总是包含一些字符串,而非动画图像则不包含。这些字符串是ANMFANIM。我在我拥有的所有webp图像中检查了这些字符串。所以这对我来说是完美的。以下是PHPJavascriptShell Script中的一些解决方案

在PHP中:

代码语言:javascript
复制
<?php
function isWebpAnimated($src){
    $webpContents = file_get_contents($src);
    $where = strpos($webpContents, "ANMF");
    if ($where !== FALSE){
        // animated
        $isAnimated = true;
    }
    else{
        // non animated
        $isAnimated = false;
    }
    return $isAnimated;
}
?>

在Javascript中:

代码语言:javascript
复制
function isAnimatedGif(src) {
    var request = new XMLHttpRequest();
    request.open('GET', src, true);
    request.addEventListener('load', function () {
        if(request.response.indexOf("ANMF") != -1){
            // animated
            alert(true);
        }
        else{
            // non animated
            alert(false);
        }
    });
    request.send();
}

但在大型图像情况下,PHPJavascript不能很好地工作,所以最好的解决方案是使用Shell Script,如果你有Ubuntu的话。

在Shell脚本中:

代码语言:javascript
复制
echo $(grep -c "ANMF" ~/animated.webp)

如果不是动画,则返回0,否则返回非零值。

票数 5
EN

Stack Overflow用户

发布于 2020-04-16 11:14:40

根据Sven LiivakisWebpAnimated()的说法,有一个小错误。

fseek($fh, 16);

应该是:

fseek($fh, 20);

因为位置16VP8X中的chunk_size位置。但我们需要20flag职位。

固定功能:

代码语言:javascript
复制
function isWebpAnimated($fn){
  $result = false;
  $fh = fopen($fn, "rb"); 
  fseek($fh, 12);
  if(fread($fh, 4) === 'VP8X'){
    fseek($fh, 20);
    $myByte = fread($fh, 1);
    $result = ((ord($myByte) >> 1) & 1)?true:false;
  }
  fclose($fh);
  return $result;
}
票数 2
EN

Stack Overflow用户

发布于 2018-09-14 21:37:09

在Webp头中有标志,动画等等。检查它的小函数:

代码语言:javascript
复制
function isWebpAnimated($fn){
  $result = false;
  $fh = fopen($fn, "rb"); 
  fseek($fh, 12);
  if(fread($fh, 4) === 'VP8X'){
    fseek($fh, 16);
    $myByte = fread($fh, 1);
    $result = ((ord($myByte) >> 1) & 1)?true:false;
  }
  fclose($fh);
  return $result;
}

ANIM和ANMF来自下一个块标头。

RIFF container specification

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45190469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档