3

我有一张我用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"
4

2 回答 2

11

我认为您正在寻找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__
于 2009-05-22T19:52:23.583 回答
0

从文档...

要从 Perl 文件句柄中读取 GIF 格式的图像,请使用:

$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;

至少在我的系统上,这个段错误。

我会让这篇文章作为不起作用的例子。:P

于 2009-05-22T19:51:12.480 回答