画像

外部オブジェクト (XObject)
PDF 内で画像などを表示する場合、コンテンツストリーム外で定義されたオブジェクトを、コンテンツストリーム内で参照して使用する必要があります。

このような、コンテンツストリーム外で定義されたグラフィックオブジェクトは、「外部オブジェクト (XObject)」と呼ばれます。

コンテンツストリームで XObject を使う場合、まずは、ページのリソース辞書の XObject エントリで、各オブジェクトの任意の名前とデータを、辞書で定義します。

コンテンツストリーム内では、Do 命令を使って、それらを描画します。

name Do
(name は、定義された任意の名前)
画像 XObject
PDF 内で使う画像は、ストリームオブジェクトで定義します。
これらは、「画像 XObject」と呼ばれます。

画像の幅や高さなどの情報はストリーム辞書で指定し、画像のデータはストリームデータとして格納する形となります。

JPEG 画像の場合は、ファイル全体を丸ごと埋め込んで、フィルタに DCTDecode を指定すれば、使用することができます。
JPEG2000 画像の場合は、JPXDecode フィルタを使います。

それ以外の画像形式の場合は、各フォーマットごとに画像の生データを読み込み、指定ビットのサンプルデータを、Y は上から下、X は左から右の方向で、順に格納したバイナリデータとしてセットします。
サンプルが 8 bit 未満の場合は、上位ビットから順に格納し、Y の1行ごとにバイト単位にします。

画像一つ一つに対して色空間の指定が必要となり、画像データの色成分の数は、色空間によって決定されます。
DeviceGray なら1サンプル、DeviceRGB なら R-G-B の順で3つのサンプルを並べます。

通常はフィルタを使って圧縮されますが、1bit の画像でしか使えないフィルタなどもあります。
1bit 以外の画像では、一般的に FlateDecode が使われることが多いでしょう。

画像 XObject では、他の画像のマスクとして使う「マスク画像」も定義できます。
画像のストリーム辞書の追加エントリ
Typenameオブジェクトのタイプ。常に /XObject
Subtypename(必須) XObject のタイプ。画像 XObject なら /Image
Widthinteger(必須) 画像の幅
Heightinteger(必須) 画像の高さ
ColorSpacename or array(フィルタが JPXDecode [=JPEG2000] 以外の場合は必須。マスク画像には使用不可)
画像の色空間 (Pattern 以外)。
JPXDecode フィルタの場合はオプション (デフォルトで、JPEG2000 の色空間が使用される)。
BitsPerComponentinteger(JPXDecode フィルタ以外の場合に必須)
画像の1サンプルのビット数。
1, 2, 4, 8, 16 (16 は PDF 1.5 から)。
マスク画像の場合はオプション (指定する場合は、必ず 1 にする)。

CCITTFaxDecode, JBIG2Decode フィルタ時は常に 1。
RunLengthDecode, DCTDecode フィルタ時は常に 8。
Intentname(PDF 1.1) カラーレンダリングインテントの名前。
default = グラフィック状態の現在の値。
ImageMaskbooleanマスク画像として扱うかどうか。
true の場合、BitsPerComponent は常に 1 であること。また、Mask, ColorSpace エントリは指定しない。
マスクの範囲外は、ストローク以外用の色で描画される。
default = false
Maskstream or array(PDF 1.3。マスク画像では使用不可)
この画像に適用するマスク画像のストリームオブジェクト、または、範囲外として扱う色の範囲を指定する配列。

色の範囲を指定する場合、色成分の数の2倍の長さの数値の配列。
各色成分ごとに、範囲の最小値と最大値の値 (画像データでの値) をペアにして指定する。
Decodearrray画像のデータ値を色空間の値にマッピングするための数値配列。

マスク画像の場合は、[0 1] or [1 0] でなければならない。
それ以外では、色空間で必要な色成分の2倍の長さの数値の配列でなければならない。

「画像データの 0 に対応する値 (最小値)」と「画像データの 2^n - 1 に対応する値 (最大値)」の2つをペアにして、各色成分ごとに指定します。

以下のように、線形補間によって、色の値が変換されます。
c = min + (input * (max - min) / (2^n - 1))

デフォルトで、各色空間ごとの最小・最大値 (基本的に 0.0 と 1.0) が指定されます。
Interpolateboolean画像の補間を行うか。
default = false。
画像の解像度が出力デバイスよりも著しく低い場合、拡大時に補間を行って、滑らかに表示することができます (アルゴリズムは処理側の実装による)
Alternatesarray(PDF 1.3) この画像の代替画像辞書の配列
SMaskstream(PDF 1.4) 透明なイメージングモデルで、マスク形状またはマスクの不透明度の値のソースとして使用されるソフトマスクイメージ。

存在する場合、このエントリは、グラフィック状態の現在のソフトマスクとマスク画像を上書きする。
(ただし、他の透明度に関連するグラフィックス状態パラメーター [ブレンドモードとアルファ定数] は有効)

SMask エントリが存在しない場合、イメージには関連するソフトマスクはない(ただし、グラフィックス状態の現在のソフトマスクは適用される)
SMaskInDatainteger(PDF 1.5。JPXDecode フィルタ時のみ)
画像データ内のソフトマスク情報の使用方法を指定。

0 : 存在する場合、画像データ内のソフトマスク情報は無視される。(デフォルト)

1 : 画像データ内には、ソフトマスク情報が含まれる。アプリケーションは、このデータからソフトマスクイメージを作成して、透明度イメージングモデルのマスク形状またはマスクの不透明度のソースとして使用できる。

2 : 画像データ内には、背景と、あらかじめ合成されたカラーチャンネルが含まれている (アルファチャンネルも含む)。アプリケーションは、透明度モデルのマスク形状またはマスクの不透明度のソースとして、アルファチャンネル情報からソフトマスクイメージを作成できる。
Namename(PDF 1.0 では必須。現在は非推奨) 現在のリソース辞書の XObject エントリの値となる辞書で、この画像 XObject が参照される名前
StructParentinteger(PDF 1.3。画像が構造的なコンテンツアイテムの場合は必須)
構造的な親ツリー内の画像のエントリの整数キー。
IDbyte string(PDF 1.3。間接参照が望ましい) 画像の親 Web キャプチャコンテンツセットのデジタル識別子
OPIdictionary(PDF 1.2) 画像の OPI (Open Prepress Interface) バージョン辞書
Metadatastream(PDF 1.4) 画像のメタデータを含むメタデータストリーム
OCdictionary(PDF 1.5) この画像 XObject のオプションのコンテンツプロパティを指定する、オプションのコンテンツグループ、またはオプションのコンテンツメンバーシップ辞書。
画像が処理される前に、このエントリに基づいてその可視性が決定されます。
非表示であると判断された場合、イメージ全体がスキップされます。
ページへの配置
画像の位置と、ページ内での大きさは、cm 命令で変換行列を使うことによって設定することができます。

ここで注意しなければならないのは、cm 命令を使うと、変換行列は、最後に設定された行列の後に蓄積されることです。

画像に対してのみ変換行列を適用させたい場合は、cm 命令の前に、現在のグラフィック状態をスタックに保存して、画像の描画後にグラフィック状態をスタックから復元することで、変換行列を蓄積されないようにすることができます。

% グラフィック状態をスタックに保存
q
% (100,500) に移動して 200 に拡大
200 0 0 200 100 500 cm
% /IMG1 の画像を描画 (上の行列が適用される)
/IMG1 Do
% グラフィック状態を復元
Q
ページ内でのサイズ
ページ内に画像を配置する場合は、大きさをユーザー空間単位に合わせる必要があります。

画像の幅・高さ = ユーザー空間での 1.0」として扱われるため、変換行列で指定した拡大率 (行列内での a と d の値) は、そのまま、ページ内での画像のサイズとなります。

印刷目的で作成する画像の場合は、適切な解像度 (DPI) で作成して埋め込むことになりますが、画像の幅・高さ・DPI から、ユーザー空間単位でのサイズを計算したい場合は、以下のようになります。

DPI = dot/inch = 1インチ内のピクセル数

W = img_width  / dpi * 72
H = img_height / dpi * 72
使用例
グレイスケール画像
>> 13a.pdf

グレイスケール 8bit、7x7 のひし形の画像を、ユーザー空間単位で 200 の長さに拡大して表示しています。

3 0 obj
<< /Type /Page
   /Parent 2 0 R
   /MediaBox [ 0 0 612 792 ]
   /Resources 4 0 R
   /Contents 5 0 R
>>
endobj

% リソース辞書
4 0 obj
<< /XObject << /IMG1 6 0 R >> % /IMG1 という名前で画像を定義
>>
endobj

% コンテンツストリーム
5 0 obj
<< /Length 35 >>
stream
q % グラフィック状態をスタックに保存
200 0 0 200 100 500 cm % (100,500) に移動して 200 に拡大
/IMG1 Do % /IMG1 の画像を描画
Q % グラフィック状態を復元
endstream
endobj

% 画像 XObject
6 0 obj
<< /Type /XObject
   /Subtype /Image
   /Width 7
   /Height 7
   /ColorSpace /DeviceGray
   /BitsPerComponent 8
   /Length 147
   /Filter /ASCIIHexDecode
>>
stream
ff ff ff 00 ff ff ff
ff ff 00 00 00 ff ff
ff 00 00 00 00 00 ff
00 00 00 00 00 00 00
ff 00 00 00 00 00 ff
ff ff 00 00 00 ff ff
ff ff ff 00 ff ff ff>
endstream
endobj
JPEG (DCTDecode)
>> 13b.pdf

JPEG 画像を表示します。

ストリームデータは、テキストで記述させるために、ASCII85Decode フィルタを使っています。

ASCII85Decode でデコードした後、それを DCTDecode で JPEG デコードすることになります。
(通常は DCTDecode のみのバイナリデータとしてください)

6 0 obj
<< /Type /XObject
   /Subtype /Image
   /Width 100
   /Height 100
   /ColorSpace /DeviceRGB
   /BitsPerComponent 8
   /Length 1020
   /Filter [/ASCII85Decode /DCTDecode]
>>
stream
... JPEG data...
endstream
endobj
追加説明
代替画像 [PDF 1.3]
代替画像を使うと、画像に複数のバージョンを含めることができます。
主に、印刷用に高解像度の画像を使い、画面表示用に低解像度の画像を使いたい場合などに使用します。
詳細は省略します。
マスク画像
ImageMask エントリを true に設定した場合、1bit のマスク画像として扱われます。
マスク画像を適用する場合は、Mask エントリで指定します。

デフォルトで、イメージのビットが 1 であれば透明として扱われます。
マスク画像の Decode エントリに [1 0] を指定すると、値が反転されるので、ビットが 0 で透明として扱われます。
インライン画像
インライン画像は、コンテンツストリーム内で直接定義して使う、小さな画像です。
4 KB 以下の画像で使用します。

BI  % インライン画像オブジェクトの開始
(キーと値をペアにして、画像情報を複数記述)
ID  % 画像データの開始
...画像データ...
EI  % インライン画像オブジェクトの終了

これを定義すると、その位置で、画像が直接描画されます。

画像情報は、BI と ID の間で記述します。
画像 XObject の辞書と同じように記述しますが、ここでのみ、キーの名前と値の名前に、短く略した名前を指定することができます。

キーの略語
BitsPerComponentBPC
ColorSpaceCS
DecodeD
DecodeParmsDP
FilterF
HeightH
ImageMaskIM
InterpolateI
WidthW
値の略語
DeviceGrayG
DeviceRGBRGB
DeviceCMYKCMYK
IndexedI
ASCIIHexDecodeAHx
ASCII85DecodeA85
LZWDecodeLZW
FlateDecode (PDF 1.2)Fl
RunLengthDecodeRL
CCITTFaxDecodeCCF
DCTDecodeDCT

q
17 0 0 17 298 388 cm
BI
/W 17 % 画像幅
/H 17 % 画像高さ
/CS /RGB % 色空間
/BPC 8 % ビット数
/F [ /A85 /LZW ] % フィルタ
ID
...data...
EI
Q