كيف يمكنني استخدام IO :: Scalar مع الصورة :: Magick :: قراءة ()؟
-
23-08-2019 - |
سؤال
لدي صورة قمت بمعالجتها GD :: Image. وأريد أن أفعل المزيد من التلاعب مع صورة :: Magick.. وبعد أود أن أتجنب كتابة الصورة إلى القرص، لذلك الصورة فقط :: Magick يمكن أن يقرأها في. صورة :: وظيفة قراءة Magick ستتقبل filehandle كمعلمة، لذلك أحاول اجتيازها IO :: Scalar الكائن الذي قمت بإنشائه باستخدام الإخراج من GD :: Image.
ومع ذلك، نظرا لأن كائن IO :: Scalar يمكن التعامل معه كسلسلة، فإنه يبدو وكأنه صورة :: Magick يفسر محتويات الصورة كسمية ملف كأصل لا يمكن العثور عليه، وفشل قراءة ().
هل هناك طريقة أخرى لإنشاء ملف filehandle من العددية يتصرف أكثر مثل filehandle العادية، أم أن هناك طريقة أبسط أخرى لإنجاز ما أحاول القيام به هنا؟
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"
المحلول
أعتقد أنك تبحث عنه 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__
نصائح أخرى
لقراءة صورة في تنسيق GIF من Perl Filehandle، استخدم:
$image = Image::Magick->new; open(IMAGE, 'image.gif'); $image->Read(file=>\*IMAGE); close(IMAGE);
لذلك ... أعتقد أن مرجع إلى filehandle الخاص بك (\$FH
) في مثالك، بدلا من فقط filehandle، يجب أن تفعل الخدعة؟
تحرير: للرد على براين د فوي، وهذا ما أقترحه محاولة:
my $image = Image::Magick->new;
open my $fh, 'image.gif';
binmode $fh;
$image->Read( file => \$fh );
close $fh;
على نظامي، على الأقل، هذه الأخطاء SEG.
سأسمح لهذه المشاركة بمثال مثال على ما لا يعمل. : P.