【VBA】PNG画像のバイナリデータから幅と高さを取得する!

VBAを使って画像の幅と高さを取得するとき
LoadPicture という関数を使ってたんですが…

こんな感じで。
だけどLoadPictureだとPNGは読み込めないって事で

バイナリデータから特定しよう!という感じです!

バイナリデータを読込む方法

PNGのバイナリ構造

初めの8バイトは「PNGであることを示す」内容になっているようです!

次の IHDR チャンク というエリアに画像の幅と高さが書いてありました!

0から数えて
16~19バイト:画像の
20~23バイト:画像の高さ

となっているので
ここを読み取れば良さそうですね!

※参考:PNG ファイルフォーマット

PNGの初めの24バイトを読み込む

ここで読込むために使う関数は「Open」です!

※参考:Open関数の公式ガイド
※参考:Open関数の分かりやすい説明をしてた記事

ここでファイル番号というものが出てきます!

これはファイルを開く際に
裏で割り振られる管理用の番号だそうです!

そして他と重複しないように FreeFile で空いてる番号を取ってくるそうです!

参考:シャープ(#)の意味は何?

これで byData 配列に24バイト取れましたね!

バイナリデータから幅と高さを算出

PNG画像のバイナリデータ

算出する前にちょっと触れておくべきところ!
これはPNG画像をバイナリエディタで開いたものです!

赤が幅、青が高さ です!

16進数なので10進数に直すと
 : 00 00 05 00 = 5*(16^2) + 0*(16^1) + 0*(16^0) = 1280 px
高さ : 00 00 02 D0 = 2*(16^2) + 13*(16^1) + 0*(16^0) = 720 px

という事ですね!

Openで読み取ったバイナリデータ

では byData 配列に格納したバイナリデータはどうなっているでしょうか!?

赤が幅、青が高さ です!

高さ(青)を良く見ると…
バイナリエディタで開いた時と数字が変わってますね!

これは各バイト10進数で表記されてるからです!

ここで高さ(青)の4バイトは「0 0 2 208
ここからどうやって「720」が出せるのか!?

まず1バイトは10進数で「256(=2^8)」あります!
※1時間は60分ありますみたいな

だから2バイト目にある「」はただの2じゃなくて
2×256」あります!
※2時間はただの2じゃなくて2×60で120分ありますみたいな

幅と高さを算出する!

そう考えると

こんな感じで出せるかなと思います!