GD2, TTF ve PHP ile mektup yerleştirme hatası

3 Cevap php

Bir süre önce bazı metin alır ve bir resim olarak döndüren bir komut yapılmış ve sorunsuz çalıştı. Ama garip bir hata olur başladığı beri emin değilim. Bir (yazı meraklılarının özürlerimi) sahip harfler harfi üzerinde başlar, ama sadece ana harf için boşluk bırakır böylece sağa itti olsun soldaki "motifler", hehe, ben bir örnek bunu yapması gerektiğini düşünüyorum.

alt text

The expected result is: alt text

The "bad" one was generated, obviously, by my script, located here: http://www.esbasura.com/images/text.php?txt=The%20quick%20brown%20fox%20jumps%20over%20the%20lazy%20dog.&fnt=1&size=23&bg=lightgrey And the good one was generated by dafont here: 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

Ben komut süslü bir şey yapmıyorum, burada ilgili kısmı:

                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);
    }

Dediğim gibi, kusursuz çalışması için kullanılır, çünkü ben tür, şaşırdım. Belki benim ev sahibi benim makine değişti.

(here's my phpinfo: http://www.work4bandwidth.com/info.php) Relevant bit:

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: Also note that the image size calculation apparently is done taking in consideration the correct rendering of the font, I'm calculating it using:

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

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

3 Cevap

Ne yazık ki ben de PHP kullanırken sorunları ile uğraşmak zorunda kaldı & Başlık grafikleri oluşturmak için GDlib. Benim projelerin çoğu için CMS olarak typo3 kullanın. Bu grafik başlıklarını oluşturmak ve bunun için GDlib güçlendirir edebilirsiniz. Ben kalite sorunları ile mücadele etmek zorunda: benim yerel dev makinede (osx), yazı (gentoo), bulanık oldu üretim sunucusunda, üstün kalitede kılınmış ve "ince". Ben bu farklılıklar nedeniyle farklı platformlarda veya PHP / GDlib versiyonları slightly farklı çünkü vardı bilmiyorum. Ben de web barındırma yeni PHP sürümüne yükseltildi, özellikle sizinki gibi bir sorunla karşılaşmadım. Güncellemeden sonra, karakter yanlış edildi Dün başlıkları, iyi baktı, umlaut vb eksik

A serverside alternative imagemagick olabilir. Bu küçük PHP pasajı (Bleeding_Cowboys.ttf komut aynı Dir olduğunu varsayarak) örnek bir resim oluşturur:

<?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" />';

Görüntü bu gibi görünüyor:

alt text

Sen probaly -pointsize 23 argüman için başka bir değeri kullanarak yazı tipi boyutunu biraz ayarlamak gerekiyor.

Ben windows bu IM sürümü kullanılmış:

ImageMagick 6.5.4-6 2009-07-25 Q16 OpenMP 

Burada imagemagicks metin işleme yetenekleri hakkında daha fazla bilgi: http://www.imagemagick.org/Usage/text/

Imagemagick artık oldukça yaygın bir paket olmasına rağmen, IM yüklü olması hosts hala vardır. Ama sen sadece bazı dizine FTP üzerinden upload ikili yazılabilir yapmak ve sonra da görüntü oluşturmak için kullanabileceğiniz bir statik derlenmiş sohbet sürümünü indirebilirsiniz. Ben ne yazık ki sadece Almanca, bunu yapmak için nasıl bir öğretici buldum, ama kabuk komutları sağlanan gelen temel fikir kavrayabilir eminim: http://www.website4all.de/support/support-typo3/imagemagick.html


Imagemagick uygun bir seçenek olsa da, nihayet gömülü yazı ile grafik başlıkları oluşturmak için client side javascript kullanılmaktadır.

Birincisi, ben yazı işlemek amacıyla flash nesneleri html içeriğini değiştirir (http://wiki.novemberborn.net/sifr/) ki sIFR tökezledi. Ilk başta umut verici görünüyordu, ancak ben onu terk çünkü:

  • değiştirmek için birçok unsurları varsa web sitesi gerçekten yavaş olur
  • Kur bir güçlük biraz
  • Bu flaş relys, başlıkları alışkanlık iPhone veya iPad üzerinde çalışmak

Senin için bir örnek oluşturdu olurdu, ama ben Adobe Flash CS benim laptop üzerinde yüklü olması gerekmektedir.

Neyse, sonunda ne istediğini yaptım, iyi bir istemci tarafı javascript lib bulundu: Cufon (http://cufon.shoqolate.com/generate/). Sen bu hizmet için ttf dosya yüklemek ve daha sonra grafik başlıkları ile başlık elemanlarını değiştirmek için Cufon temel kütüphane ile birlikte oluşturulan javascript dosyasını kullanın. Cufon Bunu yapmak için, tuval elemanı kullanır. Onun http://wiki.github.com/sorccu/cufon/about üzerinde nasıl yapılır hakkında daha fazla okuyun

Gerçekten Cufon hakkında ne gibi:

  • (ve üzeri) tüm büyük IE 6 gibi tarayıcılarda çalışır
  • iPhone ve iPad'de harika çalışıyor
  • very, hızlı, hatta birçok başlıkları ile
  • çok kolay kurulum

Cufon hakkında Ben tek gerçek endişe: lisans. Bu özellikle ticari yazı ile ilgili bir sorun olabilir. Tüm yazı yaratıcıları gömme bu tür izin. Şüpheniz varsa, her zaman yazılı izin almak.

Ama yine de, cufon kullanarak basit bir HTML sitesi bu gibi görünebilir:

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

Oluşan başlık görüntü bu gibi görünüyor:

alt text

Eğer html sitenin kaynak kodunda da görebileceğiniz gibi, CSS yoluyla (muhtemelen çok, bu ayarlamanız gerekir) yazı tipi boyutunu tanımlamak ve renk. Ve sonra yerine cufon anlatmak için Cufon.replace('p', {fontFamily: 'Bleeding Cowboys'}); dediğimiz (bu durumda tüm p elemanları) ne yazı tipi ailesi ile (bu durumda, Bleeding Cowboys) .


Ben bu sorunuza doğrudan cevaplar, biliyorum, ama istemci tarafında başlık oluşturma Ben denedim tüm serverside çözümleri ile daha sonra bana yol daha kolay kurulumu ve kod ile çok iyi sonuçlar verdi. Ben olsaydım IM bir serverside çözüm sınırlıdır, özellikle önceden bir cami olabilir, ancak ben, Sifr veya cufon bir atış verecek ya.

Muhtemelen GD kütüphanesi değişti ve bu sorunların kaynağıdır. Ayrıca yazı tipi dosyası olabilir, ama daha az olasıdır.

Eğer bu çalışma ne kadar uzun zaman önce biliyor musun?

PHP 4.3 önce oldu? GD Kütüphanesi PHP bindirildiğini zaman buydu.

If before 4.3, try different versions of the standalone GD library. See http://www.libgd.org

PHP 4.3 sonra çalıştı, o sadece çalışma durduğu bulmak için PHP farklı sürümlerini deneyin.

Çözüm: GD kütüphanesi bültenlerini kontrol ve eski bir GD kütüphanesi (bağımsız ya da birlikte ya) kullanan php bir sürümünü kurmak.

Ayrıca onlar farklı farklı sürümleri için PHP güncellenen zaman bir kayıt olabilir, ISS ile görüşmek olabilir.

Sonuçta, sen GD kütüphanesinin sürümünü yazılım kırdı tam olarak hangi bulacaksınız. Daha sonra bir hata raporu göndermek ve umarım o sabit olacak gerekir.

Yoksa sadece dinamik olarak oluşturulan png bulunuyor kadar hizmet php eski sürümünü kullanan küçük bir sunucu oluşturabilirsiniz.

imagettfbbox() arabası ve bu sorunun may be nedeni, http://ruquay.com/sandbox/imagettf/ mevcut imagettfbbox_t() işlevini kullanmayı deneyin, belki de o çözecek .

Ayrıca, emin aynı ttf font vardır? Lütfen sürüm orijinalinden daha küçük bir bolder görünüyor çünkü.