[[dvipdfmx]] > 画像のとりこみ
 
// dvipdfmx の項目が長すぎるので分離.ページ途中のタグ [#xxx] にリンクするのは
// タグを自動でなく計画的に付けないとリンク切れしやすく,どこにリンクしているか
// すぐわからなくなるので,むしろ別ページのほうがよいと思う.

*dvipdfmx における画像や PDF のとりこみ [#headline]

dvipdfmx がサポートする画像フォーマットは PNG,JPEG,BMP,JPEG 2000(2014/08/11 より)および MetaPost が出力した EPS (MPS) です.
これに加えて PDF のページもとりこめます.
通常の '''EPS はサポートされていない'''ことに注意してください.
通常の EPS ファイルのとり込みでは外部プログラムを呼び出し,PDF に変換してからとり込みます.

LaTeX における画像の取扱いについての基礎知識は,「[[LaTeX入門/図表]]」の項目を参照してください.

----
#contents
----


**graphicx パッケージを dvipdfmx で利用する [#graphicx-dvipdfmx]

[[graphicx]] パッケージを用いて画像をとり込む場合は dvipdfmx オプションをつけて graphicx パッケージを読み込みます:

 \usepackage[dvipdfmx]{graphicx}

***ラスタ(ビットマップ)画像のとりこみ(bb 明示指定) [#s8bf9945]

PDF と JPEG や PNG などのラスタ画像を使う場合は,画像の物理的サイズ(ピクセル数ではなく紙媒体に印刷する場合の大きさ)を何らかの形で LaTeX に伝える必要があります.
これを行うひとつの方法は,\includegraphics の bb オプションで陽に指定することです.

 \includegraphics[bb=0 0 300 150, width=3cm]{input.png}

***ラスタ(ビットマップ)画像のとりこみ(bmpsize パッケージまたは extractbb 自動起動) [#gaefa825]

あるいは,TeX Live 2014 以降の場合は以下のように bmpsize パッケージを用いて画像サイズの自動取得を行うことができます.

 \usepackage[dvipdfmx]{graphicx}
 \usepackage{bmpsize}

bmpsize パッケージは,外部プログラムを使用せずに JPEG, PNG, BMP のサイズを計算するので,効率が良いものです.
dvipdfmx と共に使用するときは,
 \usepackage[dvipdfmx]{graphicx}
の後に
 \usepackage{bmpsize}
とします.

-inclusion of images and dvipdfmx ([[forum:1326]])

ただし,dvipdfmx での bmpsize パッケージのサポートには不具合があります.
例えば,
 \documentclass{article}
 \usepackage[dvipdfmx]{graphicx}
 \usepackage{bmpsize}
 \def\test{\includegraphics{test.jpg}}
 \begin{document}
 \setbox0\hbox{\test}\test
 \end{document}
などとした場合,画像が出力されなくなってしまいます.
→ [[forum:1326>http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=1326#p7662]]

\setbox0\hbox{\test}\test の代わりに,
 $\mathchoice{\test}{\test}{}{}$
などとした場合も同じ問題が生じます.
この問題は,「初登場時のものが最終的な組版結果に現れず捨て去られる場合」に発生する問題で,[[TikZ]] サポートにおける [[forum:1710]]] と同根の問題です.
この問題が生じやすい状況としては,amsmath パッケージの \text を用いる状況が挙げられます.
$ $ によるインライン数式や,数式の添字部分で \text{\includegraphics{test.jpg}} とすると,内部的に上記の \mathchoice が呼び出され,この問題が発現します.

一方,dvipdfmx で bmpsize パッケージが使用可能となった TeX Live 2014 以降では,extractbb のパイプによる呼び出しも利用可能であり,その場合もやはり .xbb ファイルは作成されません.
ですから,bmpsize パッケージのを利用するメリットは,速度が若干速い,-no-shell-escape でもという使えるという以外は特にありません.
上記のような特定のケースで画像とりこみに失敗するリスクを考えると,ラスタ(ビットマップ)画像のとりこみにおいても,bmpsize パッケージを使うのではなく,extractbb の自動起動に任せるのが無難と言えるでしょう.

***PDF 画像のとりこみ (extractbb) [#f245d8f6]

PDF の場合には,extractbb プログラムで抽出部分のサイズを計算します.
extractbb プログラムの自動呼出し機能(設定方法は[[こちら>古い情報#rf074b4b]])が有効になっている場合には,パイプ機能が使用されるので,.xbb ファイルは作成されません.
これが有効になっていない場合は手動で extractbb を起動し,あらかじめ .xbb ファイルを生成しておく必要があります.
これを行うにはターミナル(Windows PowerShell または コマンド プロンプト)から

 extractbb ファイル名

のようにします.
あらかじめ作業ディレクトリ(フォルダ)に移動して行います.


**画像サイズ調整 [#nfc14337]

dvipdfmx はダウンサンプル(リサンプル)は行いません.
画像を埋め込むとファイルサイズが異様に大きくなるような場合は画像加工ソフトで適切な解像度になるように画像のサイズを調整してください.
2インチ(5.08センチ)の幅に 300dpi の解像度で画像を収める場合の画像の幅(横方向のピクセル数)は 600 です.
一般的なプリンタでの印刷の場合はこれくらいの解像度でもよいでしょう.
2インチ-72dpi(スクリーン向け低解像度)の場合は 144 ピクセル,2インチ-150dpi(電子書籍向け)の場合は 300 ピクセルです.


**CMYK [#j398ab83]

PDF/X-1a などのために画像を CMYK 色空間を使うように変換したい場合もあります.
[[ImageMagick]] の magick コマンドなどを使ってあらかじめ PDF に変換すると良いでしょう.


**各画像フォーマットのサポート状況 [#img-support]

dvipdfmx が標準でサポートしている画像形式は以下のとおりです.

***PNG [#png]

PNG はよくサポートされています.
透明度や埋め込み ICC プロファイルなどの情報も保持されます.
TeX Live 2015 以前では,色深度が 16bpc のときは 8bpc へと変換されるという制限があります.
TeX Live 2015 版 (20150315) では XMP メタデータを保持します.

***JPEG [#jpeg]

JPEG は比較的よくサポートされています.
CMYK 色空間にも対応していますが,ビューアが対応していない可能性もあるため避けるのが無難です.
物理的サイズ(解像度)の取得に JFIF または Exif データを利用します.
JFIF と Exif データに不整合がある場合にサイズの決定に問題が生じることが知られています.
埋め込み ICC プロファイルにも対応しています.

***BMP [#bmp]

BMP は非圧縮かランレングス圧縮のものに限られます.
多くの拡張機能には対応していません.

***JPEG 2000 [#jpg2000]

JPEG 2000 の対応は最低限のものです.
PDF の仕様の制限から JP2 と JPX baseline サブセットに限定されます.
J2C ファイルには対応していません.
透明度については不明です.

***PDF [#pdf]

PDF はベクタ・ラスタ画像のどちらにもよく対応した高機能なフォーマットですが,仕様の改訂の度に複雑化するという問題があります.
不要に高いバージョン設定にしない,タグ付きにしないなどの点に注意すれば比較的よく対応できます.
下の注意点も参照してください.

***EPS [#eps]

TeX で画像といえば EPS といわれる時代もありましたが,現在では PostScript (EPS) は'''それが確かに必要だという場合を除き使わない方がよい'''でしょう.
というのも,dvipdfmx は PostScript を直接サポートしていないからです(Ghostscript を呼び出すので処理が圧倒的に遅くなります).


**どのフォーマットを選ぶべきか? [#which-to-choose]

PNG と JPEG で満足しているのであればそれでよいでしょう.
PDF は PNG と同等の機能をもち,JPEG も丸ごとサポート (実際に丸ごと JPEG ファイルを埋め込める) しているので,PDF で統一することも考えられます.
RAW データから JPEG への変換でもやもやとしたノイズが気になる場合は JPEG 2000 を検討してもよいでしょう.
ただし,JPEG 2000 は普及に失敗したようで PDF ビューアのサポートが十分でない可能性もあります.


**dvipdfmx がサポートしていない画像形式を扱う [#img-other]

***PostScript ファイルのとりこみ [#postscript]

PostScript ファイルをとりこむ際には通常は [[Ghostscript]] が自動的に起動し,PDF へ一時的に変換したうえでとりこみます.
具体的には dvipdfmx.cfg のオプションの記述を見ましょう.

 kpsewhich -progname=dvipdfmx -format=othertext dvipdfmx.cfg

で示されるファイルに

 D  "rungs -q -dNOPAUSE -dBATCH -dEPSCrop \
          -sDEVICE=pdfwrite ...(略)... -sOutputFile='%o' '%i' -c quit"

のような一行があるはずです("%" で始まる行はコメント行です).
この部分の指示により dvipdfmx は PostScript の図を埋め込むように指示されたとき,自動的に rungs(gs へのラッパー)を起動し PDF へ変換するように動作します.
"D" オプションの基本的な書式は

 D "command %i %o"

のような形です.
ここで "%o","%i" はそれぞれ出力(dvipdfmx が定める一時ファイル名),入力ファイル名に置き換わります.
とりこまれた PostScript の図に問題があるようでしたらこのオプションを見直してください.
PostScript ファイルはトラブルの大きな原因です.

-フォントをすべて埋め込んだはずなのに埋め込まれていないフォントがある
-和文フォントを使わないようにしたはずなのに実際は使ってある
-Type3 フォントが使われている

など,とりこまれた PostScript ファイルが原因となっている場合があります.
また変換が失敗する場合はまず "D" オプションで指定されたコマンドを直接実行してみて,どのようなエラーがでるのか調べてください.
dvipdfmx が

 Filtering file via command -->rungs -q ...(略)... failed.
 Image format conversion for "./foo.eps" failed...

のようなエラーメッセージを出力する場合は PostScript の変換プログラムが変換に失敗しています.

***他の形式の画像(SVG など)をとりこむ [#svg]

"D" オプションは EPS ファイルをとりこむためだけのものではありません.
これは dvipdfmx がサポートしない形式のファイルを処理するための一般的なものです.
[[Inkscape]] などに SVG から PDF への変換を依頼して図をとりこむこともできます:

 D "inkscape -z -A %o %i"

[[ImageMagick]] などに TIFF から PNG への変換を依頼することも可能です:

 D  "magick '%i' 'epdf:%o'"

実際の運用では様々な画像フォーマットに対して分岐処理をするスクリプトを呼び出すことになるでしょう.

***MetaPost 出力への対応 [#metapost]

[[MetaPost]] が出力する EPS ファイルは外部プログラムの助けなしに dvipdfmx が処理することができます.
ただし,

 prologues:=2;

に指定してください.
に指定してください.また拡張子は必ず .mps にして下さい.そうしないと,
BoundingBox が正しくなくなります.詳しい理由は,ドライバファイル dvipdfmx.def
のコメント部分を参照して下さい.
また,非公式ですが dvipdfmx に "-M" オプションを付けて実行することで "MetaPost モード" で MetaPost 出力を PDF へ変換することができます.
例えば MetaPost が出力した "test.1" というファイルに対して

 dvipdfmx -M -o test.pdf test.1

を実行すると,"test.pdf" が生成されます.
デバッグ用に使えます.