AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[PHP] Schriften bändigen

Ein Thema von Nuclear-Ping · begonnen am 12. Jul 2007 · letzter Beitrag vom 13. Jul 2007
Antwort Antwort
Nuclear-Ping
(Gast)

n/a Beiträge
 
#1

[PHP] Schriften bändigen

  Alt 12. Jul 2007, 09:07
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
Angehängte Dateien
Dateityp: zip bildertastatur_808.zip (4,7 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#2

Re: [PHP] Schriften bändigen

  Alt 13. Jul 2007, 14:09
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);
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#3

Re: [PHP] Schriften bändigen

  Alt 13. Jul 2007, 18:34
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
Angehängte Dateien
Dateityp: pdf ttman_print_test_194.pdf (59,7 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: [PHP] Schriften bändigen

  Alt 13. Jul 2007, 18:39
Und wie willst Du das mit PHP auf einem Linux-Server umsetzen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#5

Re: [PHP] Schriften bändigen

  Alt 13. Jul 2007, 19:08
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 ...

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);
?>
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:35 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