(2001年11月のニフティへの書き込み) HTML文書を作るのに、いつも HTM_MAKE.DEF を使わせていただいています。 どうもありがとうございます。 さて、このマクロでは、IMG タグで使える画像形式は JPG と GIF に限られてい ます。しかし、最近では PNG 形式の画像を使うことも多くなってきていると思い ます。そこで今回、このマクロを PNG 形式に対応させてみました。 まず、PNG ファイルのファイル構造の概略は以下の通りです。  先頭8バイトは PNG のシグネチャ $89 $50 $4E $47 $0D $0A $1A $0A の並び  続いて、以下のようなデータブロックの繰り返し IHDR PLTE IDAT IEND その他、いろいろ でもって、どうも各データブロックのファイル内の格納順番はそれほど厳密に定 まっていないようなのです。気のせいかもしれませんが。 そのようななかで、シグネチャの次に出現する最初のデータブロックは IHDR と 決まっているようです。そして、この IHDR の中に、画像サイズの情報が収まっ ているのです。 では、それぞれのデータブロックの構造は、というと以下の通り。  最初の4バイトはそのデータブロックの長さ(バイト数)  次の4バイトは、上記のようなそれぞれのデータブロックの名前  以下、データ実体  最後に、エラーチェックのCRC IHDR データブロックの場合、このデータ実体の部分に画像サイズの情報が入って います。具体的には、データ実体の最初の4バイトが画像の幅、次の4バイトが 画像の高さのようです。 ということで、これだけわかればマクロの方はなんとかなります。 具体的には、HTM_MAKE の16番ローカルマクロの00番ローカル以下を以下のよ うにしてみました。 00: ;----------- 画像の width/height 取得 ------------ &So(m,".jpg") (r)?>A ;m=ターゲットファイル(SFN) %1 &So(m,".gif") (r)?>B ;21番ローカルで &So(m,".png") (r)?>C ;21番ローカルで &b(6) &m("対応していないファイル形式です"). :A ;------------ jpeg の場合 ---------------- Thanks to IJG ;(省略) :B ;------------ gif の場合 ----------------- Thanks to Mr.Takahashi ;(省略) . :C ;------------ png の場合 ----------------- dx=m, ax$3D00, &i($21) (r)?. bx=ax, ax$3F00, dx=pa, cx32, &i($21) (r||axE &?(" width=%d height=%d>",pa.18*256+pa.19,pa.22*256+pa.23) :E ax$3E00, &i($21) . このコードでは、縱か横が 65535 ドット以上の PNG ファイルのときに正しい値 を示しませんが、そういうファイルは見たことがありませんので、ばっさりと切 り捨てています。もしそういうファイルを頻繁に使われておられる方がいらっし ゃいましたら、そのファイルの閲覧・表示が問題なくできる環境を私に提供して いただければ、このマクロをロング変数対応にしたいと思います。:-p ただ、私、実際には PNG ファイルを使ったHTML文て書いたことがないんです よ。私の環境で PNG ファイルを扱う場合、作るほうはコンバータを使ってビット マップなどのファイルから作ることは可能です。でも、見るほうは、私のところ のDOS環境だとネイティブの表示ソフトがなくて、やっぱりビットマップに変 換させて見ざるをえないのです。それに、自分のホームページの表示確認に使っ ている WIN3.1 上の Netscape4.04 では PNG を表示してくれないので、結局使う のをためらってしまうのです。 では、何でこんなマクロを作ったのかって? 実は、自分でもわかりません。m(_._)m