Ein BIld zerlgen und wieder zusammensetzen!
Prime
- php
Hallo zusammen,
ich setzt mich gerade mit image-Funktionen auseinander und komme gerade nicht weiter.
Es soll einfach ein bestehendes Bilder zerlegt und dann genauso wieder neu erstellt werden. Ich weiss, es macht in dieser Form keinen Sinn (Warum sollte man dies tun wollen), doch es geht hier nur ums Verstehen.
Hier meine Code:
<?php
header("Content-Type: image/gif");
$pfad = "test.jpg";
$bild = imagecreatefromjpeg($pfad);
$groesse = GetImageSize($pfad);
$bildneu = imagecreate($groesse[0],$groesse[1]);
for($i=0;$i<$groesse[0];$i++)
for($j=0;$j<$groesse[1];$j++)
imagesetpixel($bildneu, $i, $j, imagecolorat($bild,$i,$j));
imagegif($bildneu);
imagedestroy($bildneu);
?>
Frage: Warum wird mir nur ein komplett weißes Bild angezeigt, obwohl imagecolorat() definitiv unterschiedliche Werte liefert.
Ich habe bereits versucht über Umwege (Einzelschritte) mittels imagecolorsforindex (RGB-Werte)und imagecolorallocate das Bild zu erzeugen, doch auch hier bleibt das erzeugte Bild weiß.
Da imagecolorallocate genau die gleichen Werte geliefert hatte wie imagecolorat, konnte ich meiner Meinung nach die beiden zusätzlichen Funktionen weglassen und das neue Bild direkt mit den imagecolorat-Werten erzeugen. (Oder etwa nicht?)
Wer kann mir bitte helfen? Wo liegt mein Fehler? Ich möchte es endlich verstehen!
Vielen Dank!
Gruß
Prime
Hi!
[...] doch es geht hier nur ums Verstehen.
Hast du auch die beiden Farbmodelle verstanden: Truecolor versus indexierte (palettenbasierte) Farben?
$pfad = "test.jpg";
$bild = imagecreatefromjpeg($pfad);
Du hantierst hier mit einem JPEG-Bild, also True-Color.
$bildneu = imagecreate($groesse[0],$groesse[1]);
Du erstellst hier ein Bild mit welchem Farbmodell? Das PHP-Handbuch klärt darüber auf.
imagesetpixel($bildneu, $i, $j, imagecolorat($bild,$i,$j));
Und weiter: Für welche Farbmodelle sind diese Funktionen ausgelegt? Oder: Was weiß das PHP-Handbuch zu ihrer Verwendung zu berichten?
Lo!
$bild = imagecreatefromjpeg($pfad);
$bildneu = imagecreate($groesse[0],$groesse[1]);
imagesetpixel($bildneu, $i, $j, imagecolorat($bild,$i,$j));
Frage: Warum wird mir nur ein komplett weißes Bild angezeigt, obwohl imagecolorat() definitiv unterschiedliche Werte liefert.
Du kannst bei gd nicht hingehen und Farbnummern aus einem Bild einfach in ein anderes Bild übernehmen. Das funktioniert zwar bei Echtfarbbildern, weil die Farbnummer, die imagecolorat() liefert, dann zweckmäßigerweise einem Satz aus Rot-, Grün- und Blauwerten entspricht, aber imagecreate() erzeugt ein palettenbasiertes Bild, d.h. es gibt einen festzulegenden, festen Satz von höchstens 256 Farben, die pro Pixel über eine Nummer zwischen 0 und 255, nicht über rot, grün und blau angesprochen werden.
Ich habe bereits versucht über Umwege (Einzelschritte) mittels imagecolorsforindex (RGB-Werte)und imagecolorallocate das Bild zu erzeugen, doch auch hier bleibt das erzeugte Bild weiß.
Das ist kein Umweg, sondern der richtige Weg. Dein Problem ist vermutlich, dass du versuchst, achtkommasonstwas Millionen Farben in ein Bild zu bekommen, das nur 256 unterstützt. In der PHP-Anleitung wird leider verschwiegen, dass imagecolorallocate() einen Fehler liefert, sobald alle Einträge in der Farbtabelle belegt sind, das steht nur in der Anleitung der gd-Bibliothek selbst.
Eigentlich hättest du bei korrekter Benutzung von imagecolorsforindex() und imagecolorallocate() mindestens die ersten 256 Pixel in deinem neuen Bild sehen müssen. Ob das so war, und falls nicht, warum nicht, kann ich nicht sagen, dazu fehlt dein Code.
Willst du Bild erstmal einfach nur kopieren, verwende imagecreatetruecolor() statt imagecreate().
Vielen Dank Fufu,
wie bei so vielen Dingen lag es an den Grundlagen.
imagecreatetruecolor() lieferte die Richtige Lösung, jetzt kann ich weiter arbeiten.
Gruß
Prime