画像・Photoshop
4 つの変換器がここでひとつになっているのは、どれも文書としてレイアウトするのではなく、ページの上の 1 枚の絵になる形式だからです。ブラウザがすでにデコードできる画像、Photoshop が合成した絵、スキャンや FAX の TIFF、Windows メタファイルが持つ絵です。どれも画像そのものの大きさの 1 ページになります(Photoshop はアートボードごとに 1 ページ)。
試してみる
ファイルをビューアにドロップするか、サンプルを試してください。SVG の画像、EXIF 付きの JPEG 写真、3 つのアートボードを持つ Photoshop ファイル。
画像(PNG、JPEG、GIF、WebP、AVIF、BMP、ICO、SVG)
converter/image は、ブラウザの <img> 要素がそのまま表示できる画像をパススルーで格納します。デコードも再エンコードもせず、ファイルそのものを画像の大きさの 1 ページに格納し、IMAGE 命令 1 つで描きます。結果を開くと、ブラウザでファイルを開いたときと同じ見た目になります。変換器が読むのは、画像自身のヘッダーから求める大きさ(IHDR、最初の SOF、論理画面記述子、VP8X、DIB ヘッダー、ブラウザが描く最大の ICO エントリ、HEIF の ispe。JPEG・PNG・AVIF は EXIF や irot の向きも見ます)とメタデータだけです。メタデータは他の形式と同じく manifest の Dublin Core にします。XMP があれば先に使い、次に EXIF、次に IPTC、最後に形式自身のテキスト(PNG のテキストチャンク、GIF のコメント、SVG の title・desc)を使います。アニメーション画像(APNG、アニメーション GIF・WebP、AVIF の画像シーケンス)はブラウザが最初にデコードするフレームを描き、警告を出します。
SVG には工夫が要ります。createImageBitmap は Worker の中で SVG の Blob をデコードできないので、レンダラは SVG をベクタデータのまま持ち、そのときのズームが要る解像度でページ側(<img> 要素を持つ側)にラスタ化させ、画像ごとに何枚かのラスタを使い回します。これでどれだけ拡大してもぼけず、スクリプトは動かず外部の資源も読み込まれません(ブラウザが <img> として開いたときと同じ制約です)。
この形式に -param はありません。画像を直接入力したときは常にそのまま格納されます。文書に埋め込まれた画像の格納方法を決める -images フラグはここには効きません。
詳しい実装は design.md §3.19 を参照してください。
Photoshop(.psd、.psb)
converter/psd が読むのは Photoshop が合成した画像で、レイヤーの構造ではありません。見た目は Photoshop が描いたピクセルで決まっていて、テキストやベクトルのレイヤーも合成済みのピクセルとして持っているからです。アートボードの無い文書はカンバス全体を 1 ページにし、アートボードのある文書は表示されているアートボードごとに 1 ページにして、レイヤーパネルの順に合成画像から切り出します。ページの大きさは文書の解像度から求めます。カラーモードと深度はすべて読みます(RGB、CMYK、グレースケール、Lab、インデックス、モノクロ 2 階調。8・16・32 bit)。大きな文書の形式(.psb)も読みます。「互換性を優先」をオフにして保存したファイルは合成画像を持たないので、変換器がレイヤーを合成します(描画モード、マスク、クリッピングマスク、グループ、塗りつぶしレイヤー。調整レイヤーとレイヤー効果は描かず、警告を出します)。画像の入力に共通の解像度の上限より細かいページは、TIFF と同じく上限まで縮小します。
| オプション | 値 | 既定 |
|---|---|---|
-param artboards= |
false: アートボードごとのページの代わりにカンバス全体を 1 ページに |
アートボードごとに 1 ページ |
-max-dpi |
画像の入力(TIFF、Photoshop)のページを縮小する上限、1 インチあたりの画素数(0 で上限なし) |
192 |
-max-pixels |
画像の入力のページを縮小する上限、幅 × 高さの画素数(0 で上限なし) |
14745600 |
詳しい実装は design.md §3.18 を参照してください。
TIFF(.tif、.tiff)
converter/tiff はファイルのページごとに、解像度から決まる大きさのページを 1 枚の画像で作ります。複数ページの TIFF の多くはスキャナや FAX の出力で、中身は画像だけです。読み取りは自前です(golang.org/x/image/tiff は先頭の IFD しか読まず、JPEG 圧縮も CCITT の 2 次元符号も読めません)。classic TIFF と BigTIFF、ストリップとタイル、無圧縮・PackBits・LZW・Deflate・JPEG、CCITT の FAX 符号(Group 3 の 1 次元と 2 次元、詰め物ビットの有無、Group 4)を、1〜16 ビットの二値・グレー・パレット・RGB・CMYK で読みます。Orientation タグでページを回します。解像度の上限(既定 192dpi、3840 × 3840 画素)を超えるページは上限まで縮小し、二値のページは二値のまま縮小します。縮小しない JPEG のページは、ストリップを再エンコードせずに 1 本の JPEG につないで格納します。
| オプション | 値 | 既定 |
|---|---|---|
-param dpi= |
解像度を持たないページの、1 インチあたりの画素数 | 96 |
-max-dpi |
画像の入力(TIFF、Photoshop)のページを縮小する上限、1 インチあたりの画素数(0 で上限なし) |
192 |
-max-pixels |
画像の入力のページを縮小する上限、幅 × 高さの画素数(0 で上限なし) |
14745600 |
詳しい実装は design.md §3.15 を参照してください。
Windows メタファイル(.emf、.wmf)
converter/emf は EMF・WMF ファイルを、図の大きさの 1 ページにします。描くのは、Office 文書の中に埋め込まれた EMF・WMF の絵を描くのと同じ再生処理で、メタファイルの記録をそのまま再生します。テキストは PowerPoint と同じくフォントを解決してレイアウトし埋め込むので、そちらで使うフォント関連のフラグ(-font-dir、-fonts、-no-system-fonts、-no-subset、-no-woff2)がここにも効きます。メタファイル専用の -param はありません。
詳しい実装は design.md §3.5 を参照してください。