我正在使用Perl的Image :: Magick创建一个缩略图,但我想将它发送回客户端内部的一个JSON对象Base64编码显示。如何在不必将文件保存到磁盘的情况下获取Base64字符串?
答案 0 :(得分:2)
你不能将标量视为文件句柄吗?
http://metacpan.org/pod/IO::Scalar
my $image_data;
my $fh = IO::Scalar->new(\$image_data);
$thumbnail->Write(file=> $fh, filename=>'thumbnail.jpg');
## Then as in the previous answer...
my $json = JSON->new->utf8;
my $client_data = {
thumbnail => encode_base64( $image_data ),
other_crap => 'poo',
};
my $encoded_client_data = $json->encode( $client_data );
已编辑(c / f How can I use IO::Scalar with Image::Magick::Read()?)
这个怎么样:
http://www.imagemagick.org/script/perl-magick.php#blobs
使用Blob
blob包含直接表示特定图像格式的数据 在内存而不是在磁盘上。 PerlMagick支持任何一个blob 这些图像格式并提供了将blob转换为或从中转换blob的方法 特定的图像格式。
...
ImageToBlob()以各自的格式返回图像数据。 然后,您可以将其打印,将其保存到ODBC数据库,将其写入 文件,或将其传递给显示程序:
@blobs = $image->ImageToBlob();
open(DISPLAY,"| display -") || die;
binmode DISPLAY;
print DISPLAY $blobs[0];
close DISPLAY;
所以你想要这样的东西:
my ($image_data) = ($image->ImageToBlob())[0];
my $json = JSON->new->utf8;
my $client_data = {
thumbnail => encode_base64( $image_data ),
other_crap => 'poo',
};
my $encoded_client_data = $json->encode( $client_data );
答案 1 :(得分:1)
<强>更新强>
看起来这里提到的东西不适用于Image :: Magick。
此外,看起来Oesor找到了ImageToBlob()
的正确内容。
假设您在标量中包含二进制数据,请使用MIME :: Base64对二进制文件进行编码。然后使用JSON或JSON :: XS创建JSON结构。
MIME :: Base64是核心模块。你应该已经拥有它。 JSON和朋友很有用,你应该安装其中一个。
use MIME::Base64 qw< encode_base64 >;
use JSON;
my $image_data = 'blah';
my $json = JSON->new->utf8;
my $client_data = {
thumbnail => encode_base64( $image_data ),
other_crap => 'poo',
};
my $encoded_client_data = $json->encode( $client_data );
<强>更新强>
我没有看到任何公开直接访问的方法,但是您可以通过传递标量参考中的句柄来传递Write()
方法。
my $image_data;
open my $fh, '>', \$image_data;
$im->Write($fh);
# $image_data now should have the raw binary data.
答案 2 :(得分:0)
我发现将所有这些放在一起的缺失部分是创建图像时的“magick”参数:
use MIME::Base64 qw< encode_base64 >;
use Image::Magick;
$image = Image::Magick->new(size=>'100x100',magick=>'png');
$image->ReadImage('canvas:white');
$text = "12345";
$image->Annotate(font=>'kai.ttf', pointsize=>16, fill=>'green', text=>$text, x=>3.0, y=>17.0);
@blobs = $image->ImageToBlob();
print encode_base64($blobs[0]);
没有“magick->'png'”参数,我没有得到任何输出(这是有道理的,因为我从来没有告诉它我想要它如何格式化)。我能够使用以下方法将其添加到网页中:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAU4AAAATEAIAAAAgxq/gAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAB...