使用Base64对ImageMagick图像进行编码

时间:2013-12-18 02:18:13

标签: perl imagemagick base64

我正在使用Perl的Image :: Magick创建一个缩略图,但我想将它发送回客户端内部的一个JSON对象Base64编码显示。如何在不必将文件保存到磁盘的情况下获取Base64字符串?

3 个答案:

答案 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...