[英]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.