Подтвердить что ты не робот

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

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

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

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

Bouncy ball

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

В соответствии с статьей Википедии...

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

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

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

4b9b3361

Ответ 1

Изображения 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;
    }
?>

Ответ 2

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