使用ImageMagick显示字体图标时出现编码错误

3
我正在尝试使用Fontawesome和ImageMagick将其字符显示为PNG,以下是我的代码:

$size = '50';
$text = '';
$imgW = 200;
$imgH = 200;
$font = 'fontawesome-webfont.ttf';
$image = new Imagick();
$image->setResolution(144,144);
$draw = new ImagickDraw();
$draw->setFont($font);
$draw->setFontSize($size);
//$draw->setTextEncoding('UTF-8');
//$draw->setStrokeAntialias(true);
//$draw->setTextAntialias(true);
$image->newImage($imgW, $imgH, new ImagickPixel('none'));
$image->annotateImage($draw, 10, 45, 0, $text);
$image->setImageFormat('png');
header('Content-type: image/png');
echo $image;

但是图像输出看起来像这样: 编码图像 有什么想法可以解决这种编码问题吗?

fontawesome-webfont.ttf 是否在同一目录下? - Pitchinnate
如果文件不在同一目录下或目录无效,它会抛出异常而不是渲染图像。 - Mostafa Darwish
2个回答

2
使用这个答案的例子来确保我传递给ImageMagick的是一个UTF-8字符串对我很有用。与你的代码唯一的不同之处在于第二行:
$size = '50';
$text = html_entity_decode("", ENT_COMPAT, 'UTF-8');
$imgW = 200;
$imgH = 200;
$font = 'fontawesome-webfont.ttf';
$image = new Imagick();
$image->setResolution(144,144);
$draw = new ImagickDraw();
$draw->setFont($font);
$draw->setFontSize($size);
//$draw->setTextEncoding('UTF-8');
//$draw->setStrokeAntialias(true);
//$draw->setTextAntialias(true);
$image->newImage($imgW, $imgH, new ImagickPixel('none'));
$image->annotateImage($draw, 10, 45, 0, $text);
$image->setImageFormat('png');
header('Content-type: image/png');
echo $image;

0

看起来 Unicode 序列没有被正确识别,因为你得到了多个字符而不是一个。如果出现一个缺失的块显示 - 这是字体问题!

我在 Ruby RMagic 中使用了 Unicode 转义,所以也许相同的序列在 PHP 中也能用?

http://fortawesome.github.io/Font-Awesome/cheatsheet/ 上,“fa-heart”被列为“#xf004;” 这似乎是一个 HTML 转义,所以你需要的应该是:

$text = "\uf004";

你是否也将 PHP 脚本设置为以 UTF-8 模式运行?mb_internal_encoding("UTF-8"); // 更多信息请参见:http://php.net/manual/en/function.mb-internal-encoding.php - David Douglas
将字符集都设置为UTF-8。mb_internal_encoding("UTF-8"); 并使用 $draw->setTextEncoding('UTF-8'); - David Douglas
我试过了,但效果不佳。这个问题与PHP无关,而是关于imagemagick如何读取Unicode。如果我使用另一个库(如GD),它可以渲染图标而没有任何问题。 - Mostafa Darwish

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