如何使用 PHP GD 将文本写入不同大小的图像
Posted
技术标签:
【中文标题】如何使用 PHP GD 将文本写入不同大小的图像【英文标题】:How to write text to images with different sizes using PHP GD 【发布时间】:2014-04-24 11:29:59 【问题描述】:我正在创建不同尺寸的图像。如何在这些图像上写文字,使文字始终适合图像?
$text = "some text as example";
$font = "arialbd.ttf"
$fontsize = 26;
offset_x = 0;
offset_y = 0;
$image01 = imagecreate( 1120 , 900 );
$image02 = imagecreate( 400 , 300 );
$image03 = imagecreate( 1120 , 900 );
我知道有 imagefttext
函数可以将文本应用于图像,但使用该函数我只能更改字体大小以使文本更大。我怎样才能发现它适合我的形象?
【问题讨论】:
【参考方案1】:如果您希望缩放字体大小以使文本字符串填充图像宽度,请尝试此操作。 使用imagettfbbox,判断当前文本框宽度:
$bbox = imagettfbbox($fontsize,0,$fontpath,$string);
$tbwidth = $bbox[2];
然后将图像宽度除以$tbwidth得到一个因子
$factor = round(($imgwidth / $tbwidth), 0, php_ROUND_HALF_DOWN); //ie. 800/240=3
将 $factor 乘以 $fontsize 以获得近似值。
$newfontsize = $fontsize * $factor; //ie. 12(pt) * 3 = 36
请记住,如果您使用的是 GD 2.0,字体大小是点而不是像素。您的算法将计算默认字体大小文本框(表示为文本框宽度)和图像宽度之间的差异。
【讨论】:
请记住,imagettfbbox
返回一个可以有负值的坐标数组。更好的宽度计算是abs($bbox[2] - $bbox[0])
,就像this answer中所说的那样。
不错的解决方案,但将0
作为round()
的精度传递会给出不准确的结果。如果我在 500px 宽度的图像上有 400px 宽度的文本,它将向下舍入并返回 1.0
,因此不会调整字体大小。我建议更高的精度,或者更好的是,放弃四舍五入。只需使用$imgwidth / $tbwidth
。【参考方案2】:
// Set the content-type
header('Content-Type: image/png');
// Create the image
$im = imagecreatetruecolor(800, 600);
// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefill($im, 0, 0, $white);
// The text to draw
$text = 'Testing...';
// Replace path by your own font path
$font_file = 'arial.ttf';
$font_size = '15';
$bbox = imageftbbox($font_size, 0, $font_file, $text);
$width = $bbox[2] - $bbox[6];
$height = $bbox[3] - $bbox[7];
// Add the text
imagettftext($im, $font_size, 0, 10, 20, $black, $font_file, $text);
// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im);
imagedestroy($im);
【讨论】:
请看这个link。它仍然不是完整的图像,它只是显示在顶部。我希望该文本完全覆盖您创建的所有图像$im = imagecreatetruecolor(800, 600);
【参考方案3】:
使用 imageftbbox 函数获取文本边界框的大小。然后,您可以调整文本大小以完全适合图像的大小。
http://www.php.net/manual/en/function.imageftbbox.php
【讨论】:
【参考方案4】:我最近遇到了具有透明背景的相同情况,但当前示例不是解决方案而是线索或不起作用的解决方案,因此如果有人需要,特此提供一个组合且有效的解决方案。
function imagecreater($width = 600, $height = 600)
//Create an empty transparent image
$img = imagecreatetruecolor($width, $height);
imagealphablending($img, false);
imagesavealpha($img, true);
$transparent = imagecolorallocatealpha($img, 255, 255, 255, 127);
imagefill($img, 0, 0, $transparent);
//Text information
$text = "some text as example";
$font = "arialbd.ttf"
$fontsize = 26; //default font to be altered later
//simulate a complete text box and get the width
$bbox = imageftbbox($fontsize, 0, $font, $text);
$tbwidth = $bbox[2];
//Calculate different between our transparent image and text box
//I've added a little padding (20px) since the text sometimes crossing the edge..
$factor = (($width - 20) / $tbwidth);
//Alter font size with difference to fit fully image
$newfontsize = $fontsize * $factor;
//Find the horisontal center
$bbox = imageftbbox($newfontsize, 0, $font, $text);
$newheight = ($height / 2) + (($bbox[3] - $bbox[7]) / 2);
//Set Color of text
$color = imagecolorallocate($img, 200, 0, 0);
//Produce our image
imagettftext($img, $newfontsize, 0, 0, $newheight, $color, $font, $text);
//Copy image to file and free the cached image
$target = "testimage.png";
imagepng($img, $target);
imagedestroy($img);
正如 rwhite35 在这里提到的,请记住 GD 2.0 写入的字体大小是点而不是像素。
【讨论】:
以上是关于如何使用 PHP GD 将文本写入不同大小的图像的主要内容,如果未能解决你的问题,请参考以下文章
如何将 2 个图像与 PHP(GD-GD2 库)混合,如乘法、颜色燃烧、颜色道奇等