Emacsのimage-modeでimagemagickの力が封印されている件


言わずもがな、Emacsでは画像が表示できるわけでして、これ とか あれ と比較した場合、大きなアドバンテージの一つではないかと思います。

そして、画像を表示するためのメジャーモードがimage-modeなのですが、調べてみると、実はいろいろと謎が隠されていました。

image-transform-fit-to-*という何ら仕事をしないコマンド

image-modeでは image-transform-fit-to-heightimage-transform-fit-to-width というインタラクティブなコマンドが定義されています。名前からして、いかにもフレームサイズとかに合わせて、画像をリサイズしてくれそうです。おお、便利そう。

ところが、これらコマンドを実行しても何の変化も表われません。はて?と思い M-xdescribe-function で関数を調べてみると次のようなことが書いてありました。

Fit the current image to the height of the current window. This command has no effect unless Emacs is compiled with ImageMagick support.

なるほど、コンパイル時にImageMagickを組みこんでコンパイルしておく必要があるわけです。

Emacsでは、Emacs24.1からコンパイル時に –without-imagemagick をつけない限り、ImageMagickの機能をC source codeレベルで使役できるようになっています。

これら関数では、そのImageMagickの機能を使うようです。ただ、Linuxではコンパイル時に何の指定もしていなければ、ImageMagickつきでビルドしてくれるはずで、わざわざそのような手間をしてビルドした覚えもありません。うーん、さらに謎が深まります。

GNU Emacs Lisp Reference Manual を読む

こういう時は初心に戻りリファレンスを読むのが一番です。

(Info-goto-node "(elisp) ImageMagick Images")

そして、答は冒頭に書いてありました。

The image type symbol for images loaded via ImageMagick is `imagemagick’, regardless of the actual underlying image format.

つまり、imageオブジェクト相当のものを作る時に、=type=プロパティに明示的に imagemagick を与えておかないと、組み込みImageMagickの恩恵を受けられないわけです。

一方、image-modeでは type プロパティに imagemagick を与えていません。このため、 image-mode では image-transform-fit-to-heightimage-transform-fit-to-width が有効に機能していないのです。

Workaround

ちょっと乱暴な方法ですが、画像タイプを返す image-type が常に imagemagick を返すように上書きしてしまいます。

(defun image-type (file-or-data nil data-p)
       'imagemagick)

これで、 image-transform-fit-to-heightimage-transform-fit-to-width が有効に機能するようになります。

また、 typeimagemagick にすることで様々な恩恵が得られます。Emacs上で画像を扱う場合、 create-imag 等で画像オブジェクト相当のものを作るわけですが、この時に width , height , angle プロパティを適用することができ、画像を事前にリサイズしたり、回転させたりすることができるようになります。

通常、同様のことをする場合、imagemagickのconvert等の外部プログラムを呼びだす必要があったわけですがその手間が省け、とてもすっきりした記述で書けるようになります。

なぜ、ImageMagickの機能は封印されているのか

このように便利なプロパティが準備されているのに、なぜ利用されていないのでしょうか。バンドルされているアプリがそのような便利な機能を知らないはずがありません。

その理由を示唆する内容が、MLに書かれていました。

Re: imagemagic in image-mode and image-dired-thumbnail-mode?

ここを読んでみる限り、Joakimさんがいろいろと拡張してたけど忙しくなってきたので、放置しているというのが理由のようです。

うーん、そんな理由で放置するくらいなら、revertするなりブランチ切るなりして安定板には含めないでほしい。。。

ちなみに、このJoakimさん、あの有名なemacs-xwidgetの作者であり、ちょっと変わったEmacs拡張を作られてることでも有名で、度々EmacsのMLにも顔を出されます。もしかしたら、いつの日かimage-modeも改良されるかもしれません。