我可以通过编程方式确定PNG是否已设置动画?

ale*_*lex 13 php png image apng

我有PNG(以及JPEG)图像上传到我的网站.

它们应该是静态的(即一帧).

APNG之类的东西.

弹力球

(它将在Firefox中动画).

根据维基百科的文章 ......

APNG以PNG辅助组块中的后续帧隐藏,使得APNG不知道的应用程序将忽略它们,但是否则格式没有改变以允许软件区分动画和非动画图像.

这是否意味着无法确定PNG是否使用代码进行动画处理?

如果可能的话,请你指点我正确的方向PHP智慧(GD,ImageMagick)?

nic*_*ico 15

对于不支持它们的读者,APNG图像被设计为"伪装"为PNG.也就是说,如果一个阅读器不支持它们,它只会假设它是一个普通的PNG文件而只显示第一帧.这意味着它们具有与PNG(image/png)相同的MIME类型,它们具有相同的幻数(89 50 4e 47 0d 0a 1a 0a)并且通常它们以相同的扩展名保存(尽管这不是检查文件类型的好方法) ).

那么,你如何区分它们?APNG中有一个"acTL"块.所以,如果你搜索字符串acTL(或者,十六进制,61 63 54 4C(块标记之前的4个字节(即00 00 00 08)是大端格式的块的大小,而不计算结尾处的大小,标记或CRC32)领域))你应该很好.为了更好地做到这一点,请检查此块在第一次出现"IDAT"块之前出现(只需查找IDAT).

此代码(取自http://foone.org/apng/identify_apng.php)将起到作用:

<?php
# Identifies APNGs
# Written by Coda, functionified by Foone/Popcorn Mariachi#!9i78bPeIxI
# This code is in the public domain
# identify_apng returns:
# true if the file is an APNG
# false if it is any other sort of file (it is not checked for PNG validity)
# takes on argument, a filename.
function identify_apng($filename)
    {
    $img_bytes = file_get_contents($filename);
    if ($img_bytes)
        {
        if(strpos(substr($img_bytes, 0, strpos($img_bytes, 'IDAT')), 
                 'acTL')!==false)
            {
        return true;
        }
        }
    return false;
    }
?>
Run Code Online (Sandbox Code Playgroud)


Kle*_*vič 5

AFAIK,不支持APNG的图书馆将只占用PNG的第一帧.在您的情况下,您可以从APNG(或PNG,JPEG等)创建新图像并将其重新保存为PNG.如果使用GD,它应该剥离动画数据,除非库已更新为支持APNG.