[Back!]

PC環境

RMagickのインストールメモ

突発的に、Rubyで画像処理がしたくなったのでライブラリを探してみた。

RAA (Rubyアプリケーションアーカイブ) の graphics を覗いてみたところ、imlib2-ruby が目に入った。説明文を読むとこれが一番やりたいことに合致しているように思える。

ダウンロード先のファイルを見ると拡張子がtar.gz。Linuxのみサポートかな、と嫌な予感がしつつも、念のためにダウンロード。解凍されたファイルの中に c でかかれたファイルを発見。コンパイルが必要かぁ。悪い予感が的中しそう。でも、万が一もあるからと思って extconf.rb を実行してみたけれど、案の定エラーを吐いて終了。いろいろ調べてみたけれど、Windows環境での利用ができるのかどうなのか分からない。つまり出来ない可能性が濃厚。

仕方ないから他のライブラリを使おうということで、選んだのがRMagick。Prerequisites を読んだら実行環境の中にWindowsが含まれている。しかもcygwinとは別に書いてあるから、cygwinを入れなくて済みそう。

インストールに必要なファイルは Ruby 本体以外には、ImageMagick 6.0.0 or later、RMagick MS Windows binary、RubyGemsの3つかな。意外と多い。

まず、ImageMagickをインストール。ちなみに、UnixからWindowsに移植された画像編集ツールらしいです。RMagickはこのソフトのAPIを利用してRubyから画像の編集を行うんだと思う。

FTPサーバの ./windows ディレクトリ内のファイルをダウンロードしたんだけど、ソースコードだけしか入っていない。自力コンパイルか〜って一瞬気分が沈んだんだけど、もう一度FTPサーバを見直したら、./binary にコンパイル済みのバイナリが置いてあった。うちのパソコンに、ImageMagicの実行に必要なDLLがインストールされている気がしないので、*-static.exe方をダウンロード。Q16とQ8の二種類があったんだけど、それぞれ 16bits per pixel版と 8bit per pixcel版を表しているらしい。Q16の方がいいのかな。

インストールファイルは *.exe なので実行するだけ。インストールオプションに OLE コントロールをインストールするかどうかのチェックボックスがあったので迷う。必要あるのか、ないのか見当もつかない。デフォルトではチェックは入ってないけど、入れなきゃいけないのかもしれないし、入れて損することはないだろうからチェックして実行。

インストールの途中でエラーが発生。レジストリの書き込みに失敗したらしい。PowerUserでログインしてたせいかな。エラーがあったけれどもインストーラーは正常終了。一応正常終了できたので、大した問題じゃないだろうと判断して先に進む。

デスクトップにImageMagicのアイコンが出来ていたので、実行して少しいじってみる。多分インストールは成功してるね。

つぎは、RubyGemsだ。パッケージマネージャーらしいが、インストールの仕方がよく分からない。とりあえず、setup.rb実行してみるか。

順調に進んでるかなと思った矢先に zlib.dll が見つからないと怒られる。

zlib.dllは Somes tools around zLib, build by Gilles Vollant http://www.winimage.com/zLibDll/ から入手。WindowsのPATHが通ったフォルダに突っ込んでおく。

ふたたび、setup.rb実行。

D:/Program Files/Ruby/lib/ruby/site_ruby/1.8/rubygems/package.rb:236: [BUG] Segmentation fault
ruby 1.8.3 (2005-05-12) [i386-mswin32]

abnormal program termination

不正終了したのは分かったが、何をすればいいのか分からん。なんだか Rubyのバグっぽいなぁ。それでもRubyのlibフォルダにファイルが追加できているらしい。折角ここまできたんだから、だめ元でRMagicもインストールしてみよう。

RMagicのドキュメントを見ると、"gem install RMagick-win32-1.7.0-mswin32.gem" を実行しろと書いてある。一応確認のために、コマンドプロンプトを開いて gem とだけ入れてみる。

ruby: No such file or directory -- D:/Program (LoadError)

あぅ。パスに半角スペースが含まれてるくらいでエラー起こすな。さっきのエラーもこのせいだろうか?

D:\Program Files\Ruby\bin\gem.cmd を開いてみると、エラーの原因箇所はすぐ分かった。

@ruby D:/Program Files/Ruby/bin/gem %1 %2 %3 %4 %5 %6 %7 %8 %9

@ruby "D:/Program Files/Ruby/bin/gem" %1 %2 %3 %4 %5 %6 %7 %8 %9

じゃなくちゃいけない。ここを直すために RubyGemsのアーカイブに入っていた post-install.rb の54行目

file.puts "@ruby #{target} %1 %2 %3 %4 %5 %6 %7 %8 %9"

file.puts "@ruby \"#{target}\" %1 %2 %3 %4 %5 %6 %7 %8 %9"

へ修正。

setup.rbを実行し直してから、また gem 実行。今度はちゃんと動いているように見える。そしてコマンドプロンプトから

gem install RMagick-win32-1.7.0-mswin32.gem

Attempting local installation of 'RMagick-win32-1.7.0-mswin32.gem'
ERROR: Error installing gem RMagick-win32-1.7.0-mswin32.gem[.gem]: undefined method `close' for nil:NilClass

うぅ。Rubyのバージョンを1.8.2に下げて、gemのインストールから再度挑戦。やっぱりエラー。1.8.0でもやっぱりだめだ。

面倒くさいけど、RubyGemのインストーラのコードを追って原因を探ってみよう。post-install.rb の install_sourcesでこけてることがすぐ判明。もっと調べると、package.rb の236行目でこけている。その場所に p [@io, header] 追加して実行してみると、zlibが原因でこけている可能性が濃厚だ。

原因がわかっても対処方法が思いつかないので、半分諦めながらもウェブで情報をあさっていたら、たまたま「mswin32 版の Ruby では zlib が原因不明の SEGV で落ちる」と書いてある日記を発見。そうか、そうか、要するに相性問題かな?

もしやと思って、zlib.dllを他のサイトから入手し直して、タイムスタンプが新しいものと差し替えてみた。

そして、RubyGemのsetup.rb実行。

Successfully built RubyGem
Name: sources
Version: 0.0.1
File: sources-0.0.1.gem

よっしゃ。そして RMagick のインストールを実行。

gem install RMagick-win32-1.7.0-mswin32.gem

Attempting local installation of 'RMagick-win32-1.7.0-mswin32.gem'
Successfully installed RMagick-win32, version 1.7.0

やった。嬉しい〜。

早速、サンプルスクリプトを入手してきて実行だ。

RMagickが見つかりません。とエラー。おかしいなと思いつつ、ファイル検索してみたんだけど、ちゃんとファイルはあるような。ライブラリのパスが通ってないのか?

サンプルスクリプトの一行目に、

$: << 'D:\Program Files\Ruby\lib\ruby\gems\1.8\gems\RMagick-win32-1.7.0-mswin32\lib'

を追加してから再度実行。今度は libbz2.dll が見つかりませんと怒られる。RMagick のドキュメントを読み直したところ、postinstall.rbを実行してくださいと書いてある。

書かれている通り postinstall.rb を実行。正常終了。

ふぅ。これで全部終わりかな。

さっきサンプルスクリプトの一行目に加えた変更を消去してから、もう一度実行だ。またRMagickが見つかりませんていわれた。えぇぇぇ。ライブラリのパスが通らないの?

$: << 'D:\Program Files\Ruby\lib\ruby\gems\1.8\gems\RMagick-win32-1.7.0-mswin32\lib'

をもう一度入れなおして、またまた実行。今度はちゃんと出力できました。ライブラリのパスが通ってないのが気持ち悪いけど、とりあえずめでたしめでたし。