APNG 画像は、サポートしていない読者のために PNG として「カモフラージュ」されるように設計されています。つまり、リーダーがそれらをサポートしていない場合、通常の PNG ファイルであると想定し、最初のフレームのみを表示します。つまり、それらは PNG と同じ MIME タイプ (image/png) を持ち、同じマジック ナンバー ( 89 50 4e 47 0d 0a 1a 0a
) を持ち、通常は同じ拡張子で保存されます (ただし、これはファイル タイプを確認する良い方法ではありません)。 )。
では、それらをどのように区別しますか?APNGには「acTL」チャンクが含まれています。そのため、文字列acTL
(または 16 進数) 61 63 54 4C
(チャンク マーカー (つまり00 00 00 08
) の前の 4 バイトは、ビッグ エンディアン形式のチャンクのサイズです。 field)) あなたはかなり上手なはずです。さらに良くするには、このチャンクが「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;
}
?>