- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在由 PHP GD 库创建的图像中使用 Verdana 字体。
imagettftext($image, $fontSize, 0, 70, $y, $color, $font, $username );
大多数情况下 imagettftext 对字符串工作得很好。
但是我的一些用户在他们的名字中使用了奇怪的字符/符号。
因此,当我尝试将他们的名字打印到图像时。例如:
该用户使用 ɦɪɲɣƙƨєʌɾ
符号。所以 Verdana 无法打印它们。
我用过这个:
$username=iconv('UTF-8', 'ASCII//TRANSLIT', $username);
输出是这样的:
(当前语言环境在英语和德语之间发生变化。因此可能当前语言环境无法处理这些字符:ɦɪɲɣƙƨєʌɾ
)
似乎不可能将 ɦ
音译为 h
,将 ɲ
音译为 n
而不写一个非常大 str_replace()
block 。喜欢this .
所以我想知道是否可以检查字体(Verdana)是否可以显示这些符号。如果其中一个字符无法在字符串中显示,那么我可以将一个空字符串传递给 imagettftext
方法。我可以检查 font 中支持的字符吗?或者创建一个包含 Verdana 支持的符号的字符映射表,并检查我的字符串是否包含不受支持的符号?
(我认为这是不可能的,因为 this question )
或者另一种解决方案,是否可以在 imagettftext()
中使用多种字体?
比如先试试Verdana,如果Verdana不覆盖那符号就用Arial sans serif等。
或者任何其他解决方案?
编辑:
似乎 Verdana 不支持我的文本中的这些 unicode 字符。
Verdana 支持的字符:http://www.fileformat.info/info/unicode/font/verdana/grid.htm
Verdana 不支持的字符:http://www.fileformat.info/info/unicode/font/verdana/missing.htm
最佳答案
我的第一选择是切换到支持您希望能够处理的所有字符范围的字体。但不要指望单一字体会实现 million-or-so possible characters in UTF-8 .
现在,如果你想走(懒惰的;)音译路线,我会引用this answer from Kemal Dağ :
Transliterator
类我现在手头没有 v5.4,所以我无法判断 Transliterator
,但是 Kemal Dağ 的 JTransliteration
端口表现非常好:
<?php
require 'transliteration/JTransliteration.php';
$input = 'ɦɪɲɣƙƨєʌɾ';
echo JTransliteration::transliterate($input); // output: hIngk2ie^r
$input = 'Хეλлఒ Wओრলद';
echo JTransliteration::transliterate($input);
最后,如果你想检查给定的字体是否支持给定的字符,它会变得有点复杂。 This library会有很大帮助。它需要 >= 5.3(命名空间的使用):
<?php
$fontFile = 'arial.ttf';
$charToCheck = 'ɣ';
require_once 'php-font-lib-master/src/FontLib/Autoloader.php';
use FontLib\Font;
use FontLib\TrueType\Collection;
$font = Font::load($fontFile);
if ($font instanceof Collection) {
$font = $font->getFont(0);
}
$subtable = null;
foreach($font->getData("cmap", "subtables") as $_subtable) {
if ($_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1) {
$subtable = $_subtable;
break;
}
}
if (isset($subtable["glyphIndexArray"][ord_utf8($charToCheck)])) {
$supported = 'Supported';
} else {
$supported = 'Not Supported';
}
echo "$charToCheck is $supported by font $fontFile";
function ord_utf8($c) {
$b0 = ord($c[0]);
if ( $b0 < 0x10 ) {
return $b0;
}
$b1 = ord($c[1]);
if ( $b0 < 0xE0 ) {
return (($b0 & 0x1F) << 6) + ($b1 & 0x3F);
}
return (($b0 & 0x0F) << 12) + (($b1 & 0x3F) << 6) + (ord($c[2]) & 0x3F);
}
无耻地从 font_info.php
中窃取代码和 R. Hill 的 ord_utf8()
P.S. 字符串“ɦɪɲɣƙƨєʌɾ”是由国际音标中的字符组成的。我不确定任何 locale 是否支持这些字符(因为没有实际需要,因为它们不被任何真正的人类语言使用)。
关于php - 使用 imagettftext() 时如何处理字体文件不支持的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22271634/
$app_id, 'secret' => $app_secret, 'cookie' => true )); $user = $facebook->getUser()
我想使用以下方式将我添加到图像中的文本居中: imagettftext($image, 85, 0, 250, 350, $color, $font, $txt ); 我试过这样的: $fontwid
我对 PHP 函数 imagettftext 有疑问。我有从带有文本信息的数据库生成卡片图像的代码。对于一些卡片,我有问题 - 单词是相互重叠的( like here )。 我的代码看起来像这样(字体
我已经成功地将文本写入我的 img 并正确放置它,但是我遇到的问题是增加字体大小会使文本从图像中消失。 所以我知道我可以通过简单地增加写入屏幕的文本的行高来实现我想要的外观。我似乎找不到任何关于是否/
我有这个代码: $im = imagecreatetruecolor(70, 25); $white = imagecolorallocate($im, 255, 255, 255); $grey =
我正在训练我的 PHP 技能来生成图像。我只需要一件不起作用的东西。我不认为这是可能的我想要的方式,但应该有另一种方式。我已经拥有的代码是这样的: $maxWidth) { $lin
我正在尝试使用 imagettftext 创建带有文本的图像。它告诉我警告:imagettftext():C:\xampp\htdocs\recentpost.php 中第 32 行的无效字体文件名。
有没有人有绘制具有指定字母间距的 ttf 字符串(imagettftext)的函数? 我找不到任何内置的 GD 函数,所以我认为应该逐个字母添加一些恒定宽度。 也许有人已经有这样的功能:) 附言。最好
使用 example from php.net我收到警告,图像未正确呈现。我像这样提供 .ttf 文件的完整路径:/var/www/public/myfont.ttf PHP Warning: im
基本上,当我绘制文本时,它最终会像这样变成黑色:http://i.stack.imgur.com/z675F.png而不是我在 PHP 和函数中分配的颜色。代码: $finalImage =
我正在用 php 创建一个图像形式的字体大小、字体系列、字体颜色。在我收到新要求之前,一切都很好。我正在使用 ttf 文件并将特定 ttf 文件的路径作为参数传递到 imagettftext 函数中。
我写信是为了使用 PHP 将文本打印到图像上。但是,函数 imagettftext() 使用基线,而我需要文本垂直居中。 所以,我要么需要一种方法来打印文本,其中 y 不是从顶部到基线的距离,而是从边
我正在尝试使用 imagettftext,但显然它在 GD2 中使用点大小,但我所有的大小都以像素为单位,是否有任何其他我可以使用的函数,或任何将像素转换为点的方法? 最佳答案 如果你 super 懒
我在使用 imagettftext() 渲染文本时遇到了一些问题;不知何故,它只是显示填充的矩形。完全没有错误。 http://postimage.org/image/k61c8xi0n/ PHP 版
使用 imagettftext PHP GD 库中的函数,只能在图像上绘制左对齐的文本。至少看起来是这样,也许我错过了一些东西。 如何控制绘制到图像上的文本的对齐方式?即左/中/右(/合理 - 没有必
我在由 PHP GD 库创建的图像中使用 Verdana 字体。 imagettftext($image, $fontSize, 0, 70, $y, $color, $font, $username
我正在使用 php 创建透明文本 -> png 图像,到目前为止一切顺利。唯一的问题是,由于宽度固定,我希望能够使文本自动换行。或者能够在文本中插入分界线。有没有人有任何exp这样做?这是我的代码..
我几乎可以肯定这是行不通的愚蠢原因,但我就是想不通。我只是想用 imagettftext 打印出一些文本作为图形,但我无法显示这些文字。这是在 GoDaddy 服务器上,所以我不能控制一切,但这里是
我一直在寻找这个问题的答案已经很长时间了..我找到的所有解决方案都是围绕捕获字体名称,但我很确定这不是我的问题。 GD好像安装好了 array(11) { ["GD Version"]=> s
我的问题是,如何给图片中的所有文字加下划线? 代码: function createImage($text) { $text .= "\n"; $text = wordwrap($te
我是一名优秀的程序员,十分优秀!