2009-05-22 37 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