Sven: (GDLib) ImageTTFText() hat Probleme mit Win-"OpenType"-fonts

Hallo,

ich habe ein mehr oder weniger komplexes Bildbearbeitungstool für PHP, dass u.a. die GD-Library nutzt, geschrieben. Abgesehen davon, dass es seinen Job ganz gut macht, dank dem datenbankgestütztem Speicherungssystem auch eine ganze Menge Systemressourcen eingespart werden, ist es zwar noch durchaus Erweiterungsbedürftig, aber eine Sache stört mich ganz erheblich.

Eine Aufgabe dieses Tools ist das sogenannten "Text to Font". Hierbei gibt das Programm einfach ein mittels Paramtern definierten Text in einer genauso definierten schrift/Schriftgröße/... aus. Dies eignet sich z.B. hervorragend, wenn man mal schnell ein Symbol aus der Wingdings haben will.

Doch genau hier streikt es plötzlich: Es gibt nur eine Box aus, die der Farbe dieses Schriftzugs entspricht. Dies macht er bei einer ganzen Reihe von Schriften, z.B. auch Arial. Aufgefallen ist mir, dass alle diese Schriften durchgehend "OpenType"-Schriften sind. Ich habe nur ehrlich gesagt keine Ahnung, was diese Bezeichnung heißen soll. Andererseits funktioniert es mit Verdana wiederum ausgezeichnet, was von Win ja auch als eine solche "OpenType"-Schrift angepriesen wird.

Wenn ich mehrere Zeichen nehme, funktioniert es wieder mit allen Schriften einwandfrei. Fast. Denn jetzt auf einmal spielt Wingdings und Webdings verrückt, vieles andere funktioniert einwandfrei (vieles = etwa 10 andere Schriften, mit denen ich es einfach mal getestet habe).

bei den zwei genannten Schriften werden nämlich nur die altbekannten "Rechtecke" ausgegeben, also die Zeichen, die immer dann ausgegeben werden, wenn man in einer Schriftart versucht, ein Zeichen auszugeben, dass nicht gespeichert ist (also z.B. das Euro-Zeichen bei irgendeiner "schlechten" Kunst-Schrift, bei der nur kleinbuchstaben und GROßBUCHSTABEN definiert sind).

Ich glaube, das ganze hängt mit diesen OpenType-Schriften zusammen, sie scheinen nicht ein normaler TTF-Standart zu sein oder sowas.

Oder hat sonst noch jemand eine Idee, woran es liegen kann?

Falls es was bringen sollte, hier habe ich nocheinmal eine abgespeckte Version der Datei, die für das Erstellen des Schriftzugs verantwortlich ist, abgedruckt:

<?php
/*
    GD - Text in Font
    GD using Font-Creating File

Aufruf durch include. Aufruf Funktion
    give_text(). Parameter:
       - $text     - Text (string)
       - $font     - Schrift(location) (string: entweder schrift ohne endung oder schrift
                     mit endung oder schrift mit Verzeichnis oder Name einer schrift)
       - $fontsize - Größe (interger)
       - $abstand  - padding zum Außenabstand (interger)
       - $color    - Textfarbe        } Als RGB in entsprechendem Array([0],[1],[2]) oder
       - $bgcolor  - Hintergrundfarbe } als hex in string (ohne #)
       - $trans    - wenn true, dann ist bgcolor transparent
*/

function give_text($text, $font, $fontsize, $abstand, $color='000', $bgcolor='FFF', $trans=false)
  {
      $font             = font_check($font);
      $size             = imagettfbbox($fontsize, 0, $font, $text);
      $breite           = $size[2];
      $hoehe            = ($size[5]*-1);
      $im               = @ImageCreate ($breite+($abstand*2), ($hoehe+($abstand*2)))
                          or die("Kann keinen neuen GD-Bild-Stream erzeugen");
      $color            = rgb($color);
      $bgcolor          = rgb($bgcolor);
      $text_color       = ImageColorAllocate ($im, $color[0], $color[1], $color[2]);
      $background_color = ImageColorAllocate ($im, $bgcolor[0], $bgcolor[1], $bgcolor[2]);
      if($trans)
          $background_color = imagecolortransparent($im, $background_color);
      ImageFill($im, 10, 10, $background_color);
      ImageTTFText($im, $fontsize, 0, $abstand, $hoehe+$abstand, $text_color, $font, $text);
      return $im; // returns gd image
  }

function rgb($a)
  {
      $r = array();
      $r[0] = hexdec(substr($a,0,2));
      $r[1] = hexdec(substr($a,2,2));
      $r[2] = hexdec(substr($a,4,2));
      return $r;
  }

function font_check($font)
  {
      $fontlocation = 'C:\WINNT\Fonts\';
      $try_font2file = font_filename($font);
      if($try_font2file)
          $font = $fontlocation.$try_font2file;
      else
      {
          if(strpos($font, '.ttf') === false)
              $font .= '.ttf';
          if(strpos($font, '\') === false)
              $font = $fontlocation.$font;
        if(!file_exists($font))
              $font = $fontlocation.'arial.ttf';
      }
      return $font;
  }

function font_filename($fontname)
  {
      $fonts = array(
          'Verdana'     => 'VERDANA.ttf',
          'Georgia'     => 'georgia.ttf',
          'Arial'       => 'arial.ttf',
          'Times'       => 'times.ttf',
          'wingdings'   => 'wingding.ttf',
          'wingding2'   => 'wingdng2.ttf',
          'wingding3'   => 'WINGDNG3.ttf',
          'webding'     => 'webdings.ttf',
          'wedgie'      => 'WEDGIE__.TTF',
          'gdLogoFont'  => 'unsteady.TTF',
          'sweenage'    => 'SWEENAGE_2.TTF'
          // ....
      );
      foreach($fonts as $name => $realname)
      {
          if(strtolower($name) == strtolower($fontname))
              return $realname;
      }
      return false;
  }

?>

oder ist irgendwas "falsch"?

Danke schon mal für Antworten,

Gruß,

Sven

--
!:        I'm back!
Selfcode: ie:% fl:| br:^ va:{ ls:& fo:) rl:( n4:( ss:) de:> js:| ch:° mo:} zu:}
Encode:   http://forum.de.selfhtml.org/cgi-bin/selfcode.pl
Decode:   http://peter.in-berlin.de/projekte/selfcode/
E-Mail:   coming soon
me:       'd comed long ago