【问题标题】:Creating an image with text using Perl's Image::Magick使用 Perl 的 Image::Magick 创建带有文本的图像
【发布时间】:2020-05-03 22:42:08
【问题描述】:

我正在研究一些关于 HTTP 上下文标头及其用途的午餐学习示例。我想在事物中添加一些闪光,用 Perl 的 Image::Magick 创建一个图像。

感谢对这篇原始帖子的评论,我了解到问题是缺少 Content-Length。如何从图像中获取正确的上下文长度?

附:我调整了 Content-Type 以使类型大写。

#!/perl/bin/perl.exe

use Image::Magick;

$image = Image::Magick->new;
$image->Set(size=>'100x100');
$image->ReadImage('canvas:white');
$image->Set('pixel[49,49]'=>'red');

$text = 'Works like magick!';
$image->Annotate(font=>'kai.ttf', pointsize=>40, fill=>'green', text=>$text);

print "Content-Type: image/png\n\n";
binmode STDOUT;
$image->Write('png:-');

【问题讨论】:

  • 您需要 Content-Length 标头。和 Content-Type,用大写字母

标签: perl imagemagick cgi


【解决方案1】:

为什么不 Mojolicious (An amazing real-time web framework)?

use Mojolicious::Lite;

use Image::Magick;

get '/' => sub {
  my $c = shift;

  ...

  $c->render( data => $image->ImageToBlob( magick => 'png' ), format => 'png' );
};

app->start;

使用perl my_script.pl daemon运行它

并在浏览器中打开 localhost:3000

或者修复原始代码:

#!/usr/bin/env perl

use strict;
use warnings;

use Image::Magick;

my $image = Image::Magick->new;
$image->Set( size => '200x200' );
$image->ReadImage( 'canvas:white' );
$image->Set( 'pixel[49,49]' => 'red' );

$image->Annotate(
    font      => 'kai.ttf',
    pointsize => 22,
    fill      => 'green',
    text      => 'Works like magick!',
    gravity   => 'northwest',
);

my $img_size;
my $img_data = $image->ImageToBlob( magick => 'png' );

{
    use bytes;
    $img_size = length $img_data;
}

binmode STDOUT;
print <<EOD;
Content-Type: image/png
Content-Length: $img_size

$img_data
EOD

【讨论】:

  • 这也是一个完整的 CGI 脚本,如果你添加一个 shebang,将它重命名为 .cgi 并将 Apache 正确指向它。
  • 我高度修改了我的原始帖子。原谅我,但我不是 Perl 专家,我选择 Perl 而不是 C,因为我认为在 zip 文件中设置 Apache/Perl 环境以分发给人们会更容易。这就是说,虽然我相信你的反应很好,但我什至还没有开始理解它:)。考虑到没有提到 HTTP 标头,这是该示例的重点,我认为这是不行的。尽管如此,我想更好地理解它。你能指出一个解释 Mojolicious::Lite 发生了什么的博客,它看起来很有趣。
  • 感谢您更新代码,但它不起作用。我收到“在连接中使用未初始化的值 $img_data”。看起来大括号中的分配工作不正常。我尝试删除它们并在其后添加无字节,同样的错误。我不太了解 Perl,不知道如何取消使用字节;并把它内联。有什么想法吗?
  • 我也对 $image->ImageToBlob 做了一些探索,看起来它返回了一个 void*。我很难过如何获得它的长度。当我删除整个 Content-Length 以查看发生了什么时,我得到了这个:Use of uninitialized value $img_data in concatenation (.) or string
  • ImageToBlob() 必须返回二进制数据,然后我们尝试获取该数据的长度。玩转 ImageToBlob(),尝试不同的图像格式。我的源代码在我的家庭和工作 linux 机器上运行良好
猜你喜欢
  • 1970-01-01
  • 2012-07-01
  • 2011-02-19
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多