Ошибка размещения букв в GD2, TTF и PHP - PullRequest
1 голос
/ 23 апреля 2010

Некоторое время назад я создал скрипт, который берет некоторый текст и возвращает его как изображение, и работал безупречно. Но я не уверен с тех пор, когда странная ошибка начала происходить. Буквы, которые имеют (мои извинения фанатам шрифта) «глиф» слева, сдвигаются вправо, поэтому буква начинается на них, но остается место только для основной буквы, хе-хе, я думаю, что пример должен это делать.

альтернативный текст http://www.esbasura.com/images/bad.png

Ожидаемый результат: альтернативный текст http://www.esbasura.com/images/good.png

«Плохой» был сгенерирован, очевидно, моим скриптом, расположенным здесь: 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

EDIT: Также обратите внимание, что вычисление размера изображения, очевидно, выполняется с учетом правильной визуализации шрифта, я рассчитываю его с помощью:

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

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

Ответы [ 3 ]

3 голосов
/ 29 мая 2010

К сожалению, мне также приходилось сталкиваться с проблемами при использовании PHP & GDLib для генерации заголовочной графики.Я использую TYPO3 в качестве CMS для большинства своих проектов.Он может создавать графические заголовки и использовать для этого GDLib.Мне пришлось бороться с проблемами качества: на моей локальной машине разработки (osx) шрифт был отрисован в превосходном качестве, на производственном сервере (gentoo) он был размытым и «худым».Я не знаю, были ли эти различия из-за разных платформ или потому что версии PHP / GDLib были немного разные.Я также столкнулся с такими же проблемами, как ваша, особенно когда веб-хостинг был обновлен до более новой версии PHP.Вчера заголовки выглядели хорошо, после обновления символы были не на месте, умлауты отсутствовали и т. Д.

A серверная альтернатива может быть 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" />';

Изображение выглядит так:

альтернативный текстhttp://i45.tinypic.com/nckym0.png

Вы, вероятно, должны немного отрегулировать размер шрифта, используя другое значение для аргумента -pointsize 23.

Я использовал эту версию IM для Windows:

ImageMagick 6.5.4-6 2009-07-25 Q16 OpenMP 

Чтениеподробнее о возможностях обработки текста в imagemagicks здесь: http://www.imagemagick.org/Usage/text/

Хотя Imagemagick является довольно распространенным пакетом в настоящее время, все еще существуют хосты, на которых IM не установлен.Но вы можете скачать статически скомпилированную версию IM, которую вы просто загружаете через FTP в некоторый каталог, делать двоичные файлы доступными для записи, а затем вы можете использовать ее для генерации ваших изображений.Я нашел учебник о том, как это сделать, к сожалению, только на немецком языке, но я уверен, что вы можете понять основную идею из предоставленных команд оболочки: http://www.website4all.de/support/support-typo3/imagemagick.html

Хотя Imagemagick является жизнеспособным вариантом, я наконец-то использовал клиентскую сторону javascript для создания графических заголовков со встроенными шрифтами.

Сначала я наткнулся на sIFR (http://wiki.novemberborn.net/sifr/), который заменяет html-контент на flash-объекты для отображения шрифта.Хотя поначалу это выглядело многообещающе, я бросил его, потому что:

  • веб-сайт работает очень медленно, если у вас есть много элементов для замены
  • , установка немного хлопотна
  • это зависит от вспышки, заголовки не будут работать на iPhone или iPad

Я бы создал образец для вас, но у меня не установлен Adobe Flash CS на моем ноутбуке.

В любом случае, я наконец-то нашел хороший клиентский javascript lib, который делал то, что хотел: Cufon (http://cufon.shoqolate.com/generate/).Вы загружаете свой файл ttf в этот сервис, а затем используете созданный файл javascript вместе с базовой библиотекой Cufon, чтобы заменить элементы заголовка графическими заголовками.Cufon использует элемент canvas для этого.Узнайте больше о том, как это делается на http://wiki.github.com/sorccu/cufon/about

Что мне действительно нравится в Cufon:

  • работает во всех основных браузерах, включая IE 6 (и выше)
  • отлично работает на iPhone и iPad
  • очень быстро, даже со многими заголовками
  • очень простая настройка

Единственная реальная проблема, которая у меня естьо куфоне: лицензирование.Это может быть проблемой, особенно с коммерческими шрифтами.Не все создатели шрифтов допускают такой тип встраивания.В случае сомнений всегда получайте письменное разрешение.

Но в любом случае простой HTML-сайт с использованием Cufon может выглядеть следующим образом:

<!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>

Полученное изображение заголовка выглядит следующим образом:

alt text http://i45.tinypic.com/pon5g.png

Как вы можете видеть в исходном коде html-сайта, вы определяете размер шрифта (вероятно, тоже нужно настроить) и цвет с помощью CSS.И затем вы звоните Cufon.replace('p', {fontFamily: 'Bleeding Cowboys'});, чтобы сказать Cufon, что заменить (в данном случае все p элементы) на какое семейство шрифтов (в данном случае Bleeding Cowboys).

Я знаю, что это не прямые ответы на ваш вопрос, но создание заголовка на стороне клиента дало мне очень хорошие результаты с более простой настройкой и кодом, чем со всеми серверными решениями, которые я пробовал. Если бы я был на вашем месте, я бы либо попробовал sIFR или Cufon, хотя IM может стоить попробовать заранее, особенно если вы ограничены серверным решением.

1 голос
/ 27 мая 2010

imagettfbbox() содержит ошибку, и может быть причиной вашей проблемы, попробуйте использовать функцию imagettfbbox_t(), доступную в http://ruquay.com/sandbox/imagettf/,, возможно, она решит ее.* Кроме того, вы уверены, что точно такой же шрифт TTF?Потому что ваша версия выглядит немного смелее , чем оригинал.

1 голос
/ 26 мая 2010

Возможно, библиотека GD изменилась, и это источник ваших проблем. Это также может быть файл шрифта, но это менее вероятно.

Вы знаете, как давно это работало?

Было ли это до PHP 4.3? Именно тогда библиотека GD была встроена в PHP.

Если до 4.3, попробуйте разные версии автономной библиотеки GD. Смотри http://www.libgd.org

Если он работал после Php 4.3, просто попробуйте другие версии PHP, чтобы найти, где он перестал работать.

Решение: проверьте выпуски библиотеки GD и создайте версию php, которая использует более старую библиотеку GD (автономную или в комплекте).

Вы также можете обсудить с вашим провайдером, у них может быть запись, когда они обновляли PHP до различных версий.

В конечном счете, вы точно найдете, какая версия библиотеки GD сломала ваше программное обеспечение. Затем вам нужно будет отправить сообщение об ошибке, и, надеюсь, оно будет исправлено.

Или вы можете создать небольшой сервер, который просто использует старую версию php для обслуживания ваших динамически создаваемых png.

...