我注意到,对于带重音符号的字符(比如法语!!)
像这样
strlen("câble" * imagefontwidth(FONTSIZE));
此命令给出的字符串长度比实际长度大
因此,您必须在传递字符串之前对其进行 utf8 解码
strlen(utf8_decode("câble") * imagefontwidth(FONTSIZE));
就是这样(抱歉我的英语!)
(PHP 4, PHP 5, PHP 7, PHP 8)
imagefontwidth — 获取字体宽度
返回字体的像素宽度。
范例 #1 在内置字体上使用 imagefontwidth()
<?php
echo 'Font width: ' . imagefontwidth(4);
?>
上面的例子将输出类似以下内容
Font width: 8
范例 #2 将 imagefontwidth() 与 imageloadfont() 结合使用
<?php
// 加载一个 .gdf 字体
$font = imageloadfont('anonymous.gdf');
echo 'Font width: ' . imagefontwidth($font);
?>
上面的例子将输出类似以下内容
Font width: 23
我注意到,对于带重音符号的字符(比如法语!!)
像这样
strlen("câble" * imagefontwidth(FONTSIZE));
此命令给出的字符串长度比实际长度大
因此,您必须在传递字符串之前对其进行 utf8 解码
strlen(utf8_decode("câble") * imagefontwidth(FONTSIZE));
就是这样(抱歉我的英语!)
此库函数对于只包含文本的可变大小图像非常有用,就像我用来输出导致缩略图生成器中致命错误的累积错误消息的函数一样
<?php
function errimg($error) {
// $error 是一个错误消息数组,每条消息占一行
// 初始化
$font_size = 2;
$text_width = imagefontwidth($font_size);
$text_height = imagefontheight($font_size);
$width = 0;
// 图像的高度将是 $error 中项目的数量
$height = count($error);
// 这将获取最长字符串的长度(以字符为单位),以确定
// 输出图像的宽度
for($x = 0; $x < count($error); $x++) {
if(strlen($error[$x]) > $width) {
$width = strlen($error[$x]);
}
}
// 接下来我们将高度和宽度转换为像素值
$width = $width * $text_width;
$height = $height * $text_height;
// 创建具有适合文本的尺寸的图像,另外添加两行和
// 两列用于边框
$im = imagecreatetruecolor($width + ( 2 * $text_width ),
$height + ( 2 * $text_height ) );
if($im) {
// 图像创建成功
$text_color = imagecolorallocate($im, 233, 14, 91);
// 此循环将错误消息输出到图像
for($x = 0; $x < count($error); $x++) {
// imagestring(image, font, x, y, msg, color);
imagestring($im, $font_size, $text_width,
$text_height + $x * $text_height, $error[$x],
$text_color);
}
// 现在,使用您最喜欢的 image* 函数渲染您的图像
// (例如,imagejpeg)
out($im, array(), $error);
} else {
// 图像创建失败,因此只转储数组以及额外的错误
$error[] = "Is GD Installed?";
die(var_dump($error));
}
}
?>
该函数期望传入一个错误消息数组,然后输出一个包含数组内容的图像。如果您代码包含在 HTML 页面中,并且该页面将在图像无法正确渲染时显示 REX,则此函数特别有用。
此函数以图像形式显示数组,索引 0 在顶部,最高索引在底部。
不过,您需要自己编写 out(),有关如何编写体面的输出函数,请参阅 imagejpeg、imagepng 等。
一个比 ImageFontWidth 更快的函数,适用于某些用途
<?
function ImageFontWidthByFilename($filename)
{
$handle = @fopen($font_locations[$i],"r");
$c_wid = @fread($handle,11);
@fclose($handle);
return(ord($c_wid{8})+ord($c_wid{9})+ord($c_wid{10})+ord($c_wid{11}));
}
echo "./font.gdf is ".ImageFontWidthByFilename("./font.gdf")." pixels wide";
?>
读取 5 种不同字体的宽度,共读取 500 次,ImageFontWidth 平均每次读取 5 个字体需要 ~0.004 秒,而我的函数每次读取 5 个字体需要 ~0.0003 秒。
原因是 ImageFontWidth 需要调用 ImageLoadFont,但如果您出于某种原因不需要加载字体,只需要找出宽度,那么这个函数就是您的不二之选 :-)
在 http://puremango.co.uk 上有更多这样的奇迹