dynamisch erstelltes Bild läßt sich nicht speichern

Army Man

Mitglied
Hallo Freunde,

ich arbeite zur Zeit an einem kleine Script, welches über ein Formular ein dynamisches Bild mit Text, Linien und beliebiger Auflösung erzeugt.
(Für euch Profis sicherlich nichts großes, aber immerhin bin ich noch Anfänger und stolz auf meine Arbeit ! ;) )

Unter folgender Adresse findet sich mein Script:
http://www.mhettig.de/US/Wallpaper-Gen/
Alles was ich eintrage wird auch ohne Beanstandung in das Bild übernommen. Mein Problem an der Sache: Das Bild läßt sich nicht mehr ordentlich speichern und mit keinem Bildprogramm öffnen (bzw. er speichert nur das Formular als .html ab...).

Das Problem tritt auch bei Firefox und bei anderem Webspace auf.

PHP:
 <?php
if (isset($_POST["Submit"])) {
header("Content-type: image/png");
 
// Erfassung der Variablen
$size1 = $_POST["size1"];
$size2 = $_POST["size2"];
$fontsizename = $_POST["fontsizename"];
$name1 = $_POST["name1"];
$name2 = $_POST["name2"];
$mitspr = $_POST["mitspr"];
$spr1 = $_POST["spr1"];
 
// Abfrage nach fehlenden Daten + Ausgabe einer Fehlermeldung
$error = '0';
if ($size1 == '') { $error++; }
if ($size2 == '') { $error++; }
if ($name1 == '') { $error++; }
if ($name2 == '') { $error++; }if ($error == '0') {} else { 
include ("error.php");
die (" "); }
 
// Erstellung des Bildes
$im = imagecreate($size1, $size2);
 
// Festlegung der Farben
if ($bg=='black') {
imagecolorallocate($im, 0, 0, 0);
$orang = imagecolorallocate($im, 247, 94, 16);
$farbe1 = imagecolorallocate($im, 255, 255, 255); }if ($bg=='white') {
imagecolorallocate($im, 255, 255, 255);
$orang = imagecolorallocate($im, 247, 94, 16);
$farbe1 = imagecolorallocate($im, 0, 0, 1); }
 
// Schriftart und -größe
$font = 'POR2F';
$font2 = 'arialf';
$fontsize = $size1 / $fontsizename;
$fontsize2 = $size1 / (3 * $fontsizename);
// Erfassung der Schriftbreite/höhe + Ausgabe (Name)
$breite1 = imagettfbbox ($fontsize, 0, $font, $name1);
$breite2 = imagettfbbox ($fontsize, 0, $font, $name2);$breite3 = $breite1[0] + $breite1[2] + ( $size1 / 20 );
$breite4 = $breite2[0] + $breite2[2];$breite5 = $breite3 + $breite4;$breite6 = ($size1 - $breite5) / 2;
$breite7 = (($size1 - $breite5) / 2) + $breite3;$hohe1 = ($size2 + ( $fontsize / 2 ) ) / 2;$text1 = imagettftext($im, $fontsize, 0, $breite6, $hohe1, $farbe1, $font, $name1);
$text2 = imagettftext($im, $fontsize, 0, $breite7, $hohe1, $orang, $font, $name2);
 
//Erfassung der Linienpunkte + Ausgabe
$lineex1 = $breite6 - ( $size1 / 40 );
$liniex2 = $breite7 + $breite4 + ( $size1 / 40 );$liniey1 = ($size2 - $fontsize ) / 2;
$liniey11 =( ($size2 - $fontsize ) / 2 ) +1;
$liniey2 = ($size2 + $fontsize ) / 2;
$liniey22 = ( ($size2 + $fontsize ) / 2 ) +1;imageline ($im, $lineex1, $liniey1, $liniex2, $liniey1, $farbe1);
imageline ($im, $lineex1, $liniey11, $liniex2, $liniey11, $farbe1);imageline ($im, $lineex1, $liniey2, $liniex2, $liniey2, $farbe1);
imageline ($im, $lineex1, $liniey22, $liniex2, $liniey22, $farbe1);
 
// Erfassung der Schriftbreite/höhe + Ausgabe (Spruch)
if ($mitspr=='1') {
$breitespr1 = imagettfbbox ($fontsize2, 0, $font2, $spr1);
$breitespr2 = $liniex2 - $breitespr1[2];$hohespr1 = ($liniey2 + ( $size1 / $fontsizename ) - ($fontsize / 2));$textspr = imagettftext($im, $fontsize2, 0, $breitespr2, $hohespr1, $farbe1, $font2, $spr1); }
else {}
 
// Ausgabe des Bildes als png
imagepng($im);
imagedestroy($im);} else{
?>
 
<html>
<head>
<title>personal Wallpaper/Signatur-Generator by Army Man</title>
<style type="text/css">
<!--
.felder {
margin:2px; border:1px solid #000000; background-color:#D9E2EB; font-size:12px; color:#000000;
onFocus="this.style.backgroundColor='#00FFFF'";
}
.form {
margin:2px; border:2px solid #000000; background-color:#D9E2EB; font-size:14px; color:#000000;
}
-->
</style>
</head><body bgcolor="#FFFFFF" background="img/h.png">
<center><img src="img/banner.png" border="1" bordercolor="#000000"><br>
<b>Army Man's personal Wallpaper & Forum-Signatur Generator</b><br><br>
Ich hab hier mal zwei Beispiele, um zu zeigen, was unter anderem so möglich ist:<br>
<a href="img/bsp1.png" target="_blank">Wallpaper</a> - <a href="img/bsp2.png" target="_blank">Forum-Signatur</a>
<br><br><br><br><form action=<?php echo $PHP_SELF ?> method=POST>
<table border="1" bordercolor="#B3B3B3" width="500" height="400" cellspacing="0" cellpadding="5">
<tr>
<td width="175">
Farbprofil:
</td>
<td>
<INPUT TYPE="RADIO" NAME="bg" VALUE="black" checked>Version 1 (schwarz)<br>
<INPUT TYPE="RADIO" NAME="bg" VALUE="white">Version 2 (weiß)
</td>
</tr>
<tr>
<td width="175">
Auflösung:
</td>
<td>
<input name="size1" type="text" class="felder" size="10" maxlength="5"> x <input name="size2" type="text" class="felder" size="10" maxlength="5">
</td>
</tr>
<tr>
<td width="175">
Schriftgröße:
</td>
<td>
<INPUT TYPE="RADIO" NAME="fontsizename" VALUE="30">klein
<br>
<INPUT TYPE="RADIO" NAME="fontsizename" VALUE="20" checked>standard (empfohlen)
<br>
<INPUT TYPE="RADIO" NAME="fontsizename" VALUE="13">XL (geeignet für Forum Signaturen)
</td>
</tr>
<tr>
<td width="175">
Vorname / 1.Wort:
</td>
<td>
<input name="name1" type="text" class="felder" size="25" maxlength="15">
</td>
</tr>
<tr>
<td width="175">
Nachname / 2. Wort:
</td>
<td>
<input name="name2" type="text" class="felder" size="25" maxlength="15">
</td>
</tr>
<tr>
<td width="175">
Untertitel:
</td>
<td>
<INPUT TYPE="checkbox" NAME="mitspr" VALUE="1" checked>mit Untertitel ?<br>
<input name="spr1" type="text" class="felder" size="40">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" name="Submit" class="form" value="mach's mir !">
</td>
</tr>
</table>
</form></center>
</body>
</html>
<?php } ?>

Ansatz zur Fehlerlösung:
Wenn ich alles lösche, was nicht unmittelbar mit der Erstellung des Bildes zu tun hat, sprich das Formular und die 1. if-Abfrage rausnehme, das _POST durch _GET ersetze und das dann mit einem (ziemlich) langen Link aufrufe, funktioniert das abspeichern wieder so, wie es sein sollte.

Ich bin jetzt schon eine ganze Zeit am Probieren und habe einiges versucht:
- das Formular includen
- alle nichtbenötigten HTML-Teile rauslöschen
- imagedestroy() weglassen
aber alles resultiert in dem gleichen Problem.


Außerdem habe ich im Vorfeld schon Kontakt mit einem Forum-Member aufgenommen, in der Hoffnung einen Beitrag hier im Board vermeiden zu können, doch leider ohne Ergebnis.

Ich hoffe, ihr könnt mir behilflich sein.


Gruß Army Man :)
 
Ich kann mir nur vorstellen, dass der Browser das Bild nicht aus dem cache holt, sondern zum Speichern nochmal von der Originaladresse holt.
In dem Fall würden die Post-Daten fehlen....und das formular ausgegeben.
Hast du schon mal probiert, mit den diversen cache-headern zu arbeiten.
 
Ja, das klingt ziemlich logisch.

Wie sieht das mit den Cache-Headern aus, wie gesagt, ich kenne mich noch nicht allzu gut mit php aus, hast du evtl. 2-3 Beispiele für mich, die ich testen könnte ?

Gruß Army Man
 
Der session-cache-limiter() hat mir leider nicht viel geholfen, ob privat oder public, es ging trotzdem nicht.

Dafür habe ich das ganze Script jetzt mit einer kleinen Session [ session_start() ] in 2 Teile aufgeteilt.
Das Formular und die Erfassung der Variabeln auf der 1. Seite und die reine Ausgabe dann auf einer 2. php-Seite, was ja, wie bereits geschrieben, ja schon funktionierte. (Session daher, damit ich an die 2. php-Seite keinen auffälligen und extrem langen Link weitergeben muss.)

@ Sven Mintel: Ohne deinen Tipp wäre ich da nicht drauf gekommen, also vielen Dank. :)

Als letztes würde ich noch gerne wissen, ob es mit diesem "session_start()" irgendwelche Probleme geben könnte. (Kann es bei mir nur mit Firefox und IE testen und da läuft es wunderbar.)
Die Session-Variante gibt es hier: http://www.mhettig.de/US/Wallpaper-Gen/index3.php


Gruß Army Man
 
Zurück