Как я могу использовать IO:: Scalar с Image::Magick::Read()?

StackOverflow https://stackoverflow.com/questions/899505

  •  23-08-2019
  •  | 
  •  

Вопрос

У меня есть образ, с помощью которого я манипулировал GD::Изображение и я хочу проделать дальнейшие манипуляции с Изображение::Магия.Я бы хотел избежать записи изображения на диск только для того, чтобы Image::Magick мог его прочитать.Функция чтения Image::Magick примет дескриптор файла в качестве параметра, поэтому я пытаюсь передать ей объект 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"
Это было полезно?

Решение

Я думаю, вы ищете Двоичное изображение:

#!/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__

Другие советы

Из документов...

Чтобы прочитать изображение в формате GIF из дескриптора файла Perl, используйте:

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

Итак...Я думаю, что ссылка на ваш дескриптор файла (\$FH) в вашем примере, вместо простого дескриптора файла, должно получиться то же самое?

Редактировать:Чтобы ответить Брайану ди Фою, это то, что я предлагал попробовать:

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

По крайней мере, в моей системе этот сегмент неисправен.

Я оставлю этот пост в качестве примера того, что не работает.:P

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top