我正在做一个项目,用户可以上传webp
图像。我知道如何将webp
图像转换为jpg/png,但我坚持如何识别webp
图像是静态(非动画)还是动画。
我想识别它们,因为我使用不同的命令进行转换:
将非动画webp转换为jpg的命令:dwebp nonanimated.webp -o jpg.jpg
将动画webp转换为非动画webp的命令(采用第二帧):webpmux -get frame 2 animated.webp -o nonanimated.webp
但是我找不到一个命令同时处理这两种情况。
我在服务器端使用PHP,在前端使用HTML和JavaScript。
8条答案
按热度按时间uinbv5nw1#
在Webp头中有标志,其中包括动画。小函数来检查它:
ANIM和ANMF来自下一个块头。
RIFF container specification
yrdbyhpb2#
经过大量的调查,我发现动画
webp
图像总是包含一些字符串,当在文本编辑器中打开时,非动画图像不会。字符串为ANMF
和ANIM
。我检查了这些字符串在所有的webp图像,我有。所以这对我来说太完美了。以下是PHP
、Javascript
和Shell Script
中的一些解决方案:在PHP中:
在JavaScript中:
但在大图像
PHP
和Javascript
的情况下不能很好地工作,所以最好的解决方案是使用Shell Script
,如果你有Ubuntu
.在Shell脚本中:
返回0如果非动画,否则非零值为动画。
编辑:Python
eoigrqb63#
根据Sven Liivak的
isWebpAnimated()
...有一个小bug。fseek($fh, 16);
应该是:
fseek($fh, 20);
因为位置
16
是VP8X
中的chunk_size
位置。但是我们需要flag
的位置,也就是20
。固定功能:
qcuzuvrc4#
这是我的Java代码,它为我工作。
f0brbegy5#
修复@ccomangee的解决方案一些静态webp图像将被检测为动画,并可能导致应用程序中的问题。
我提取了webp帧并保存为webp图像,并试图通过检查VP 8X签名来识别,它存在于给定的位置,尽管它是静态图像。因此,如果有VP 8X,这并不意味着图像将具有多个帧的动画。
我尝试了几个图像与我的解决方案,结果如下:
这里所有图像都是根据其类型命名的。anim-trans:动画图像包含透明度(Alpha通道支持)anim-solid:不透明的动画图像、静态变换和静态立体都是静态图像。
VP 8L是无损的webp,VP 8X包含扩展功能。VP 8当然是静态图像。
如果VP 8X存在,它可以是静态的,也可以是动画的,大多数图像都是动画的。
将溶液
读取4个字节-> 'RIFF'跳过4个字节读取4个字节-> 'WEBP'读取4个字节-> 'VP 8X' / 'VP 8L' / 'VP 8'跳过14个字节读取4个字节-> 'ANIM'
Java代码:
你可以跳过8个字节直接读取WEBP,然后计数并跳过ANIM之前的所有块,如果ANIM存在,则读取该位置,然后读取其动画webp图像,否则为静态。
webp图像的文件布局https://developers.google.com/speed/webp/docs/riff_container#example_file_layouts
参考:Google WEBP规范https://developers.google.com/speed/webp/docs/riff_container
wd2eg0qa6#
vwkv1x7d7#
这是我在BASH(Linux)中的解决方案。在Debian 12中工作,无需添加任何必要的软件。搜索和复制动画webp文件到桌面。这是很容易修改我的脚本,以适应您的需要。一些想法来自这里。
fnx2tebb8#
我很抱歉很晚才加入这个讨论,但我也在寻找一个基于Python的离线使用解决方案。
虽然我不精通PHP或JavaScript,但我对Python有一些了解。这是我的发现:您可以使用Python Imaging Library(PIL)确定WebP图像是动画还是静态图像。
要计算WebP图像中的帧数并识别动画,您可以使用PIL的
Image
和ImageSequence
模块。下面是一个Python脚本来实现这一点:通过使用此代码,可以调用
is_animation
函数,并将文件路径作为参数传递。如果图像包含多个帧,函数将返回True
,表示它是一个动画;否则,它将返回静态图像的False
。