How can I use IO::Scalar with Image::Magick::Read()?
-
23-08-2019 - |
Question
I have an image I have manipulated with GD::Image and I want to do further manipulations with Image::Magick. I'd like to avoid writing the image out to disk just so Image::Magick can read it in. Image::Magick's Read function will accept a filehandle as a parameter, so I'm trying to pass it an IO::Scalar object I created with the output from GD::Image.
However, since an IO::Scalar object can be treated as a string, it looks like Image::Magick is interpreting the contents of the image as a filename which it cannot find, and Read() fails.
Is there another way to create a filehandle from a scalar that behaves more like a regular filehandle, or is there another simpler way to accomplish what I'm trying to do here?
my $FH = new IO::Scalar \$image_bin;
my $magick = Image::Magick->new;
my $response = $magick->Read(file => $FH);
$response is:
"Exception 435: unable to open image `????': No such file or directory"
Solution
I think you are looking for 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__
OTHER TIPS
To read an image in the GIF format from a Perl filehandle, use:
$image = Image::Magick->new; open(IMAGE, 'image.gif'); $image->Read(file=>\*IMAGE); close(IMAGE);
So... I think a reference to your filehandle (\$FH
) in your example, instead of just the filehandle, should do the trick?
Edit: To respond to brian d foy, this is what I was suggesting trying:
my $image = Image::Magick->new;
open my $fh, 'image.gif';
binmode $fh;
$image->Read( file => \$fh );
close $fh;
On my system, at least, this seg faults.
I'll let this post stand as an example of what doesn't work. :P