我有一个用GD::Image操纵的图像,我想用Image::Magick进行进一步的操作。我想避免将图像写入磁盘,因此Image :: Magick可以读取它.Image :: Magick的Read函数将接受一个文件句柄作为参数,所以我试图将它传递给IO :: Scalar我用GD :: Image的输出创建的对象。
但是,由于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"
答案 0 :(得分: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__
答案 1 :(得分:0)
以GIF格式读取图像 从Perl文件句柄中,使用:
$image = Image::Magick->new; open(IMAGE, 'image.gif'); $image->Read(file=>\*IMAGE); close(IMAGE);
所以...我认为在你的例子中你的文件句柄(\$FH
)的引用,而不仅仅是文件句柄,应该可以做到这一点?
编辑:为回应brian d foy,这是我建议的尝试:
my $image = Image::Magick->new;
open my $fh, 'image.gif';
binmode $fh;
$image->Read( file => \$fh );
close $fh;
至少在我的系统上,这个seg会出错。
我会让这篇文章作为不起作用的例子。 :P