1

前段时间我做了一个脚本,它接受一些文本并将其作为图像返回,并且工作完美。但我不确定从什么时候开始出现一个奇怪的错误。左边有一个(我向字体极客道歉)“字形”的字母被推到右边,所以字母开始在它上面,但只为主要字母留出空间,呵呵,我认为应该做一个例子。

替代文字
(来源:esbasura.com

预期结果是:( 来源:esbasura.com替代文字

显然,“坏”的脚本是由我的脚本生成的,位于:http: //www.esbasura.com/images/text.php?txt= The%20quick%20brown%20fox%20jumps%20over%20the%20lazy %20dog.&fnt=1&size=23&bg=lightgrey 好的是 dafont 在这里生成的:http: //img.dafont.com/preview.php ?text=The%20quick%20brown%20fox%20jumps%20over%20the% 20lazy%20dog.&ttf=bleeding_cowboys0&ext=1&size=23&psize=m&y=46

我没有在脚本中做任何花哨的事情,这是相关部分:

                imagefilledrectangle($im, 0, 0, $width, $height, $$bg);
                imagettftext($im, $size, 0, (-1*$textsize[6]), (-1*$textsize[7]), $$color, $font, $text);
//              imagefttext($im, $size, 0, (-1*$textsize[6]), (-1*$textsize[7]), $$color, $font, $text); same results using imagefttext
                imagecolortransparent($im, $$bg);
                header("Cache-Control: public"); // HTTP/1.1
                header("Content-type: image/png");
                imagepng($im);
                imagedestroy($im);
    }

我有点惊讶,因为,正如我所说,它曾经完美无瑕地工作。也许我的主人改变了我的机器。

(这是我的 phpinfo:http ://www.work4bandwidth.com/info.php )相关位:

gd
GD Support  enabled
GD Version  bundled (2.0.34 compatible)
FreeType Support    enabled
FreeType Linkage    with freetype
FreeType Version    2.2.1
GIF Read Support    enabled
GIF Create Support  enabled
JPG Support     enabled
PNG Support     enabled
WBMP Support    enabled
XBM Support     enabled

编辑:另请注意,图像大小计算显然是在考虑字体的正确渲染后完成的,我正在使用以下方法进行计算:

                $textsize = imagettfbbox($size, 0, $font, $text);

                $width = ($textsize[2] - $textsize[0]);
                $height = ($textsize[3] - $textsize[5]);
4

3 回答 3

3

不幸的是,在使用 PHP 和 GDLib 生成标题图形时,我还不得不处理一些问题。我的大部分项目都使用 TYPO3 作为 CMS。它可以创建图形标题并为此利用 GDLib。我不得不与质量问题作斗争:在我的本地开发机器(osx)上,字体以极好的质量呈现,在生产服务器(gentoo)上,它是模糊的并且“瘦”。我不知道这些差异是因为平台不同还是因为 PHP/GDLib 版本略有不同。我也遇到了像你这样的问题,尤其是当网络主机升级到更新的 PHP 版本时。昨天的头条看起来不错,更新后,字符错位,变音符号丢失等。

服务器端的替代方案可能是 imagemagick。这个小的 PHP 片段创建了一个示例图像(假设它Bleeding_Cowboys.ttf与脚本在同一个目录中):

<?php
$currentDir = dirname(__FILE__);
$fontPathname = $currentDir . '/Bleeding_Cowboys.ttf';

$cmd = '  convert -background white -fill black -font "' . $fontPathname . '" -pointsize 23 label:"The quick brown fox jumps over the lazy dog" ' . $currentDir . '/headline.png';
exec($cmd);

print '<img src="headline.png" alt="" border="0" />';

图像如下所示:

替代文字

您可能需要使用-pointsize 23参数的另一个值稍微调整字体大小。

我在 Windows 上使用了这个 IM 版本:

ImageMagick 6.5.4-6 2009-07-25 Q16 OpenMP 

在此处阅读有关 imagemagicks 文本处理功能的更多信息:http ://www.imagemagick.org/Usage/text/

虽然 Imagemagick 现在是一个很常见的软件包,但仍有一些主机没有安装 IM。但是您可以下载一个静态编译的 IM 版本,您只需通过 FTP 将其上传到某个目录,使二进制文件可写,然后您就可以使用它来生成图像。我找到了一个关于如何做到这一点的教程,不幸的是只有德语,但我相信你可以从提供的 shell 命令中掌握基本思想:http ://www.website4all.de/support/support-typo3/imagemagick.html


尽管 Imagemagick 是一个可行的选择,但我最终还是使用了客户端javascript 来创建嵌入字体的图形标题。

首先,我偶然发现了sIFR ( http://wiki.novemberborn.net/sifr/ ),它用 flash 对象替换 html 内容以呈现字体。虽然一开始看起来很有希望,但我放弃了它,因为:

  • 如果要替换很多元素,网站会变得非常慢
  • 设置有点麻烦
  • 它依赖闪存,头条新闻在 iPhone 或 iPad 上不起作用

我会为您创建一个示例,但我的笔记本电脑上没有安装 Adob​​e Flash CS。

无论如何,我终于找到了一个很好的客户端javascript库,它做了我想要的:Cufonhttp://cufon.shoqolate.com/generate/)。您将 ttf 文件上传到该服务,然后使用创建的 javascript 文件和 Cufon 基础库,以便用图形标题替换标题元素。Cufon 使用 canvas 元素来执行此操作。在https://github.com/sorccu/cufon/wiki/about上阅读更多关于它是如何完成的

我真正喜欢 Cufon 的地方:

  • 适用于所有主流浏览器,包括 IE 6(及更高版本)
  • 在 iPhone 和 iPad 上运行良好
  • 非常快,即使有很多头条新闻
  • 非常简单的设置

我对 Cufon 唯一真正关心的是:许可。这可能是一个问题,尤其是对于商业字体。并非所有字体创建者都允许这种嵌入。如有疑问,请务必获得书面许可。

但无论如何,使用 Cufon 的简单 HTML 站点可能如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Test</title>
        <script type="text/javascript" src="cufon.js"></script>
        <script type="text/javascript" src="Bleeding_Cowboys_400.font.js"></script>
        <script type="text/javascript">
          Cufon.replace('p', {fontFamily: 'Bleeding Cowboys'});
        </script>
        <style type="text/css">
        p {
            color:#000;
            font-size:23px;
        }
        </style>
    </head>
    <body>
       <p>The quick brown fox jumps over the lazy dog</p>
    </body>
</html>

生成的标题图像如下所示:

替代文字

正如您在 html 站点的源代码中看到的那样,您通过 CSS 定义字体大小(可能也需要调整它)和颜色。然后你打电话Cufon.replace('p', {fontFamily: 'Bleeding Cowboys'});告诉Cufonp用什么字体系列(在这种情况下,)替换什么(在这种情况下是所有元素Bleeding Cowboys)。


我知道,这些不是您问题的直接答案,但是客户端标题的创建给了我非常好的结果,与我尝试的所有服务器端解决方案相比,设置和代码更容易。如果我是你,我会尝试 sIFR 或 Cufon,尽管 IM 可能值得事先尝试,特别是如果你受限于服务器端解决方案。

于 2010-05-29T09:44:29.150 回答
1

可能 GD 库已更改,这就是您的问题的根源。它也可能是字体文件,但这不太可能。

你知道它是多久以前工作的吗?

是在 PHP 4.3 之前吗?那是 GD 库被捆绑到 PHP 中的时候。

如果在 4.3 之前,请尝试不同版本的独立 GD 库。见http://www.libgd.org

如果它在 PHP 4.3 之后工作,那么只需尝试不同版本的 PHP 来查找它停止工作的位置。

解决方案:检查 GD 库版本并构建使用旧 GD 库(独立或捆绑)的 php 版本。

您也可以与您的 ISP 讨论,他们可能会记录他们何时将 PHP 更新到各种不同的版本。

最终,您会确切地找到哪个版本的 GD 库破坏了您的软件。然后,您需要提交一份错误报告,希望它会得到修复。

或者您可以创建一个仅使用旧版本 php 的小型服务器来提供您动态创建的 png。

于 2010-05-25T23:24:17.887 回答
1

imagettfbbox()有问题,可能是您的问题的原因,请尝试使用http://ruquay.com/sandbox/imagettf/imagettfbbox_t()提供的功能,也许可以解决问题。

另外,你确定完全相同的ttf字体吗?因为你的版本似乎比原来的要大胆一些。

于 2010-05-26T21:01:18.983 回答