2016-09-15 5 views
-2

私はGIF画像を生成するイメージャモジュールを使用しようとしていますが、私はエラーにオブジェクトメソッド:イメージャ

を取得していますが、オブジェクトのメソッド「_valid_image」 を見つけることができませんが、オブジェクトを見つけることができませんC:/ Perl/site/lib/Imagerの "D:\ work ... graph1.bmp"という方法で "_valid_image"メソッドを呼び出すことができます(おそらく "D:\ work ... \ graph1.bmp" .pm 1950.

モジュールの.pmファイルを確認しました。名前付き機能はそのモジュールでよく定義されています。私が使用しています

コードスニペットは:

use strict; 
use warnings; 
use File::Find::Rule; 
use Imager; 
my @path = $ARGV[0]; 

my @images = File::Find::Rule->file() 
          ->name('*.bmp') 
          ->in(@path); 
my $type = 'bmp'; 
foreach my $filename(@images) 
{ 
    my $img = Imager->new; 
    $img->read(file=>$filename, type=>$type) or die "Cannot read $filename: ", $img->errstr; 
} 
my $filename1 = 'ctpdbn'; 
Imager->write_multi({ file=>$filename1, type=>'bmp' }, @images) or die Imager->errstr; 

は、だから私はPerlが cpan Imager::valid_imageモジュールインストールおよび use Imager::valid_image;または use Imager::_valid_image;を追加してみましたが、それは別のエラーを投げ

イメージャーを見つけることができません@INCの/valid_image.pm(Imager :: valid_imageモジュールをインストールする必要があります)(@INC には:C:/ Perl/site/lib C:/ Perl/libが含まれています)make_gif.pl 14行目

本当に完全なコードを書いていないのは申し訳ありませんが、実際にエラーが発生している箇所は逃しました。今私はそれを更新しました

+0

親愛なるdownvoter、あなたは私の質問を投稿するのに十分な時間を与えてください、私は誤って、私はwritting /編集を終えた時点でポストボタンを押してください。それをダウンvoteです。 – Rajinder

+0

私は 'cpan Imager'でそれをインストールしました。私はチュートリアルで1番目の例を実行しました。 – toolic

+0

あなたが実行しているコードは肯定的ですか?それは私のためにうまく動作します。 'perl -MImager -E 'は$ Imager :: VERSION''と何を言っていますか?私はバージョン1.005を持っています – stevieb

答えて

0

本当にあなたが私たちに示すコードによって生成されたエラーですか? Imager.pmの行1950は、このコードの一部です:

my $index = 1; 
for my $img (@images) { 
    unless ($img->_valid_image("write_multi")) { # Line 1950 here 
    $class->_set_error($img->errstr . " (image $index)"); 
    return; 
    } 
    ++$index; 
} 

これは、そのパラメータの1つとして@imagesを渡されwrite_multi()呼び出されたサブルーチン(実際または、いくつかの私が思う)の内側にあります。あなたが私たちに示したコードはすべて、ファイルを書くのではなく、ファイルを読むことに関するものです。

エラーメッセージの詳細を見ると、その意味は明らかです。イメージオブジェクトの_valid_image()メソッドを呼び出そうとしています。しかし、イメージオブジェクトを持つ代わりに、イメージファイル名である文字列を持っています。だから、どこかで、write_multi()に画像ファイルの配列を渡して、どこにイメージオブジェクトの配列を渡すべきかを呼んでいるようです。あなたの実際のコードを見ることなく、私ははるかに役立つことはできません。

だから私はPerlモジュールにcpan Imager::valid_imageを設置し、夢中話だuse Imager::valid_image;またはuse Imager::_valid_image;

を追加してみました!エラーメッセージは、_valid_imageがメソッド名であり、モジュール名ではないことが非常に明確です。

常にエラーメッセージを注意深くお読みください。誰かができるだけ明確にするために多くの努力をしました。

更新:今度はもっとコードを投稿しました。そして、問題は私が言ったように正確に見える。

だから、どこかで、あなたはそれをあなたがそれを画像オブジェクトの配列を渡すすべき画像のファイル名の配列を渡すwrite_multi()を呼び出しているようだ:ここで私は昨日言ったものです。

そしてここで、あなたのコードは次のとおりです。

Imager->write_multi({ ... }, @images) or die Imager->errstr; 

ここで重要な変数は@imagesです。 @imagesはどのように設定されていますか?

my @images = File::Find::Rule->file() 
          ->name('*.bmp') 
          ->in(@path); 

したがって@imagesには、画像ファイル名のリストが含まれています。画像オブジェクトのリストではありません。

メインループを見てください。

foreach my $filename(@images) 
{ 
    my $img = Imager->new; 
    $img->read(file=>$filename, type=>$type) 
     or die "Cannot read $filename: ", $img->errstr; 
} 

イメージファイル名の配列をループし、ループのたびに新しいImagerオブジェクトを作成します。そして、あなたがループの反復の終わりに達すると、オブジェクトを投げ捨てます。それは良い考えではありません。

イメージオブジェクトを含む新しい配列を作成したいと思うかもしれません。このようなものはおそらくあります。

@my @image_objects; 
foreach my $filename(@images) 
{ 
    my $img = Imager->new; 
    $img->read(file=>$filename, type=>$type) 
     or die "Cannot read $filename: ", $img->errstr; 
    push @image_objects, $img; 
} 

次に、この新しい配列をwrite_multi()に渡す必要があります。

Imager->write_multi({ ... }, @image_objects) or die Imager->errstr; 

あなたの防衛では、the documentation for write_multi()は明確ではありません。それは言う:

write_multi()

、あなたは、単一のファイルに複数の画像を作成する場合はwrite_multi()メソッドを使用します

Imager->write_multi({ file=> $filename, type=>$type }, @images) 
    or die "Cannot write $filename: ", Imager->errstr; 

しかし、それは決して気を@imagesに何があるべきかを教えてください。

+0

私はそれを見て残念です、私は今から通知するつもりです。ありがとう また、私は今現在使用しているコード全体を投稿しました – Rajinder

+0

昨日推測したことは正確でした。私の更新を参照してください。 –

+0

あなたの現在の問題を修正してうれしいです。しかし、もっと重要なのは、次の問題を自分自身で追跡するのに役立つもう1つのトリックを学んだことを願っています: –

関連する問題