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じゃなくて
「2×256」あります!
※2時間はただの2じゃなくて2×60で120分ありますみたいな
幅と高さを算出する!
そう考えると
こんな感じで出せるかなと思います!