[dvipdfmx] ビットマップ画像のトリミング

[dvipdfmx] ビットマップ画像のトリミング

- tat tsan の投稿
返信数: 7
dvipdfmx 使用時
png や jpg 画像などを \includegraphics で取り込むときのトリミングなのですが、
.xbb ファイルが存在していても、bb を指定しておかないと trim が効かなくなっています。

これは dvipdfmx.def の \Ginclude@bmp の定義において、下記に矢印で示した if が
あるためです。この if は必要でしょうか??

\def\Ginclude@bmp#1{%
\message{<#1>}%
\bgroup
\def\@tempa{!}%
\special{pdf:image\space
\ifx\Gin@page\@tempa\else page\space\Gin@page\space\fi
\ifGin@bbox %% ←これ
bbox\space\Gin@llx\space\Gin@lly\space\Gin@urx\space\Gin@ury\space
clip\space\ifGin@clip 1\else 0\fi\space
\fi %% ←これ
\ifx\Gin@scalex\@tempa\else width\space\the\Gin@req@width\space\fi
\ifx\Gin@scaley\@tempa\else height\space\the\Gin@req@height\space\fi
(#1)\space
\ifx\Gin@mask\@tempa
\ifGin@interpolate<</Interpolate\space true>>\fi
\else
<</SMask @\Gin@mask\space%
\ifGin@interpolate/Interpolate\space true\fi>>%
\fi}%
\egroup}

tat tsan への返信

Re: [dvipdfmx] ビットマップ画像のトリミング

- Akira Kakuto の投稿
ありがとうございます。これは要らないというか,
あったらいけないと思います。
Karl さんに追加報告するつもりです。
tat tsan への返信

Re: [dvipdfmx] ビットマップ画像のトリミング

- Z. R. の投稿

うーむ、trim/viewport がある場合は確かに special に bbox 指定が必要なことは解るんですけど、そうでない場合は問題ないはずで、私だったら、あまり入れたくないですね(hiresbb でない場合とかで、誤差が入り込むのが嫌なので)。実際に目に見える影響はないのはもちろんですが。

Z. R. への返信

Re: [dvipdfmx] ビットマップ画像のトリミング

- Akira Kakuto の投稿
この部分に関して,
\def\Ginclude@bmp#1{%

\def\Ginclude@pdf#1{%
がそろっていたほうが良いように思いました。
pdf の場合は bb が明確で,bmp の場合は良いかげん
という点では,元のほうがよいかも知れません。
original の著者はそう考えていたのかもしれません。

\ifGin@bbox
を残しておいたほうが良いような気もします。
Akira Kakuto への返信

Re: [dvipdfmx] ビットマップ画像のトリミング

- tat tsan の投稿
ZRさんの記述そのままなんですが

(1) special に bbox指定を入れるのは trim や viewport を指定したときだけにする。

(2) もう hiresbb がデフォルトでも良い時代ではないか。
tat tsan への返信

Re: [dvipdfmx] ビットマップ画像のトリミング

- tat tsan の投稿
(1)については、誰かさんが \Gin@ollx などを不用意にglobalに使ったりしなければ

\@ifundefined{Gin@ollx}{}{%
bbox\space\Gin@llx\space\Gin@lly\space\Gin@urx\space\Gin@ury\space
clip\space\ifGin@clip 1\else 0\fi\space}%

で判断できますが、もっと確実な方法を取った方がよいでしょうか?
tat tsan への返信

Re: [dvipdfmx] ビットマップ画像のトリミング

- Z. R. の投稿

既に graphics/x 本体のマクロに手を付けてしまっている状態だとすると、私だったら、

\g@addto@macro\Gin@viewport{\Gin@bboxtrue}\g@addto@macro\Gin@trim{\Gin@bboxtrue}
(で special の bbox 出力は変更無)

も検討するかも知れません。

でも、「\Gin@olly を検査する」の方が(本体のマクロの修正がないので)よさそうです。ただ、\@ifundefined を使うと「\relax-化」が起こるのが何となく嫌(もちろん無害なのですが)なので、直接 \ifx で判定したいところです。

\ifx\Gin@ollx\@undefined\else
  bbox...
\fi
tat tsan への返信

Re: [dvipdfmx] ビットマップ画像のトリミング

- Z. R. の投稿

(2) について。

実は、hiresbb が指定された場合、“readファイル”に %%HiresBoundingBox がないとエラーになります。つまり、%%BoundingBox があってもそちらにフォールバックしてくれません。

ビットマップ画像の場合、読取対象は extractbb が吐いた .xbb ファイルに決まっているので %%HiRes~ が必ずあるはずですが、EPS 画像ファイルの場合、%%Hires~ は無いことが結構あります。

しかし、「ビットマップの場合だけ hiresbb を既定にする」ことは妥当がと思います。graphics パッケージの仕様との整合性も考慮する必要がありますが、hiresbb は「eps タイプの画像の場合のみを規定する」とも解釈できるでしょう。(例えば pdfTeX の場合は hiresbb オプションは無関係です。)