繁体   English   中英

使用 Base64 编码 ImageMagick 图像

[英]Encode a ImageMagick image with Base64

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

你不能把标量当作文件句柄吗?

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 如何将 IO::Scalar 与 Image::Magick::Read() 一起使用?

这个怎么样:

http://www.imagemagick.org/script/perl-magick.php#blobs

使用 Blob

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 );

更新:

看起来这里提到的东西不适用于 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.

我发现将所有这些放在一起的缺失部分是创建图像时的“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...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM