ActivePerl 5.10でImageMagickが正常に動作しない不具合の対処

ActivePerl 5.10でImageMagickが正常に動作しない不具合の対処

Posted at September 13,2010 1:23 AM
Tag:[ImageMagick, Perl]

Windows+ActivePerl 5.10でImageMagickをインストールしたときにImageMagickが正常に動作しない不具合の対処方法をまとめました。

このエントリーは、「Movable Type 5で「サーバーに Image::Magickか、Image::Magickの動作に必要な他のモジュールがインストールされていません。」となる事象について」から、さらに追跡調査したものです。

実験環境は次の通りです。

  • Windows XP Professional Service Pack 3(2台)
  • ActivePerl 5.10.1 Build 1006
  • ImageMagick 6.5.5-5 Q8/ImageMagick 6.5.6-10 Q8/ImageMagick 6.5.9-1 Q8(5.10.1 Build 1006に対応する最初のバージョン・途中のバージョン・最後のバージョンで実験)
  • Movable Type 5.02

PerlMagickは、前回はppmコマンドでインストールしましたが、今回はImageMagickに同梱されているものをそのまま使用しました。

ImageMagickの過去バージョンは以下のリンクからダウンロードできます。

Main Site » Mirror » image_magick

1.問題点

ImageMagickをインストールしているにもかかわらず、次のようにダッシュボードに「Image::Magickが設定されていません。」というメッセージが表示されます。

メッセージが表示

この状態でアイテムをアップロードしてもサムネイルが作成されず、真っ黒な表示になります。

真っ黒な表示

サムネイルが作成されていれば、5項のキャプチャ画像のように表示されます。

2.問題の解析

詳細は割愛しますが、サムネイルが作成されない原因は、前エントリーでも記した通り、プログラム内の「require Image::Magick」というところでエラーになっているためです。

今回は、エラーの詳細を知るために、次のサンプルプログラムをコマンドプロンプトから実行しました。「1.png」はサンプルプログラムと同じフォルダに配置している、任意の画像ファイルです。

#!/usr/bin/perl
 
eval { require Image::Magick };
if (my $err = $@) {
   die $err;
}
 
my $file = '1.png';
(my $ext = $file) =~ s/.*\.//;
my %arg = (magick => lc($ext));
my $magick = Image::Magick->new(%arg);
$magick->Read($file);
my ($width, $height) = $magick->Get('width', 'height');
print $width."x".$height;

NGを確認するのであれば、最初の5行だけあればいいです。

#!/usr/bin/perl
 
eval { require Image::Magick };
if (my $err = $@) {
   die $err;
}

ImageMagick 6.5.7-9 Q8のインストール直後にサンプルプログラムを実行すると、次のように「CORE_RL_magick.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。」というエラーが表示されました。

エラー1

実行後、コマンドプロンプトには次のように「指定されたモジュールが見つかりません。」というエラーが表示されました。

Can't load 'C:/usr/site/lib/auto/Image/Magick/Magick.dll' for module Image::Magick: load_file:指定されたモジュールが見つかりません。 at C:/usr/lib/DynaLoader.pm line 201.
 at test.pl line 3
Compilation failed in require at test.pl line 3.
&Image::Magick::constant not defined. The required ImageMagick libraries are not installed or not installed properly.
END failed--call queue aborted at test.pl line 5.

エラー2

別のPCで、ImageMagick 6.5.7-9 Q8インストール直後にサンプルプログラムを実行すると、こちらは「再帰が深すぎます。スタックがオーバーフローしました。」というエラーが表示されました。

Can't load 'C:/usr/site/lib/auto/Image/Magick/Magick.dll' for module Image::Magick: load_file:再帰が深すぎます。スタックがオーバーフローしました。 at C:/usr/lib/DynaLoader.pm line 201.
 at test2.pl line 3
Compilation failed in require at test2.pl line 3.
&Image::Magick::constant not defined. The required ImageMagick libraries are not installed or not installed properly.
END failed--call queue aborted at test2.pl line 5.

エラー3

なお、サンプルプログラムではなく、コマンドプロンプトからImageMagickの動作を確認する方法は以下です。すべて正常に動作すれば、imdisplayコマンド実行後にImageMagickのロゴが表示されます。ただし、Perlのrequire文は実行しないので、これが正常に実行されても、Perlを使っているツールの不具合が解消されているとは限らないようです。

ImageMagick - Install from Binary Distribution

C:¥>convert logo: logo.gif
C:¥>identify logo.gif
C:¥>imdisplay logo.gif

4.原因

「CORE_RL_magick.dll」はImageMagickのインストールフォルダ直下にあるライブラリなのですが、このライブラリが正常に参照できていないのが真の原因と推測されます。コマンドプロンプトに表示されたメッセージは、「CORE_RL_magick.dll」がみつからないことによる、二次的なエラーと思われます。

「CORE_RL_magick.dll」を正しく参照できるようにするには、環境変数が設定されていればよいと思います。ImageMagickのインストール直後は、環境変数「Path」にImageMagickのインストールフォルダが設定されていますが、インストール直後はPathが効いておらず、「CORE_RL_magick.dll」が参照できないようです。

なお、ImageMagickのインストールとアンインストールを何回か繰り返して試したところ、「CORE_RL_magick.dllが見つからなかったため~」というダイアログは表示されず、コマンドプロンプト上のエラーメッセージのみが表示されるケースもありました。

5.対処1

ImageMagick 6.5.6-10 Q8/ImageMagick 6.5.9-1 Q8については、WIndowsを再起動することで、コマンドプロンプトから利用可能になり、Movable Typeでもサムネイルが表示されました。ImageMagick 6.5.5-5 Q8では再起動してもNGのままでした。

サムネイル表示

また、ImageMagickのインストールとアンインストールを何回か繰り返して試したところ、再起動せずにコマンドプロンプトからは動作OKとなり、Movable Typeでは再起動しないとサムネイルが表示されないというケースがありました。

6.対処2

ImageMagick 6.5.6-10 Q8については、再起動を行う前に、「Movable Type 5で「サーバーに Image::Magickか、Image::Magickの動作に必要な他のモジュールがインストールされていません。」となる事象について」に記したとおり、環境変数MAGICK_HOMEを追加することで、次のようにコマンドプロンプトから動作可能になるケースがありました。

コマンドプロンプトから動作可能

7.対処3

今回は実施していませんが、ネット上ではppmコマンドでPerlMagickをインストールすることで解決しているという情報があります。

8.まとめ

ActivePerl 5.10.1 build 1006であればImageMagick 6.5.9-1との組み合わせが良好と思われます。

現在の最新バージョンであるActivePerl 5.10.1 build 1007は試していませんが、ImageMagickが正常に動作しない場合、次の順番で対処を行ってみてください。

  1. ImageMagickのバージョンは、ImageMagickに同梱されているPerlMagickのバージョンをActivePerlのバージョンに合わせ、かつ新しいものを選択(参考:ImageMagick と Image::Magick(PerlMagick) のバージョン対応
  2. ImageMagickインストール後にPC再起動
  3. MAGICK_HOMEの設定+PC再起動
  4. ImageMagickでPerlMagickを同時にインストールせずに、ppmでインストール+PC再起動

今回の実施環境では、解決できない事象には遭遇しませんでしたが、ActivePerlやImageMagickのバージョンによっては解決しない場合があるかもしれません。

最後に、今回の実施結果を簡単にまとめておきます。

インストール直後再起動MAGICK_HOME設定MAGICK_HOME設定後の再起動
6.5.5NGNGNGNG
6.5.6
(1回目)
NG-MS-DOS OK/MT NGMT OK
※再起動のみでOKとなった可能性あり
6.5.6
(2回目)
MS-DOS OK/MT NGMT OK--
6.5.9OK---
関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)