読者です 読者をやめる 読者になる 読者になる

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チャンクがきちんと用意されているか、他にもさまざまな事柄の整合性を確認しなければならない。
要するに何が言いたいのかというと、ファイル先頭八バイトの符号だけを確認しても、偽装や欠損は確認できないよ、ということ。