PHP で BMP ファイルを読む

PHP には GD という画像を扱うためのエクステンションがあり、使用可能なサーバも少なくない。
サポート形式も JPEG / GIF / PNG など Web 上でメジャーな画像形式には一通り対応しているので困ることはないのだが、案外 BMP ファイルが読めなかったりする。
パソコンに詳しくない人が使うサービスなんかだと BMP ファイルが使えると嬉しいことも多いだろう。

ググッても案外思ったほどちゃんと対応しているコードは多くないようで、RLE圧縮非対応だったり、16bitカラー非対応だったり、特殊なビットフィールドに対応できていなかったりなどなど。
(試してないけど)真面目に対応したいんだったら ImageMagick などを使えばいいという話もあるので PHP で書かなければいけない理由はそんなにないものの、GD だけで手軽に済ませたいこともしばしばあるので真面目に書いてみた。

https://bitbucket.org/oov/php-bmp/src
  • 1bit / 4bit / 8bit / 16bit / 24bit / 32bit
  • RLE圧縮
  • ビットフィールドフリー
  • BI_JPEG / BI_PNG も読める
  • 透過情報も上手く読み込める
  • 恐らく PHP 5.1.0 以降で動くんじゃなかろうか
テスト用画像としては自分で作ったデータの他、こちらで配布されているデータも利用した。

追記: よく見たらbmp対応コードが既にあるっぽいので将来的にはどこのサーバでも bmp が読めるようになりそう。と、思ったら PHP の GD エクステンションのヘッダみると、webp はサポートしようとしてるけど bmp の気配はない……ぐぬぬ。