PHP GD imagettftext 测量
Posted
技术标签:
【中文标题】PHP GD imagettftext 测量【英文标题】:PHP GD imagettftext measurements 【发布时间】:2015-02-07 21:06:03 【问题描述】:我正在尝试编写一个脚本,从 $_GET 参数中获取的文本、大小和字体生成 PNG 图像,但我无法弄清楚如何使图像的大小完全适合文本。我已经在使用 imagettfbox:
$widthPx = abs($ttfBox[2] - $ttfBox[0]);
$heightPx = abs($ttfBox[1] - $ttfBox[7]);
这可能会给我正确的测量值,但是当我绘制文本时,它会有点超出范围。例如,如果我尝试使用 arial.ttf 绘制一个“a”,它至少有 5 个像素超出范围。有没有办法在不测试的情况下绘制完全适合图像的任何字体的文本?
$text = $_GET["text"];
$cmToPixel = 15.0;
$sizeCm = floatval($_GET["sizeCm"]);
$sizePx = $cmToPixel * $sizeCm;
$fontFile = "fonts/".pathinfo($_GET["font"])["filename"].".".pathinfo($_GET["font"])["extension"];
if(!file_exists($fontFile))
die;
$ttfBox = imagettfbbox($sizePx, 0, $fontFile, $text);
$widthPx = abs($ttfBox[2] - $ttfBox[0]);
$heightPx = abs($ttfBox[1] - $ttfBox[7]);
$image = ImageCreate($widthPx, $heightPx);
$x = $ttfBox[0] + (imagesx($image)-$ttfBox[4] )/ 2 - 0;
$y = $ttfBox[1] + (imagesy($image) / 2) - ($ttfBox[5] / 2) - 5;
ImageRectangle($image,0,0,imagesx($image),imagesy($image), ImageColorAllocate($image,255,255,255));
imagettftext($image, $sizePx,0,$x,$y, ImageColorAllocate($image, 0, 0, 0), $fontFile, $text);
header("Content-Type: image/png");
ImagePng($image);
ImageDestroy($image);
【问题讨论】:
您看过手册中提供的示例吗?他们可能会有所帮助:imagettfbbox — Give the bounding box of a text using TrueType fonts 我已经看过所有的例子,看来我必须通过测试像素颜色来修剪图像,因为文本输出太不准确了。当我绘制它时,每个文本都有不同的偏移量,所以它总是超出范围。 是否可以发布您使用的代码以便我们进行试验? 我添加了代码,我对文本的 x 和 y 坐标尝试了不同的方法,但效果并不明显。尝试不同的方法可能会更好,例如按像素颜色修剪图像。 问题是 GD 不使用“字体度量”,它给出了字符“基线”的值和偏移量。 Imagack 确实使用这些值,因此更准确。基本上,在 GD 中,你最终会得到一些依赖于“字体系列”的“软糖”因素。让“imagick”在“windows”上工作“不那么有趣”,我还没有做到。 【参考方案1】:边界框的计算已关闭。这有效:
<?php
/*-
* $MirOS: www/mk/ttf2png,v 1.8 2016/11/02 16:16:26 tg Exp $
*-
* Copyright (c) 2009, 2016
* mirabilos <m@mirbsd.org>
*
* Provided that these terms and disclaimer and all copyright notices
* are retained or reproduced in an accompanying document, permission
* is granted to deal in this work without restriction, including un-
* limited rights to use, publicly perform, distribute, sell, modify,
* merge, give away, or sublicence.
*
* This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
* the utmost extent permitted by applicable law, neither express nor
* implied; without malicious intent or gross negligence. In no event
* may a licensor, author or contributor be held liable for indirect,
* direct, other damage, loss, or other issues arising in any way out
* of dealing in the work, even if advised of the possibility of such
* damage or existence of a defect, except proven that it results out
* of said person's immediate fault when using the work as intended.
*-
* Syntax:
* php ttf2png [text [size [/path/to/font.ttf]]] >out.png
*/
if (!function_exists('gd_info'))
die("Install php5-gd first.");
$gd = gd_info();
if ($gd["FreeType Support"] == false)
die("Compile php5-gd with FreeType 2 support.");
$font = "/usr/src/www/files/FNT/GenI102.ttf";
$fontsize = 30;
$text = "EINVAL";
if (isset($argv[1]))
$text = $argv[1];
if (isset($argv[2]))
$fontsize = $argv[2];
if (isset($argv[3]))
$font = $argv[3];
// Get bounding box
$bbox = imageftbbox($fontsize, 0, $font, $text);
// Transform coordinates into width+height and position
$ascender = abs($bbox[7]);
$descender = abs($bbox[1]);
$size_w = abs($bbox[0]) + abs($bbox[2]);
$size_h = $ascender + $descender;
$x = -$bbox[0];
$y = $ascender;
// Create image
$im = imagecreatetruecolor($size_w, $size_h);
// Allocate colours
$bgcol = imagecolorallocate($im, 0x24, 0x24, 0x24);
$fgcol = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
// Fill image with background colour
imagefilledrectangle($im, 0, 0, $size_w - 1, $size_h - 1, $bgcol);
// Render text into image
imagefttext($im, $fontsize, 0, $x, $y, $fgcol, $font, $text);
// Convert true colour image (needed for above) to palette image
imagetruecolortopalette($im, FALSE, 256);
// Output created image
imagepng($im, NULL, 9);
exit(0);
如果你在同一行写多个字符串,需要计算行的总高度和偏移量,是所有上升部分的最大值加上所有下降部分的最大值,$y
代表所有 imagefttext
对该行的调用同样是所有上升者中的最大值。
【讨论】:
@MarcielFonseca 是 PNG,将其保存到文件或通过xloadimage stdin
或其他合适的图像查看器进行管道传输。 Unix 工具通常会将结果转储到标准输出,以便能够通过管道用作过滤器。以上是关于PHP GD imagettftext 测量的主要内容,如果未能解决你的问题,请参考以下文章
Mac php使用gd库出错 Call to undefined function imagettftext()
解决php-imagettftext()因为–enable-gd-jis-conv导致乱码的另一种方法
Mac OS X 自带PHP环境gd库安装扩展freetype(Call to undefined function imagettftext())
php7安装gd库,解决tp5tp6验证码模块出现未定义imagettftext()的问题