Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Schriften bändigen (https://www.delphipraxis.net/95732-%5Bphp%5D-schriften-baendigen.html)

Nuclear-Ping 12. Jul 2007 09:07


[PHP] Schriften bändigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

für ein Projekt erstelle ich per PHP eine "Key Map", sprich ein Bild mit Kästchen wo Buchstaben drin sind. Später wird noch auf das Bild eine Map gelegt, damit man die Buchstaben anklicken kann.

Soweit kein Problem. Was mir seit 'ner Weile daran jetzt aber schon Kopfschmerzen bereitet ist die Positionierung der Buchstaben in den Kästchen. Das klappt eigentlich ganz gut, nur manche Zeichen sind (viel) zu weit links, zu weit unten, zu weit oben, ... Und da komme ich auf keinen grünen Zweig. Muss auch dazu sagen, dass ich kein Mathetyp bin.

So sieht das Projekt bisher aus: http://www.nulife.de/letterview/lview.php

Es gibt Zeichen, die werden perfekt in den Kästchen positioniert und andere wiederrum hängen sonstwo.

Wenn man z.B. aus den Schriften oben "Devnew.ttf" wählt, sieht das ganz OK aus bis z.B. auf die Zeichen 85, 87, 91, 123, 166, etc.
Andere Schriften haben wieder andere schwarze Schafe.

Wie kriegt man es hin, dass die Zeichen mehr oder weniger alle einheitlich in den Kästchen sind? Scheinbar kann man hier nicht mit X = (KästchenBreite / 2) - (BuchstabenBreite / 2) bzw Y = (KästchenHöhe / 2) - (BuchstabenHöhe / 2) arbeiten. Zumindest hab ich das auch versucht, war aber auch kein Pauschalrezept. Kann auch sein, dass ich totale Tomaten auf den Augen hab ...

Im Anhang mal die Scripte. "imagemap.php" ist der Kandidat. Falls er wegen Fonts meckert, kopiert euch einfach tahoma.ttf, arial.ttf und noch ein paar aus dem Windows-Fonts-Ordner nach ./fonts/.

Wäre schön, wenn da mal jemand drüber schauen und mir ein paar Hilfsstützen geben könnte.

Danke und Grüße,

Mario

Nuclear-Ping 13. Jul 2007 14:09

Re: [PHP] Schriften bändigen
 
Ok, gelöst.

http://forum.de.selfhtml.org/archiv/2006/9/t136870/

Code:
                 $Char = chr ($a);
      $Box = ImageTTFBBox ($Size, 0, $FontPath . $Font, $Char);

      $yvar1 = $Box[5] > $Box[7] ? $Box[5] : $Box[7];
      $yvar2 = $Box[1] < $Box[3] ? $Box[1] : $Box[3];

      // Höhe und Breite des Schriftzeichens berechnen
      $szheight = abs($yvar1 - $yvar2);
      $szwidth = abs($Box[4] - $Box[0]);

                 $pos_x = round ($tmp_x + ($szwidth / 2) - $Box[6], 0);
                 $pos_y = round ($tmp_y - ($szheight / 2) - $Box[5], 0) - round ($szheight / 2);

Reinhard Kern 13. Jul 2007 18:34

Re: [PHP] Schriften bändigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Nuclear-Ping
Ok, gelöst.

http://forum.de.selfhtml.org/archiv/2006/9/t136870/

Code:
                 $Char = chr ($a);
      $Box = ImageTTFBBox ($Size, 0, $FontPath . $Font, $Char);

      $yvar1 = $Box[5] > $Box[7] ? $Box[5] : $Box[7];
      $yvar2 = $Box[1] < $Box[3] ? $Box[1] : $Box[3];

      // Höhe und Breite des Schriftzeichens berechnen
      $szheight = abs($yvar1 - $yvar2);
      $szwidth = abs($Box[4] - $Box[0]);

                 $pos_x = round ($tmp_x + ($szwidth / 2) - $Box[6], 0);
                 $pos_y = round ($tmp_y - ($szheight / 2) - $Box[5], 0) - round ($szheight / 2);

Hallo,

es ist garnicht nötig, das selbst auszurechnen: die Win32-Funktion SetTextAlign weist Windows an, den Text bzw. Buchstaben mittig zur angegebenen Position zu setzen, wenn für den horizontalen Modus TA_CENTER gewählt wird. So ist die beigefügte Font-Tabelle gedruckt: H = TA_CENTER, V = TA_BASE.

Gruss Reinhard

DeddyH 13. Jul 2007 18:39

Re: [PHP] Schriften bändigen
 
Und wie willst Du das mit PHP auf einem Linux-Server umsetzen?

Nuclear-Ping 13. Jul 2007 19:08

Re: [PHP] Schriften bändigen
 
Die Positionierung in den Buttons funktioniert jetzt recht gut (siehe Link im ersten Beitrag).

Allerdings folgt auch gleich das zweite Problem: Wenn man auf die Buttons klickt, werden oben in der Vorschau die Buttons dargestellt. Mit 'ner Formel, die die Zeichen einfach mittig zentriert funktioniert das generell gut. Allerdings werden Buchstaben wie p, q, b, d halt anders dargestellt als a, c, e, o, ...

Jemand eine Idee, wie man das berechnen kann? Werde aus den Ergebnissen von ImageTTFBBox nicht schlau ... :wall:

Code:
<?
   // *****************************
   // File: charimage.php
   // Erstellt ein Bild eines Schriftzeichens mit den
   // Parametern aus der Übergabe
   // Aufruf: ./charimage.php?font=tahoma.ttf&char=112&height=34
   // *****************************

   require ("config.php");
   require ("functions.php");

   // [url]http://de3.php.net/manual/en/function.imagettfbbox.php#76333[/url]
   function better_imagettfbbox($size, $angle, $font, $text) {
        $dummy = imagecreate(1, 1);
        $black = imagecolorallocate($dummy, 0, 0, 0);
        $bbox = imagettftext($dummy, $size, $angle, 0, 0, $black, $font, $text);
        imagedestroy($dummy);
        return $bbox;
   }

   $Char = chr ($_REQUEST["char"]);
   $Font = $_REQUEST["font"];
   $FontHeight = $_REQUEST["height"];
   $Size = 20;

   $Box = better_imagettfbbox ($Size, 0, $FontPath . $Font, $Char);

   $yvar1 = $Box[5] > $Box[7] ? $Box[5] : $Box[7];
   $yvar2 = $Box[1] < $Box[3] ? $Box[1] : $Box[3];

   // Höhe und Breite des Schriftzeichens berechnen
   $szheight = abs($yvar1 - $yvar2);
   $szwidth = abs($Box[4] - $Box[0]);
   $FontWidth = $szwidth;
//   $FontHeight = $szheight;

//         echo "<pre>"; print_r ($Box); echo "</pre>";

   $im = ImageCreate ($FontWidth, $FontHeight);
   $back_color = ImageColorAllocate ($im, $ShadowColor[0], $ShadowColor[1], $ShadowColor[2]);
//   $back_color = ImageColorAllocate ($im, $BackColor[0], $BackColor[1], $BackColor[2]);
   $text_color = ImageColorAllocate ($im, $TextColor[0], $TextColor[1], $TextColor[2]);

   // Versuch, einen Offset zu bestimmen
   $belowBasepoint = max (0, abs ($Box[1]));
//   echo (int)$belowBasepoint;
   if ($belowBasepoint != 0) {
      $YOffset = -$Box[1];
      $XOffset = -$Box[0];
   } else {
      $YOffset = -$Box[1] - ($FontHeight - $szheight);
      $XOffset = -$Box[0];
          }

   ImageTTFText ($im, $Size, 0, $XOffset, $FontHeight + $YOffset, $text_color, $FontPath . $Font, $Char);

   Header("Content-type: image/png");
   ImagePNG ($im);
   ImageDestroy ($im);
?>


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz