| Suchen | |
|
#1
|
|||
|
|||
|
Hallo Leute,
ich bin grad am Verzweifeln. Ich habe ein Button-script, welches einen Text auf ein Hintergrundbild schreibt. Nun habe ich ein grundlegendes Problem mit der Funktion DOKU-VORLESE-SERVICE(TM) array imagettftext(int im, int size, int angle, int x, int y, int col, string fontfile, string text) Erzeugt TTF-Text im Bild Die y-Koordinate definiert nun die Grundlinie des Textes. Hat der Text nun überhängende Zeichen (z.B. ein g), wird er angeschnitten. Ich berechne die y-koordinate, indem ich die mitte des Textes in die mitte des Bildes setze. (Bildhöhe/2)+(Texthöhe/2) Irgendwo habe ich einen Denkfehler glaube ich. So sieht es aus: ![]() Und hier das Script: PHP Quellcode:
<?php
if(!function_exists("imagettfbbox_bugfixed")){ function imagettfbbox_bugfixed($size, $angle, $fontfile, $text){ /** * Diese Funktion ist ein Workaround für das Fehlverhalten von ImageTTFBBox() bei gedrehten Texten. Der Fehler tritt mindestens bei * den PHP-Versionen 4.3.0 bis einschließlich 4.3.6 auf. * Der Workaround besteht darin, zunächst die Bounding Box für nicht gedrehten Text von der eingebauten Funktion zu erhalten und * das Ergebnis anschließend mit trigonometrischen Funktionen zu drehen. * Zusätzlich zur Standardfunktion werden die folgenden Werte im zurückgelieferten Array ergänzt: * 8: Größe des Textblocks in x-Richtung (Projektion auf die X-Achse) * 9: Größe des Textblocks in y-Richtung (Projektion auf die Y-Achse) * 10: Max. Ausdehnung des Textblocks in x-Ebene (Maximaler Abstand zwischen Punkten mit gleicher y-Koordinate) * 11: Max. Ausdehnung des Textblocks in y-Ebene (Maximaler Abstand zwischen Punkten mit gleicher x-Koordinate) * 12: kleinste X-koordinate * 13: kleinste Y-koordinate * 14: größte X-koordinate * 15: größte Y-koordinate */ $BBox_fixed = array(); /* Zunächst die eingebaute Funktion für den nicht gedrehten Text aufrufen: */ $BBox = imagettfbbox($size, 0, $fontfile, $text); /* Sinus- und Cosinus bestimmen: */ $cos_angle = cos(deg2rad($angle)); $sin_angle = sin(deg2rad($angle)); /* Berechnung der maximalen Ausdehnung in x- und y-Ebene: */ $BBox_fixed[10] = ceil(($sin_angle == 0)? (NULL):(abs($BBox[1] - $BBox[7]) / $sin_angle)); $BBox_fixed[11] = ceil(($cos_angle == 0)? (NULL):(abs($BBox[1] - $BBox[7]) / $cos_angle)); /* Trigonometrische Umrechnung durchführen: */ for($i = 0; $i < 7; $i += 2) { $BBox_fixed[$i] = round($BBox[$i] * $cos_angle + $BBox[$i+1] * $sin_angle); $BBox_fixed[$i+1] = round($BBox[$i+1] * $cos_angle - $BBox[$i] * $sin_angle); } /* Berechnung der Projektionsgröße in x- und y-Richtung: */ $BBox_xmin = min($BBox_fixed[0], $BBox_fixed[2], $BBox_fixed[4], $BBox_fixed[6]); $BBox_xmax = max($BBox_fixed[0], $BBox_fixed[2], $BBox_fixed[4], $BBox_fixed[6]); $BBox_ymin = min($BBox_fixed[1], $BBox_fixed[3], $BBox_fixed[5], $BBox_fixed[7]); $BBox_ymax = max($BBox_fixed[1], $BBox_fixed[3], $BBox_fixed[5], $BBox_fixed[7]); $BBox_fixed[8] = $BBox_xmax - $BBox_xmin; $BBox_fixed[9] = $BBox_ymax - $BBox_ymin; $BBox_fixed[12]=$BBox_xmin; $BBox_fixed[13]=$BBox_ymin; $BBox_fixed[14]=$BBox_xmax; $BBox_fixed[15]=$BBox_ymax; ksort($BBox_fixed); return $BBox_fixed; } function hexrgb($hexstr, $rgb) { if(substr($hexstr,0,1)=="#"){ $hexstr=substr($hexstr,1); } $int = hexdec($hexstr); switch($rgb) { case "r": return 0xFF & $int >> 0x10; break; case "g": return 0xFF & ($int >> 0x8); break; case "b": return 0xFF & $int; break; default: $array= array( "r" => 0xFF & $int >> 0x10, "g" => 0xFF & ($int >> 0x8), "b" => 0xFF & $int ); $output=""; foreach($array as $key => $value){ $output.= intval($value).","; } return(substr($output,0,strlen($output)-1)); break; } } } function checktexthight($groesse,$winkel,$fontfile,$textConverted,$yoffset){ $sizeText=imagettfbbox_bugfixed ($groesse,$winkel,$fontfile,$textConverted); return $sizeText[9]+($yoffset*2); } function checktextwidth($groesse,$winkel,$fontfile,$textConverted,$xoffset){ $sizeText=imagettfbbox_bugfixed ($groesse,$winkel,$fontfile,$textConverted); return $sizeText[8]+($xoffset*2); } $bildstring = empty($_GET['bildstring']) ? "Bitte String angeben" : $_GET['bildstring']; $groesse = empty($_GET['groesse']) ? 16 : $_GET['groesse']; $winkel = empty($_GET['winkel']) ? 0 : $_GET['winkel']; $xoffset = empty($_GET['xoffset']) ? 10 : $_GET['xoffset']; $yoffset = empty($_GET['yoffset']) ? $groesse+5 : $_GET['yoffset']; $hgfarbe_get = empty($_GET['hgfarbe']) ? 'ffffff' : $_GET['hgfarbe']; $schriftfarbe_get = empty($_GET['schriftfarbe']) ? '000000' : $_GET['schriftfarbe']; $schattenfarbe_get = empty($_GET['schattenfarbe']) ? 'cccccc' : $_GET['schattenfarbe']; $schatten = empty($_GET['schatten']) ? 0:$_GET['schatten']; $hgimage = empty($_GET['hgimage']) ? 0 : $_GET['hgimage']; $fontfile="fonts/euromode.ttf"; $textConverted=urldecode($bildstring); $sizeText=imagettfbbox_bugfixed ($groesse,$winkel,$fontfile,$textConverted); $breite=checktextwidth($groesse,$winkel,$fontfile,$textConverted,$xoffset); $hoehe=checktexthight($groesse,$winkel,$fontfile,$textConverted,$yoffset); header("Content-type: image/jpeg"); if($hgimage!==0){ $hgimage_size=getimagesize($hgimage); $hgbreite=$hgimage_size[0]; $hghoehe=$hgimage_size[1]; //falls text größer als Hintergrundbild if($hghoehe<$hoehe){ //fontsize verringern (Nicht kleiner als 5) for ($fontsize=$groesse; $fontsize>=5;$fontsize--){ $groesse=$fontsize; $hoehe_neu=checktexthight($groesse,$winkel,$fontfile,$textConverted,$yoffset); if($hghoehe>$hoehe_neu)break; } } $breite=checktextwidth($groesse,$winkel,$fontfile,$textConverted,$xoffset); $hoehe=$hghoehe; $sizeText=imagettfbbox_bugfixed ($groesse,$winkel,$fontfile,$textConverted); } $temp=imagecreatetruecolor($breite,$hoehe); if(!empty($hgimage)){ $hgtype=$hgimage_size[2]; switch($hgtype){ case IMAGETYPE_JPEG: $imagehg=imagecreatefromjpeg($hgimage); break; case IMAGETYPE_GIF: $imagehg=imagecreatefromgif($hgimage); break; case IMAGETYPE_PNG: $imagehg=imagecreatefrompng($hgimage); break; } if(isset($imagehg)){ imagecopyresampled($temp,$imagehg,0,0,0,0,$breite,$hoehe,$hgbreite,$hghoehe); } }else{ $fuellfarbe=imagecolorallocate($temp,hexrgb($hgfarbe_get, 'r'), hexrgb($hgfarbe_get, g), hexrgb($hgfarbe_get, 'b')); imagefill($temp,0,0,$fuellfarbe); } $black = ImageColorAllocate ($temp, 0, 0, 0); $schriftfarbe = imagecolorallocate ($temp, hexrgb($schriftfarbe_get, 'r'), hexrgb($schriftfarbe_get, 'g'), hexrgb($schriftfarbe_get, 'b')); $schattenfarbe = imagecolorallocatealpha ($temp,0, hexrgb($schattenfarbe_get, 'r'), hexrgb($schattenfarbe_get, 'g'), hexrgb($schattenfarbe_get, 'b')); if($sizeText[13]<0){ //mittig platzieren $posy=floor(($hoehe/2)+($sizeText[9]/2)); }else{ $posy=$sizeText[13]; } if($sizeText[12]<0){ $pluswertx=$sizeText[12]*-1; $posx=$pluswertx+$xoffset; }else{ $posx=$sizeText[12]+$xoffset; } if($schatten==1){ imagettftext($temp, $groesse, $winkel, $posx-round($groesse/15), $posy-round($groesse/15), $schattenfarbe, $fontfile,$textConverted); } imagettftext($temp, $groesse, $winkel, $posx, $posy , $schriftfarbe, $fontfile,$textConverted); imagejpeg($temp,"",100); ?> imagettfbbox_bugfixed wurde mir bei einem alten Problemfall vorgeschlagen: http://phpforum.de/forum/showthread.php?t=226020 Kann mir jemand helfen? Entweder ich steh auf der Leitung oder das positionieren von Text ist echt so schwer....
__________________
Keine Widerrede, Mann, weil ich ja sowieso gewinn... la la la lala la! ![]()
Tipp:
Standardantworten und der Doku-Vorleseservice sind nicht böse gemeint! |
|
#2
|
|||
|
|||
|
warum Plus? Das Koordinatensystem ist links oben angeordnet. Dein oberer Abstand ermittelt sich mit nem Minus.
Gruß Jens
__________________
Schleichwerbung I - Schleichwerbung II - Schleichwerbung III - Schleichwerbung IV |
|
#3
|
|||
|
|||
|
Als Basis für die Y-Koordinate wird die Grundlinie des Textes verwendet.
Die Grundline ist das, worauf der Text steht: http://upload.wikimedia.org/wikipedi...griffe.svg.png Meine Rechnung stimmt also schon in gewisser Weise.. Beispielrechnung: Höhe= 32 Höhe Text = 26 Hälfte Höhe (16) + Hälfte Höhe Text (13) = 29 Abstand unten= 3 Pixel Abstand oben = 3 Pixel Denmach wäre es mittig ... ABER: Unterlängen werden nicht berücksichtigt. Die Höhe der Ober- und Unterlängen variiert aber von Schrift zu Schrift. Hm... Ich hab hier was gefunden: http://phpxref.com/xref/fluxcms/inc/...php.source.txt Im Grunde muss ich die Unterlänge berrechnen und die Hälfte davon wieder von der posy abziehen. Mal sehen, wie das aussieht, wenn die Grundlinien variieren. Ich denke, man müsste die POS-Y für die Schriftart und -größe global ermitteln. Diese Funktion ist echt ein Fass ohne Boden...
__________________
Keine Widerrede, Mann, weil ich ja sowieso gewinn... la la la lala la! ![]()
Tipp:
Standardantworten und der Doku-Vorleseservice sind nicht böse gemeint! |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|