2009-05-22 85 views
2

我有一個圖像,我用GD::Image操縱,我想用Image::Magick做進一步的操作。我想避免將圖像寫入磁盤,因此Image :: Magick可以讀取它。Image :: Magick的Read函數將接受一個文件句柄作爲參數,所以我試圖將它傳遞給一個IO :: Scalar我用GD :: Image的輸出創建的對象。如何使用IO :: Scalar和Image :: Magick :: Read()?

但是,由於IO :: Scalar對象可以看作是一個字符串,它看起來像Image :: Magick正在將圖像的內容解釋爲文件名,它無法找到,並且Read()失敗。

是否有另一種方式來創建一個標量文件句柄,其行爲更像一個常規的文件句柄,或者有另一種更簡單的方法來完成我在這裏要做的事情嗎?

my $FH = new IO::Scalar \$image_bin; 
my $magick = Image::Magick->new; 
my $response = $magick->Read(file => $FH); 

$迴應是:

"Exception 435: unable to open image `????': No such file or directory" 

回答

10

我認爲你正在尋找BlobToImage

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Slurp; 
use Image::Magick; 

my $image_bin = read_file 'test.jpg', binmode => ':raw'; 

my $magick = Image::Magick->new; 

$magick->BlobToImage($image_bin); 

$magick->Resize(geometry => '64x64'); 

$magick->Write('test-out.jpg'); 

__END__ 
0

From the docs...

從一個Perl文件句柄讀取GIF格式 的圖像,使用:

$image = Image::Magick->new; 
open(IMAGE, 'image.gif'); 
$image->Read(file=>\*IMAGE); 
close(IMAGE); 

所以...我想你的例子中的文件句柄(\$FH)的引用,而不僅僅是文件句柄,應該做的訣竅?

編輯:爲了應對布賴恩·d FOY,這就是我所建議嘗試:

my $image = Image::Magick->new; 
open my $fh, 'image.gif'; 
binmode $fh; 
$image->Read(file => \$fh); 
close $fh; 

在我的系統,至少,這賽格故障。

我會讓這個帖子作爲一個不起作用的例子。 :P

+0

使用裸字的文件句柄和引用類型團是很古老的,這就是爲什麼他試圖用一個標量引用來代替。顯然PerlMagick還不明白。 – 2009-05-26 13:24:12

+0

不夠公平,儘管我只是逐字地發佈了doc代碼段,並建議嘗試使用真實的$ fh參考。 但是......當我嘗試嘗試時,這種方式會導致seg故障。 – oeuftete 2009-05-27 13:17:36