Ответ 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;
}
?>