Grafik mit eingegebenem Text beschreiben

dooofi

Grünschnabel
Hallo allezusammen,...

Ich bin relativer PHP-Neuling und hab über die Suche bisher nicht sehr viel hilfreiches gefunden. Mein Problem:

Ich habe eine bestehende PNG-Grafik auf dem Server, die ich über ein Input-Feld mit Text beschreiben möchte, und zwar in einem bestimmten TTF-Font. Die Grafik soll anschliessend auf dem Server gespeichert und in einer Tabelle mit weiteren Grafiken ausgegeben werden.

1. Was muss der Server von der Installation her bieten, damit das klappt?

2. Wie binde ich eine bestimmte TTF-Schrift ein, und geht sowas überhaupt wenn man nicht der Server-Admin ist?

3. Ich hab sowas ähnliches schon mal für einen Smilie-Generator gemacht, nur hilft mir das diesmal nicht unbedingt weiter....
Ich häng die PHP-Datei mal an, vlt brauch ich da ja nur bestimmte sachen ändern ....
und hier mal der Code zu der Funktion die ich dort verwendet habe:
PHP:
function beschriftung($schrift,$pic)
{
   $text = chunk_split($schrift,20,"\n");
   $text = explode("\n",$text);
   foreach($text as $reihe)
   {
	$laenge[] = strlen($reihe);
   }
   $L = max($laenge);
   $fontsize = 3;
   $textbreite = $L * imagefontwidth($fontsize) + 12;
   $texthoehe = count($text)*imagefontheight($fontsize)+10;
   $id = imagecreatefrompng("images/site/smilies/generator/". $pic . ".png");
   $bildbreite = imagesx($id);
   $bildhoehe = imagesy($id);
   $imageID = imagecreate($textbreite,$texthoehe+$bildhoehe);
   $hintergrundfarbe = imagecolorallocate($imageID,245,252,255);
   $schwarz = imagecolorallocate($imageID,0,0,0);
   $weiss = imagecolorallocate($imageID,255,255,255);
   imagefill($imageID,0,0,$hintergrundfarbe);
   imagecolortransparent($imageID,$hintergrundfarbe);
   imagerectangle($imageID,0,0,$textbreite-1,$texthoehe,$schwarz);
   imagefilledrectangle($imageID,1,1,$textbreite-2,$texthoehe-1,$weiss);
   imagecopy($imageID,$id,$textbreite/2-$bildbreite/2,$texthoehe,0,0,$bildbreite,$bildhoehe);
   $i==0;
   foreach($text as $say)
   {
   imagestring($imageID,$fontsize,5,$i*imagefontheight($fontsize)*ceil(6/count($text)),$say,$schwarz);
      $i++;
   }
   $zahl = rand(1,15);
   imagepng($imageID,"images/site/smilies/user/" . $zahl . ".png");
   return "<img src=images/site/smilies/user/" . $zahl . ".png border=0>";
}

Wär schön wenn mir jemand helfen könnte.. Danke schonmal...
 

Anhänge

Hallöchen jojomp,

danke, das Beispiel hatte ich auch schon gefunden, nur bezieht sich das auf eine neu erstellte grafik. Ich habe schon ein Bild, wo nur der Text drauf soll.. das ist auch nicht das eigentliche Problem, problematisch ist eher die Schriftart...

Die GD-Library ist installiert, nur wo muss die Font-Datei liegen Und kann das eine normale TTF-Datei sein
 
Hallöchen jojomp,

danke, das Beispiel hatte ich auch schon gefunden, nur bezieht sich das auf eine neu erstellte grafik. Ich habe schon ein Bild, wo nur der Text drauf soll.. das ist auch nicht das eigentliche Problem, problematisch ist eher die Schriftart...
Die GD-Library ist installiert, nur wo muss die Font-Datei liegen Und kann das eine normale TTF-Datei sein


1. Die Funktion und das Beispiel ist korrekt. Du brauchst statt des im Beispiel verwendeten imagecreate() statt dessen nur imagecreatefrompng() zu verwenden. :)
2. Die Fontdatei kann überall da hin wo PHP zugriff drauf hat. Du kannst einen Unterordner nehmen oder die TTF-Datei direkt bei der PHP-Datei belassen. Jede normale TTF-Datei funktioniert. :rtfm:
 
Danke für Eure Hilfe! ;) Ich habs nun hinbekommen.. mir fehlt jetzt nur noch ein kleiner Tipp :rolleyes:

Hier erstmal mein einfach-code ;)
PHP:
header("Content-type: image/jpeg");
$image = imagecreatefromjpeg("mauer.jpeg");
$gelb = imagecolorallocate ($image, 255, 255, 0);
imagettftext ($image, 10, 8, 10, 30, $gelb, "juice","meinText"); 
imagejpeg ($image);
imagejpeg($image, "bild5.jpeg");

Diesen Schnippsel möchte ich jetzt so verwenden, dass das bild was daraufhin generiert wird, in einer tabelle angezeigt wird.... ich hab versucht, das Bild nur zu speichern und mir dann den Pfad zusammenzubasteln, aber wenn ich die Zeile IMAGEJPEG($image); weglasse, bekomm ich ne Fehlermeldung...

Den Codeschnippsel möchte ich aus einer anderen PHP-Datei aufrufen, die mir dann die html-Tabelle mit den bildern bastelt.... Ich weiss, dass ich das als Funktion machen kann und das mir dann z.B. mit return $image; das Bild zur Verfügung steht, nur wie bekomm ich das dann in meine Tabelle

Würd mir da mal jemand auf die Sprünge helfen?

Danke
 
Was mach ich falsch?

PHP:
<html>
<head><head>
<body bgcolor="#000099">
<?PHP
if (isset($_POST['meintext']) && ($_POST['meintext']!=""))
{
   header("Content-type: image/jpeg");
   $image = imagecreatefromjpeg("mauer.jpeg");
   $farbe = imagecolorallocate ($image, 255,255,0);
   imagettftext ($image, 10, 8, 10, 30, $farbe, "juicef", $_POST['meintext']);
   $zahl = mt_rand();
   imagejpeg($image, "user" . $zahl . ".jpeg");
   imagedestroy($image);
   $imgpath = "mauer/user". $zahl . ".jpeg";
   echo "<table width=600 border=0 align=center cellspacing=0 cellpadding=0><tr>";
   echo "<td>ein test</td></tr></table>";
   <?
}
?>
</body>
</html>

Die Grafik wird erstellt, aber im Browser bekomm ich nur den Pfad zu PHP-Datei angezeigt Für die Tabelle am Ende hat er nix übrig...
 
Folgende Zeile sendet an den Browser: Achtung, jetzt kommt ein JPG-Bild:

PHP:
   header("Content-type: image/jpeg");

Du kannst in dein generiertes Bild keine HTML-Tabellen einbauen, weil du schlicht und einfach eine Grafik ausgibst und kein HTML :-)

Du wirst es auch so nicht hinbekommen. Du hast die Wahl:Entweder du generierst wirklich eine Grafik und speicherst diese ab oder Du generierst das Bild wie bisher dynamisch und läßt die Tabelle durch ein anderes Script generieren in dem die <img>-Tags als src den Pfad zur PHP-Datei erhalten.
 
Yuhuuuuuu! Ich habs so einigermassen hinbekommen...
Erstmal vielen herzlichen Dank für Eure Hilfe.... Und dank :google: hab ichs nun auch in etwa so wie ich es mir vorgestellt hab... (sind sogar noch einige Sachen mehr geworden, wie ich eigentlich vorhatte... z.B. Zentrierter Text (horizontal u. vertikal) verschiedene Winkel, usw...)

Hier mal meine "Ergüsse" :D

Vielleicht sind ja noch ein paar Bugs drin, werden Euch sicherlich eher auffallen wie mir!

PHP:
<html>
<head>
<style type="text/css">
a:link { color:white; text-decoration:underline; }
a:visited { color:white; text-decoration:underline; }
a:focus { color:white; text-decoration:underline; }
a:hover { color:white; text-decoration:underline; }
a:active { color:white; text-decoration:underline; }
</style>
<head>
<body bgcolor="#000099">
<?PHP
if (isset($_POST['meintext']) && ($_POST['meintext']!= ""))
{
	$image = imagecreatefrompng("mauer.png");
	$farbe = imagecolorallocate ($image, mt_rand(1,255), mt_rand(1,255), mt_rand(1,255));
   $test = read_recursiv(".");
	$stat = mt_rand(1,2);
   if ($stat==1)
   {
      $textboxsize = imagettfbbox(18, 8, "juicef", $_POST['meintext']);
	   $tlänge = abs($textboxsize[4]) + abs($textboxsize[6]);
	   $tbreite = abs($textboxsize[0]) + abs($textboxsize[7]);
	   $imagewidth=180;
	   $imageheight=100;
	   $tx = ($imagewidth - $tlänge) / 2;
	   $ty = $imageheight - (2 * $tbreite) / 2;
      imagettftext ($image, 18, 8, $tx, $ty, $farbe, "juicef", $_POST['meintext']);
   }
   else
   {
	   $textboxsize = imagettfbbox(18, 352, "juicef", $_POST['meintext']);
	   $tlänge = abs($textboxsize[0]) + abs($textboxsize[4]);
	   $tbreite = abs($textboxsize[3]) + abs($textboxsize[7]);
	   $imagewidth=180;
	   $imageheight=100;
	   $tx = ($imagewidth - $tlänge) / 2;
	   $ty = $imageheight - (2 * $tbreite) / 2;
      imagettftext ($image, 18, 352, $tx, $ty, $farbe, "juicef", $_POST['meintext']);
   }
	$zahl = mt_rand();
	imagepng($image, "user" . $zahl . ".png");
	imagedestroy($image);
}
function read_recursiv($path)
{
   $result = array();
   $handle = opendir($path);
   if ($handle)
   {
      while (false !== ($file = readdir($handle)))
      {
          if (($file != ".") && ($file != "..") && (substr(strtolower($file), -3)=="png") && (substr(strtolower($file), 0,1)=="u"))
          {
             $name = $path . "/" . $file;
             if (is_dir($name))
             {
                $ar = read_recursiv($name);
                foreach ($ar as $value)
                {
                   $result[] = $value;
                }
             }
             else
             {
                //$result[] = $name;
                $result[]= "<img src='" . substr(($name), 2) . "' border='0'>";
             }
          }
      }
   }
   closedir($handle);
   return $result;
}
$data = read_recursiv(".");
$anzahl = count($data);
echo "<div align=center><a href=http://doofi.do.ohost.de target=_self>zurück</a></div>";
echo "<table width=600 border=0 align=center cellspacing=0 cellpadding=0><tr>";
$i==1;
foreach($data as $value)
{
   if ($i<6)
   {
   echo "<td>$value</td>";
      $i=$i+1;
   }
   elseif (($i%6)==0)
   {
      echo "</tr><tr><td>$value</td>";
      $i=1;
   }
}
echo "</tr></table>";

?>
</body>
</html>

Wer sich das live anschauen möchte:
http://doofi.do.ohost.de/include.php?path=mauer/mauer.php
 
Zurück