Suchen
 
Inside Forum
Nützliche Links
PHP News
 
phpforum.de UserMap
 
phpforum.de bei Facebook
 


phpforum.de bei Twitter
 
phpforum.de Tipp
PHP Test



werbung



Zurück   Forum: phpforum.de > PHP > PHP

PHP Alles rund um PHP

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 21.07.2010, 15:26
jumping-blueberry jumping-blueberry ist offline
Vorbildlicher Helfer
 
Registriert seit: 07.01.2004
Ort: Bayern
Beiträge: 2.321
Standard imagettftexte - posy

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!
Mit Zitat antworten
  #2  
Alt 21.07.2010, 17:15
Jens Clasen Jens Clasen ist offline
Forum-Mitarbeiter
 
Registriert seit: 12.02.2005
Beiträge: 9.279
Standard AW: imagettftexte - posy

warum Plus? Das Koordinatensystem ist links oben angeordnet. Dein oberer Abstand ermittelt sich mit nem Minus.

Gruß Jens
Mit Zitat antworten
  #3  
Alt 21.07.2010, 22:09
jumping-blueberry jumping-blueberry ist offline
Vorbildlicher Helfer
 
Registriert seit: 07.01.2004
Ort: Bayern
Beiträge: 2.321
Standard AW: imagettftexte - posy

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!
Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu



Alle Zeitangaben in WEZ +2. Es ist jetzt 21:16 Uhr.


Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC