PHP中的ImageMagick标题未填充垂直尺寸

3
我拼凑出了以下代码,它差不多能够工作:

<?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用于计算字体大小的算法仅设计用于填充宽度,而不是高度。我不知道它如何决定要使用哪个行长(这可能反过来决定字体大小,因此也决定了标题框的行数和垂直覆盖范围)。
所以我的问题是:是否有任何方法可以更改它的计算方式,以便尽可能填满标题框,包括水平和垂直方向?
以下是只有几个单词的示例,显示标题可以达到完整高度: 以下是更典型长度的文本示例,显示它无法垂直填满框:

ImageMagick: 6.6.9-7 2014-03-06 Q16PHP: 5.3.27 - james3mg
我有ImageMagick 6.8.9-8,尝试更新。 - Vinicius Braz Pinto
不是从文件读取空白画布,您可以使用$image->newImage(400, 400,'none');动态地创建一个。 - Mark Setchell
@Vinicius 我正在尝试并边学边做。我在一个共享的Ubuntu服务器上,使用DreamHost,由于现有CMS存在一些问题,无法升级到PHP 5.4。因此,预安装的是ImageMagick和Imagick的版本。我之前没有意识到ImageMagick和Imagick是不同的,但现在我认为我理解了Imagick是使用ImageMagick后端的PHP扩展。那么...我想我需要更新ImageMagick和Imagick吗?或者只更新ImageMagick是否可行,假设现有的Imagick会使用新库...? - james3mg
@james3mg 你不能先在本地开发环境上测试一下吗?我猜你可以尝试只更新ImageMagick,但我不确定。 - Vinicius Braz Pinto
显示剩余4条评论
2个回答

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

enter image description here


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接