Могу ли я программно определить, анимирован ли PNG?

У меня есть PNG (а также JPEG) изображения, загруженные на мой сайт.

Они должны быть статическими (т.е. один кадр).

Существует такая вещь, как APNG .

Прыгучий мяч

(он будет анимирован в Firefox).

Согласно статье Википедии …

APNG скрывает последующие кадры в вспомогательных фрагментах PNG таким образом, что приложения APNG-unaware игнорируют их, но в этом случае нет изменений в формате, позволяющем программному обеспечению различать анимированные и неанимированные изображения.

Означает ли это, что невозможно определить, анимируется ли PNG с кодом?

Если это возможно, можете ли вы указать мне в правильном направлении PHP мудрый (GD, ImageMagick)?

Изображения APNG предназначены для «маскировки» как PNG для читателей, которые их не поддерживают. То есть, если читатель не поддерживает их, он просто предположит, что это обычный PNG-файл и отображает только первый кадр. Это означает, что они имеют один и тот же тип MIME, что и PNG (image / png), они имеют одинаковое магическое число ( 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; } ?> 

AFAIK, библиотеки, которые не поддерживают APNG, просто возьмут первый кадр PNG. В вашем случае вы можете просто создать новое изображение из APNG (или PNG, JPEG и т. Д.) И повторно сохранить его как PNG. Он должен лишать данные анимации при использовании GD, если только библиотека не была обновлена ​​для поддержки APNG.