使用PHP和GD在图像上写入文本

使用PHP和GD在图像上写入文本,php,image,gd,watermark,Php,Image,Gd,Watermark,我的网站有一个图片生成器。它允许访问者在图像上书写自定义文本 我通过显示图片和使用Javascript来处理这种情况,这样他们就可以在图片上写字(预览图片的外观)。他们按“提交”后,我得到x&y坐标、文本和字体大小 (我还支持多种字体大小) 为了在图像上写入文本,我使用ImageTTFText函数 好的,到目前为止一切都很好。现在我的问题是如何知道这个句子什么时候太长,不能放在一行中。我遇到了wordwrap函数,但它不可靠。它根据字符数拆分句子。但是,举个例子,如果你输入“I”十次和“D”十次

我的网站有一个图片生成器。它允许访问者在图像上书写自定义文本

我通过显示图片和使用Javascript来处理这种情况,这样他们就可以在图片上写字(预览图片的外观)。他们按“提交”后,我得到x&y坐标、文本和字体大小

(我还支持多种字体大小)

为了在图像上写入文本,我使用ImageTTFText函数

好的,到目前为止一切都很好。现在我的问题是如何知道这个句子什么时候太长,不能放在一行中。我遇到了wordwrap函数,但它不可靠。它根据字符数拆分句子。但是,举个例子,如果你输入“I”十次和“D”十次,你会发现宽度有差异

好的,然后我遇到了ImageTTFBBox,它会计算盒子的大小,这样我就知道它什么时候太长了。好吧,这很好,但是我怎么能把句子分开呢?(用文字)


如果有人能给我一个答案,我将不胜感激。

我的逻辑是在每行中添加尽可能多的单词,而不必删去一个单词。因此,我会在一行中添加一个单词,用
ImageTTFBBox()
检查其渲染大小,然后重复,直到行溢出(然后删除导致溢出的单词)。如果你遇到的情况是线溢出,而线上只有一个字,那么你必须删掉这个字。您将多次调用
ImageTTFBBox()

如果您使用的是HTML5,您可以在发送之前请求Javascript提供一些帮助。假设您有一个画布(甚至是在代码中创建的)和一个上下文
ctxt
,您可以执行以下操作:

ctxt.font = "14pt Arial";
ctxt.textAlign = "left";
ctxt.fillStyle = "#000";
ctxt.fillText(text, x, y);
var metrics = ctxt.measureText(text);
var width = metrics.width;
现在您知道了文本的宽度,并且可以进行一些基本的换行。假设您的有效宽度(图像宽度减去内边距)为180像素,文本宽度为679像素。这是一个+/-25%的比率(26.05%)。使用该比率提取句子的前25%,查看其宽度是否合适,绘制并向下移动一行