2013-12-18 78 views
0

我使用Perl的Image :: Magick创建了一个缩略图,但是我想将它发送回客户端内部的一个JSON对象Base64编码以进行显示。我怎么能得到Base64字符串,而不必将文件保存到磁盘?使用Base64编码ImageMagick图像

回答

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

与斑点

工作10

Blob包含的数据直接表示内存中的特定图像格式 而不是磁盘上的数据。 PerlMagick支持这些图像格式的 中的任何一个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); 
+2

不需要IO :: Scalar,只需使用'open'。 – daotoad

+0

你的方法和@daotoad方法不起作用,我尝试了'$ thumbnail-> Write'的每一种可能的组合,并且它们都没有写入'$ image_data',但是当你省略'filename'(所以它不写到文件)它将所有内容打印到'STDOUT'。 –

+0

由于某种原因,我忘记了这个简写并正在查看IO :: *模块。 – Oesor

1

更新:

貌似这里所说的没有与图像工作的东西:: 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. 
+0

对不起,如果我的问题有点混乱,但我知道如何编码的东西到Base64,我想知道的是如何从ImageMagick获取二进制数据而不保存图像到磁盘。 –