PHP imageftbbox imagettftext - 简单的字母间距/字距调整?

2024-02-06

有谁知道使用 imagettftext 进行字母间距/字距调整的简单方法?我的脚本按照我现在的需要工作,但我确实可以使用具有 CSS 样式的生成文本

letter-spacing: -0.01em;

所以它与页面上的标准文本相匹配,但我没有看到任何方法可以轻松做到这一点。我确实找到了与此相关的以下线程,但我尝试将答案放入我的代码中,但没有一个达到预期的效果。

php imagettftext 字母间距 https://stackoverflow.com/questions/6926613/php-imagettftext-letter-spacing

我当前的代码如下

<?php
include 'deliverytimes.php';

$date = new DateTime();
$now = date("Y-m-d H:i:s");
$h = date("H:i:s"); 

$days = explode(",", $businessDaysToAdd);
if (count($days) > 1) {
      
    $two_weekdays_later_1 = strtotime(date("Y-m-d H:i:s", strtotime($now)) . " +" . $days[0] . " weekdays $h");
    $date_1 = new DateTime("@$two_weekdays_later_1"); 
    $formattedDeliveryDate_1 =  $date_1->format('jS M');
    $formattedDeliveryDate_3 =  $date_1->format('jS \o\f F');
    
    $two_weekdays_later_2 = strtotime(date("Y-m-d H:i:s", strtotime($now)) . " +" . $days[1] . " weekdays $h");
    $date_2 = new DateTime("@$two_weekdays_later_2"); 
    $formattedDeliveryDate_2 =  $date_2->format('jS M.');
    $formattedDeliveryDate_4 =  $date_2->format('jS \o\f F');   

    $formattedDeliveryDate1 = $formattedDeliveryDate_3;
    $formattedDeliveryDate2 = $formattedDeliveryDate_4;

    $formattedDeliveryDate = "If ordered today we estimate delivery to be approximately between " . $formattedDeliveryDate_1 . " and " . $formattedDeliveryDate_2;
} else {
    $h = date("H:i:s");   
    $two_weekdays_later = strtotime(date("Y-m-d H:i:s", strtotime($now)) . " +" . $businessDaysToAdd . " weekdays $h");
    $date = new DateTime("@$two_weekdays_later"); 
    $formattedDeliveryDate = "If ordered today we estimate delivery approximately by " . $date->format('l, jS M.');
}

$defaultOutput = 'main';
$textMobile = isset($_REQUEST['mobile']) ? $_REQUEST['mobile'] : $defaultOutput;

switch($textMobile) {
    case "main":
        $textToUse = $formattedDeliveryDate;
        break;
    case "p1":
        $textToUse = $formattedDeliveryDate1;        
        break;
    case "p2":
        $textToUse = $formattedDeliveryDate2;        
        break;
}

// Path to our font file
$font = './Inter-SemiBold.ttf';
$fontBold = './Inter-Bold.ttf';
$size = 24;
$size2 = 83;
$bbox   = imageftbbox($size2, 0, $fontBold, $textToUse);
$width  = 1020;
$height = 110;
$im    = imagecreatetruecolor($width, $height);
$x = ($width - ($bbox[4] - $bbox [0])) / 2;
imagealphablending($im, false);
imagesavealpha($im, true);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
$grey = imagecolorallocate($im, 161, 161, 168);
$trans = imagecolorallocatealpha($im, 255, 255, 255, 127);
imagefilledrectangle($im, 0, 0, $width, $height, $trans);

$defaultTextColour = 'white';
$textColour = isset($_REQUEST['colour']) ? $_REQUEST['colour'] : $defaultTextColour;

switch($textColour) {
    case "white":
        $textColourUse = $white;
        break;
    case "black":
        $textColourUse = $black;        
        break;
    case "grey":
        $textColourUse = $grey;        
        break;
}

// Write it
imagettftext($im, $size2, 0, $x, -$bbox[7], $textColourUse, $fontBold, $textToUse);

// Output to browser
header('Content-Type: image/png');
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
imagepng($im);
imagedestroy($im);

我明白你的意思。如果没有任何字距调整,您的输出将如下所示:

当我采取接受的答案 https://stackoverflow.com/questions/6926613/php-imagettftext-letter-spacing,这对于您的目的来说已经足够了,对于间距设置为这样的情况来说,它看起来像这样-0.5:

注意之间的空间如何f and e仍然很大,而在其他地方字母甚至可以重叠。

造成这种情况的原因是什么?有办法预防吗?

让我们从绘制盒子开始,由imagettfbbox()字母周围:

显然,这个惯例并没有完全按计划进行。您会期望水平重叠(如果存在)对于所有框都是相同的。

解释这个有点困难,它与字体字距调整 https://en.wikipedia.org/wiki/Kerning。字距调整可以减去字母前后的空格:

重要的是要认识到$x你给予的位置imagettftext()考虑到这种字距调整。所以即使你说一封信应该写在(x,y)这不是返回的坐标之一imagettfbbox()。该函数返回所绘制字母的边界框,如红色矩形所示。

现在让我们看看,有了这些知识,我们是否可以绘制均匀间隔的字母:

显然这是可能的。我使用的代码是这样的:

function imagettftextSpacing($image, $size, $x, $y, $color, $font, $text, $spacing = 0)
{
    foreach (mb_str_split($text) as $char)
    {
        $frontBox = imagettfbbox($size, 0, $font, $char);
        $charBox  = imagettftext($image, $size, 0, $x - $frontBox[0], $y, $color, $font, $char);
        $charW    = $charBox[2] - $charBox[0];
        $x       += $charW + $spacing;
    }
}

这会获取字符的水平偏移并在绘制字符时进行纠正。

虽然这是一个进步,但还没有完全令人满意。有些字母接触,有些则不接触。这是因为我们纠正了字符前面的字距调整,但没有纠正后面的字距调整。我们需要以某种方式找出后面的字距调整是什么,然后进行纠正。我把这段代码搞砸了:

function getBBoxW($bBox)
{
  return $bBox[2] - $bBox[0];
}


function imagettftextSpacing($image, $size, $x, $y, $color, $font, $text, $spacing = 0)
{
    $testStr = 'test';
    $testW   = getBBoxW(imagettfbbox($size, 0, $font, $testStr));
    foreach (mb_str_split($text) as $char)
    {
        $fullBox = imagettfbbox($size, 0, $font, $char . $testStr);
        imagettftext($image, $size, 0, $x - $fullBox[0], $y, $color, $font, $char);
        $x      += $spacing + getBBoxW($fullBox) - $testW;
    }
}

我创建了一个单独的函数来获取边界框的宽度,因为我计算了很多,并且函数名称更清楚地表明了正在执行的操作。我使用一个测试字符串,并检查它的宽度,以便稍后计算它前面的字符的作用。我终于弥补了这一点。结果是这样的:

这显然更好,您很难发现它比本答案开头的示例间隔更近,但事实确实如此。

我不得不承认这相当复杂,我不知道你为什么要这样做。使用基本的 HTML 和 CSS 可以更好地完成同样的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP imageftbbox imagettftext - 简单的字母间距/字距调整? 的相关文章

  • 提交ajax表单并停留在同一页面不起作用

    我想将用户的评论存储在我的数据库中 当用户提交时 我不想将他们重定向到新页面 我有以下代码 但它不起作用 我的 HTML 代码
  • 当存在联系时如何为数组分配排名号

    当尝试为数组中存在平局的数值分配排名时 我很难知道从哪里开始 因此 例如 我需要像下面这样转换一个数组 myarray 4 76 34 13 34 到另一个数组中 例如 myarray2 1 5 3 5 2 3 5 基本上 当相同的数字在数
  • 如何通过键查找最大和最小日期

    我有一个数组 a array 2010 05 03 gt 100 2010 05 04 gt 400 2008 05 01 gt 800 2011 01 01 gt 800 我如何找到最大值和最小值key date 例如 max gt 20
  • 如何为 Lumen 的封闭路线指定路线名称?

    您好 我有以下流明路线 router gt get end function Illuminate Http Request request use router controller router gt app gt make App H
  • Instagram 如何使用 Amazon S3?

    在将文件上传到 Amazon S3 时 我需要深入了解 Instagram 的工程 我刚刚开始使用 S3 我认为 Instagram 是一个值得效仿的好模式 因为他们每天上传数千张图片 我的应用程序有点相似 用户上传图片 可以删除自己的图片
  • Symfony php.ini Debian

    我在 Oracle VM VirtualBox 上使用 Debian 7 amd64 LAMP 服务器 我正在尝试安装 Symfony 但遇到了一些小问题 当我运行命令时 php my project name app check php
  • php 在内容前插入十六进制字符数

    我正在将网站移动到新服务器 旧服务器有 php 5 3 2 新服务器有 php 5 5 9 Centos httpd Apache 2 2 26 我已经复制了文件 它工作正常 除了唯一奇怪的事情 一些奇怪的十六进制数字被插入到页面内容之前
  • 这些加密算法有什么区别?

    两者有什么区别MCRYPT RIJNDAEL 128 MCRYPT RIJNDAEL 256 MCRYPT BLOWFISH等等 哪一种最适合网络数据传输 Rijandel 是 AES 的另一个名称 AES 是当前的 一个好的标准 算法 数
  • FPDF - 内嵌粗体文本

    我正在尝试从 PHP 创建 PDF 出于法律原因 我们需要将免责声明的一部分设为粗体 并且需要概述免责声明 我当前的代码使用 if isset POST optout POST optout yes pdf gt Ln 5 pdf gt S
  • 如何从字符串中只获取数字? [复制]

    这个问题在这里已经有答案了 我有这样的字符串 第 001 课 完成 在这种情况下 我只想获取数字部分001 我试过这个 str the title preg match all d str matches number implode ma
  • 一次将多个值插入MySQL [重复]

    这个问题在这里已经有答案了 谁能解释一下为什么这个 PHP MySQL 不起作用 基本上我需要从表单中一次插入大量行 因此会有多个名称字段 多个短 中 长字段等 我收到此错误 Notice Undefined variable Short1
  • Yii2 DropDownList Onchange 更改自动完成小部件“源”属性?

    我已经尝试过这个 yii2 依赖的自动完成小部件 https stackoverflow com questions 27025791 yii2 dependent autocomplete widget 但我不知道为什么它不起作用 这是我
  • 如何在 joomla 模块中通过 javascript 发送输入文件类型

    我想将带有 javascript 的文件发送到 php 文件 我的 php 文件中有这个表单
  • 在 MySQL 中搜索多个单词

    我使用 HTML 表单来允许用户查找数据库表中的条目
  • ZF2 工厂获取参数

    我有一个动态类别导航 在导航工厂中 我想从路线获取参数 我怎样才能做到这一点 在我看来 在我的 module php 中 public function getServiceConfig return array factories gt
  • 解析 PHP 响应:未捕获的语法错误:意外的标记 <

    我正在使用 AJAX 来调用 PHP 脚本 我唯一需要从响应中解析的是脚本生成的随机 ID 问题是 PHP 脚本会引发许多错误 这些错误实际上很好 不会妨碍程序功能 唯一的问题是当我跑步时 parseJSON response I get
  • php向多个收件人发送邮件

    我可以通过在邮件程序中定义 id 来将电子邮件发送到一个电子邮件 id 但是当用户在表单中键入 消息和电子邮件 id 时 我无法理解如何发送到多个收件人 例如 我正在显示一个带有两个文本区域的表单 一个用于电子邮件 ID 一个用于自定义消息
  • 从外部 bash 设置环境变量

    我试图使用 PHP 从命令行 设置 bash 环境变量 但没有成功 buff array buff VARTESTKEY VARTESTVALUE buff export VARTESTKEY file put contents scrip
  • PHP 中的嵌套 JSON 输出

    我正在为 iOS 应用程序构建 API 并尝试将 mySQL 数据转换为 JSON 字符串进行处理 所需的输出将需要顶级订单详细信息 例如客户名称和地址 然后是订购的产品子数组 我需要的两个表中有相当多的字段 我希望拥有所有字段 我已经构建
  • NodeJS 和 PHP (Laravel) 集成用于 Socket.IO 实时聊天

    目前我有一个我写过的网站PHP通过Laravel 框架 我已经使用写了一个实时聊天nodeJS with 套接字IO and Express现在我想做的是将它集成到我已经编写的 Laravel 网站中 问题是聊天必须在主页中 当前由 Lar

随机推荐

  • jquery 与相同脚本冲突

    我正在使用 jquery 将内容加载到选项卡中 并在单击时切换选项卡 我的问题是 我在一页中使用了这个 选项卡切换器 两次 并且它导致了冲突 我对jquery不太有经验 所以我的问题可能在于我在头脑中创建了两次函数 这是我的 jquery
  • ST_Buffer 相当于 MySQL 中基于圆的搜索吗?

    我需要使用 MySQL GIS 搜索具有指定圆内的点的行 伪代码示例查询是 select from gistable g where isInCircle g point circleCenterPT radius 看来 PostGIS 可
  • AWS ELB(弹性负载均衡器)有时会立即返回 504(网关超时)

    我目前正在将应用程序切换到亚马逊 但我注意到有时收到的响应是 504 我们的系统设置方式是在 ELB 前面有一个 LB 然后直接转到 tomcat 目前 我们正在对服务中的所有请求以及记录响应时间的 servlet 过滤器进行计时 它们始终
  • Zip Mime 类型无法识别

    我正在尝试返回一个 zip 文件 作为浏览器上的流 这适用于其他类型的文件 例如 Excel 文件 但是当我开始处理 zip 文件时 我无法让浏览器识别出它是 zip 我的测试机上运行的 Firefox 和 IE 都会提示 询问使用什么程序
  • Python UCS2 从十六进制字符串解码

    我正在使用 python 2 7 需要将十六进制字符串解码为 un icode 字符串 在 php 中 我做了以下简单的操作 line hex2bin line finish iconv UCS 2BE UTF 8 nline 例如十六进制
  • 我可以在 android xml 布局或字符串值文件中编写 java 代码吗?

    我想知道是否可以在 android XML 布局或字符串值文件中编写 java 代码 我的意思是这样的
  • 给定3个点,如何构造穿过它们的弧?

    假设我有 3 个连续点 P1 P2 P3 如何构造一条经过所有3个点的弧 弧必须具有以下 3 个属性 开始弧度 结束弧度 中心点 弧线是从Start Radian to End Radian以逆时针方向 我已经尝试过解决方案here htt
  • 东向北转纬度经度

    我有东向 北向格式的位置坐标 但我需要将其转换为正确的经纬度 以使其在 bing 地图中居中 有任何公式或详细信息如何将东距 北距转换为纬度 经度吗 编辑 更具体地说 我需要将 SVY21 坐标转换为 WGS84 东距和北距分别是基点向东和
  • EMR-5.32.0 上的 Spark 未生成请求的执行程序

    我在 EMR 版本 5 32 0 上的 Py Spark 中遇到了一些问题 大约一年前 我在 EMR 集群上运行了相同的程序 我认为版本一定是 5 29 0 然后我可以使用配置我的 PySpark 程序spark submit正确地论证 但
  • 正在验证 MVC 隐藏字段

    我的页面上有一些字段 它们的显示和消失取决于您在页面上所做的下拉选择 所以 举例来说 我有 section Html LabelFor model gt model AuctionTypeId div Html DropDownList A
  • 在我的下一个 Android 应用程序更新中使用新的数据库版本覆盖现有的已发布 Sqlite DB

    我想覆盖旧应用程序版本附带的现有数据库 并在下一个应用程序更新中使用新完全填充的数据库 然而 onUpgrade 永远不会被调用 尽管我尝试在将 DB version 传递给 SQLiteOpenHelper 类时更改它 public cl
  • FTDI 的 libMPSSE 上“遇到 NULL 表达式”

    我的问题是针对 FTDI 的 libMPSSE 库在 Linux 上与 USB 转串口 SPI I2C 等 适配器配合使用的问题 当我执行与该库链接的任何程序时 会调用方法 Init libMPSSE 无需显式调用 并抛出以下消息 Infr
  • 如何在 Python 中的 Opencv Cam 窗口中提供启动、停止、捕获和关闭按钮

    如何在视频捕获窗口中提供开始 停止 捕获和关闭按钮来启动 停止 拍摄快照 关闭窗口 我使用以下代码打开相机进行视频流 import cv2 cv as cv cv NamedWindow camera 1 capture cv Captur
  • 3ds Max .NET SDK 和创建参考制作器

    我有 Net DLL for Max 和 ui 我想对视口中某些节点的参数更改做出反应 我想到的最简单的解决方案是创建 ReferenceMaker 插件并为我想要观看的节点设置参考 根据文档应该是 public class Referen
  • Valgrind 导致长双精度数字问题

    我的代码中有以下函数 用于检查数字是否具有允许的值 在日志空间中 template
  • ASP.NET MVC 3 模型绑定资源

    我正在寻找一个很好的资源 它非常全面地描述了模型绑定如何与 ASP NET MVC 3 或在较小程度上 MVC 2 和不同的方法一起工作 除了零碎的内容之外 我找不到关于这个主题的任何好的资源 网上的信息更多的是关于 如何做 X 而不是解释
  • ASP.NET MVC3 - 您如何处理探测请求?

    我们的网站上线了 当然 我们开始收到大量的探测请求 喜欢 blog wp login php admin admin php etc 所以问题是 你用它们做什么 现在 在每种情况下都会抛出 404 错误 并且 elmah 会发送有关该错误的
  • 为什么我们不能在某个进程上接受()套接字并从其子进程中接收()数据?

    我正在尝试在 Linux 上实现一个简单的 Web 服务器 它连接到客户端 浏览器 接收来自客户端的一些请求 例如 GET 然后用所需的文件发回响应 我正在使用套接字通信 我想在服务器启动时创建一个工作进程 子进程 池 其工作是处理传入的请
  • 如何将肥皂基本身份验证请求添加到 WSDL

    我怎样才能对 WSDL 进行 Soap AUTH BASIC 身份验证 以便阅读 WSDL 的人知道我需要针对特定 方法进行该操作 使用下面的示例 我成功地将 SOAP 基本身份验证传递到另一端的 php Web 服务 PHP net So
  • PHP imageftbbox imagettftext - 简单的字母间距/字距调整?

    有谁知道使用 imagettftext 进行字母间距 字距调整的简单方法 我的脚本按照我现在的需要工作 但我确实可以使用具有 CSS 样式的生成文本 letter spacing 0 01em 所以它与页面上的标准文本相匹配 但我没有看到任