PHPでPNGファイルの各種情報を手軽に得る
PNGファイルが偽装されていたり壊れていない事が前提。
<?php function png_info($bin) { return unpack('Nwidth/Nheight/Cbit/Ccolor/Ccompress/Cfilter/Cinterlace', substr($bin, 16, 13)); } var_dump(png_info(file_get_contents('hoge.png')));
結果
array(7) { ["width"]=> int(7) ["height"]=> int(4) ["bit"]=> int(8) ["color"]=> int(2) ["compress"]=> int(0) ["filter"]=> int(0) ["interlace"]=> int(0) }
画像の幅や高さ、カラータイプ、圧縮方式、インターレースかどうかなどの情報が得られる。
詳細を知りたい人はPNGの仕様書の日本語訳を見るといい。
追記
id:kkobayashi 「偽装されていたり壊れていない事」を調べるにはskipした8バイトのsignatureを調べるといいかも
(http://b.hatena.ne.jp/kkobayashi/20080831#bookmark-9815172)
PNGファイルが壊れていないか確認するには全てのチャンクのcrc32チェックサムを確認する必要がある。
偽装されていないか(フォーマットが正当なものであるか)を確認するにはさらに多くの手順を踏む必要がある。
圧縮されたデータを解凍し、それがIHDRチャンクの情報から割り出されるイメージレイアウトに沿っているか、IHDRチャンクのカラータイプとビット深度が矛盾していないか、パレットを使う場合PLTEチャンクがきちんと用意されているか、他にもさまざまな事柄の整合性を確認しなければならない。
要するに何が言いたいのかというと、ファイル先頭八バイトの符号だけを確認しても、偽装や欠損は確認できないよ、ということ。