PHP中的ImageMagick标题不填充大小垂直维度

时间:2014-10-29 00:10:04

标签: php imagemagick imagick caption

我拼凑了以下代码,几乎可以使用:

<?php
$img = new Imagick("quote_blank.jpg");
$txt = new Imagick();
$txt->setBackgroundColor("transparent");
$txt->newPseudoImage(380,250, "Caption:".htmlspecialchars($_GET['quote']) );
$txt->colorizeImage('#468847',1);
$img->compositeImage($txt, imagick::COMPOSITE_OVER, 10, 80);
$draw = new ImagickDraw();
$draw->setFillColor('#468847');
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);
$draw->setFontSize(25);
$draw->setFontStyle(3);
$img->annotateImage($draw, 5,5,0, htmlspecialchars($_GET['attrib']) );
$img->setImageFormat('jpg');
header('Content-Type: image/jpeg');
echo $img;
?>

(请注意,quote_blank.jpg是一个400x400的图像背景,文本在其上呈现并与php文件位于同一目录中。)

问题是标题只用很少的短字填充380x250 PseudoImage。任何长度的任何长度都会导致包含任何文本的框的上半部分(或更少)(除了归属注释)。

似乎PseudoImage工作正常,但ImageMagick用于计算字体大小的算法仅用于填充宽度,而不是高度。我不知道它是如何决定行的长度(这可能反过来决定了字体大小,因此决定了字幕框的行数和垂直覆盖范围)。

所以我想我的问题是:有没有办法改变它的计算方式,以便尽可能多地填充字幕框,水平和垂直?

只有几个单词的示例,显示标题可以全高:

更典型的文字长度的示例,显示它没有垂直填充框

2 个答案:

答案 0 :(得分:1)

我使用ImageMagick 6.8.9-8测试了你的代码并获得了以下输出,这比你得到的更好。如果您使用的是旧版本,请尝试更新ImageMagick。

enter image description here

答案 1 :(得分:0)

Vinicius Pinto马上就有了正确的答案。但是在共享服务器上更新并不是那么容易 - 我还没弄明白如何让Imagick使用更新版本。所以我不得不重写我的代码来通过命令行访问ImageMagick,我想分享。就我的评论而言,代码并没有很好地显示出来,所以很抱歉有点欺骗答案功能。

$location='/home/user/local/bin/convert';
$command='convert -background none -size 380x250 -fill "#468847" caption:"'.htmlspecialchars($_GET['quote']).'" quote_blank.jpg +swap -gravity southeast -geometry +10+80 -composite convert -fill "#468847" -gravity southeast -pointsize 25 -annotate 0x20+5+5 "'.htmlspecialchars($_GET['attrib']).'" anno_label.jpg';
exec ($location . ' ' .$command);
header('Content-Type: image/jpeg');
readfile('anno_label.jpg');
unlink('anno_label.jpg');

enter image description here