كيف يمكنني استخدام IO :: Scalar مع الصورة :: Magick :: قراءة ()؟

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

  •  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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top