【发布时间】:2010-10-14 09:18:17
【问题描述】:
我可以说在命令行上使用 ImageMagick
convert -background '#0000' -fill white -stroke black -strokewidth 3 -gravity center -pointsize 78 -size 568x1000 caption:'Lorem ipsum etc etc' -trim +repage out.png
并产生我正在寻找的输出。我想做的是同样的事情,但在 PerlMagick 中,这样我就不必在执行各种其他步骤时继续读取和写入文件。这是我目前所拥有的
use strict;
use warnings;
use Image::Magick;
my $im = new Image::Magick;
my $e = $im->Set(
background => '#0000',
fill => 'white',
stroke => 'black',
strokewidth => 3,
gravity => 'center',
pointsize => 78,
size => '586x1000',
);
die $e if $e;
$e = $im->Read("caption:Lorem ipsum etc etc");
die $e if $e;
$e = $im->Trim();
die $e if $e;
$e = $im->Set(page=>'0x0+0+0'); # +repage
die $e if $e;
$e = $im->Write('out.png');
die $e if $e;
除了结果文本没有居中之外,它的工作方式完全相同。
PerlMagick 上的文档几乎不存在。我将这种“阅读标题”语法基于一些 MagicWand 示例,据称这将导致文本居中。 PerlMagick 显然有些不同。
所以,问题是:在这种情况下,我怎样才能让 PerlMagick 尊重重力?如何通过 PerlMagick 获得多行、居中和自动换行的文本?请注意,这要求我使用标题而不是注释或绘制。我宁愿避免手动每行居中,但我会考虑。
或者,如果有人有做自动换行、使用比例字体和注释的示例,那么这对我有用。
编辑:请注意,宝丽来的 -caption 选项虽然与我正在做的事情共享实现,但与标题不同:伪图像。如果输出与上面示例转换命令给出的内容非常匹配,我仍然会接受使用宝丽来和 -caption 的答案。
编辑 2:这是一个更简单的问题示例。
use strict;
use warnings;
use Image::Magick;
my $im = new Image::Magick;
my $e = $im->SetAttribute(
background => '#0000',
pointsize=>12,
size => '100x100',
gravity => 'center',
);
die $e if $e;
$e = $im->ReadImage('caption:The quick brown fox jumps over the lazy dog.');
die $e if $e;
$e = $im->Write('out.png');
die $e if $e;
预期结果:文本居中。
实际结果:文本左对齐。
实际结果应该与此命令的输出相同:
convert -background '#0000' -size 100x100 -pointsize 12 -gravity center caption:'The quick brown fox jumps over the lazy dog.' out.png
通过查看 perlmagick 源,我看不到任何应该拦截特定 SetAttribute 调用的内容,所以我不明白为什么忽略重力。我怎样才能让重力不被忽视?或者,我还能如何使用这种输出进行自动换行和居中文本?
【问题讨论】:
-
这个没试过,不知道这里有没有可以重复使用的东西。 code.google.com/p/image-boxmodel/source/browse/trunk/lib/Image/…
-
我会在几个小时后下班回家试试。我最终的解决方法是让 PerlMagick 以不同的点大小重复执行非居中渲染,直到生成的图像在我的盒子大小内。然后我调用通过 system() 进行转换并让它执行最终渲染。然而,它使用的 CPU 能力是真正的原生解决方案的许多倍,所以我仍在尝试,但至少我有一些可以依靠的东西。
标签: perl imagemagick