Hatena::ブログ(Diary)

マクロツイーター このページをアンテナに追加 RSSフィード Twitter

2014-06-28

ナントカBoxの話(1)

LaTeX の graphicx パッケージの \includegraphics 命令で外部画像ファイルを文書に取り込む、という話をする際に、画像の「バウンディングボックス(bounding box;よく bbox と略称される)」という概念が登場する。本記事では、この「bbox」について、適当に何かを書き流す。

EPS における bbox

LaTeX が登場したての頃に「外部画像ファイルを挿入する」を実現していたのは dvips 等の「DVIPS 変換ソフトウェア」であり、扱える画像は EPS 形式に限られていた。この方法は現在でも使われており、また、この方法で用いられているモデルは、他の DVI ウェア・画像形式を扱う際にも踏襲されている。そこでまずは EPS 画像の bbox について説明する。

以下に示すものは非常に簡単な EPS 画像ファイルの例である。

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 100 20 200 80
newpath 110 30 moveto 150 70 lineto 190 30 lineto stroke
%%EOF

EPS 画像ファイル」はこのように PostScript 言語の描画命令列が書かれたテキストファイルである。上の例では座標 (110,30)、(150,70)、(190,30) の 3 点を結ぶ折れ線を描いている。

PostScript 言語での描画処理というのは、このように(潜在的に)無限に続く座標平面に対して行われる。ところが、この処理の結果を「画像オブジェクト」として LaTeX 文書(など)から参照するためには、そのオブジェクトが何らかの「確定した外見の形」をもつ必要がある。そのため、EPS 形式画像ファイルでは、座標平面中の一つの矩形の領域を取り出し、この領域の中にあるものが「画像オブジェクト」を構成する、と見做している。ここで定められた矩形が他ならぬ「バウンディングボックス(bbox)」である。上掲のファイルにおいて 2 行目の記述が bbox を表している。*1

%%BoundingBox: 100 20 200 80

ここでは、左下隅を (100,20)、右上隅を (200,80) とする矩形の領域が bbox と指定されている。*2平面に描かれた折れ線との位置関係を考慮すると、上掲の EPS 画像ファイルは、次のような「画像オブジェクト(外形を込めて)」を表していたことになる。

f:id:zrbabbler:20140628235317p:image

そして、この画像の大きさは「横 100 × 縦 60」である。実は、PostScript の座標値は単なる(抽象的な)数値ではなく、「PostScript ポイント(LaTeX では “bp” と表記される;1 bp = 1/72 in*3)」という長さの単位が暗黙的に指定されている。つまり、サイズは 100 bp × 60 bp であり、1 bp ≒ 0.3528 mm なので、およそ 35 mm × 21 mm ということになる。(つまり貴方が実際に見ている上掲画像は、ほぼ確実に「拡大または縮小が施されたもの」である。)

以上に述べた話を纏めておく。

  • EPS 画像は固有の「外形の大きさ」を持ち、これを bbox と呼ぶ。
  • EPS 画像(の bbox)は「物理的な長さ」で表される。
ビットマップ における bbox

dvips では扱える画像は EPS 形式に限られているが、後に登場した DVI ウェア(および PDF 出力の TeX エンジン)、例えば dvipdfmx や pdfTeX では専らビットマップ形式(PNGJPEG 等)や PDF 形式の画像を扱う。注目すべきこととして、TeX の世界では*4、これらの他の形式の画像の取扱を先述の EPS 形式画像のモデルを踏襲する形で行っているのである。

ビットマップ画像というのは、単純に考えると、様々な色を持ったピクセル(小さな正方形)を矩形に敷き詰めたものと見ることができる。そこには特に「bbox」という概念は無さそうである。とこrが、(La)TeX ではビットマップ画像を次のように扱う。

  • ピクセルを敷き詰めた領域を、左下隅が (0,0) になるように平面に配置する。そして、その領域を bbox と見做す。
  • ビットマップのサイズは通常は「400 px × 200 px」のように「ピクセルの個数」で示され、その「物理的な寸法」を意識する機会は少ない。しかし実際には多くのビットマップ画像書式には「解像度(resolution)」、すなわち「ピクセルの物理的な寸法」の情報を含めることができる。従って、DVI ウェアは画像ファイルの持つ解像度を利用して*5ピクセルの並んだ領域(これが bbox である)の「物理的な寸法」を得ている。

例えば、400 px × 200 px で解像度が 96 dpiビットマップ画像があったとする。「解像度が 96 dpi」というのは 96 px が 1 in(= 72 bp)に等しいということだから、ピクセル単位に換算すると 1 px = 0.75 bp となる。つまり画像の「物理的な寸法」は 300 bp × 150 bp (≒ 106 mm × 53 mm)である。その上で左下隅を (0,0) と決め打ちするので、結局 bbox の値は(EPS 画像の bbox の書式に合わせると)

0 0 300 150

ということになる。

*1:ちなみに、bbox の記述(%%BoundingBox: 100 〜)はそれ自体は PostScript 言語のコードではなく、「EPS 形式画像ファイル」としての約束事である。PostScript 言語では行中の % 以降はコメントであるので、当該のファイルでは、3 行目以外は PostScript としては意味を持たない。

*2PostScript の用いる座標系では、y 軸は上方向を向いている。

*3DTP の世界では単に「ポイント」と呼ばれる。TeX の世界では 1 pt = 1/72.27 in とする「伝統的なポイント」を “point(pt)” と呼び、「PostScript ポイント」のことを “big point(bp)” と呼ぶ。

*4DVI ウェアのレベルでも、LaTeX の graphicx パッケージのレベルでも。

*5:ただし、画像ファイルが解像度の情報を持たないこともある。dvipdfmx や pdfTeX はこの場合は 72 dpi の解像度を仮定する。dvipdfm(dvipdfmx の古い版)では画像ファイルの解像度情報を無視して一律に 100 dpi を仮定していた。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証