Meine Intention: Auf einer Website soll man ein hochgeladenes Bild wie rechts abgebildet auf Wunsch beschneiden können. Das Resultat landet wieder als Bilddatei auf dem Webserver.

Die zwei Grundpfeiler der ganzen Geschichte sind zum einen die JavaScript-Bibliothek cropper und zum anderen der Befehl imagecopyresampled der PHP-GD-Bibliothek.

Die PHP-API-Dokumentation ist für mich eigentlich das Top-Beispiel, wie eine Dokumentation aussehen müsste. Allerdings sind bei mir wohl durch die Beschreibung des Befehles imagecopyresampled ein mehr an grauen Haaren hinzugekommen. Da waren auch die zahlreichen Codeschnipsel im unteren Teil der Seite keine Hilfe, bei denen immer gleich noch skaliert wurde.

Mein "Missverständnis" mit imagecopyresampled

php.net sagt:

bool imagecopyresampled ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)

dst_image Resource des Zielbildes.
src_image Resource des Quellbildes.
dst_x     x-Koordinate Ziel
dst_y     y-Koordinate Ziel
src_x     x-Koordinate Quelle
src_y     y-Koordinate Quelle
dst_w     Breite Ziel
dst_h     Höhe Ziel
src_w     Breite der Quelle
src_h     Höhe der Quelle

Habe ich nun ein Bild 900x500px, von dem ich sagen wir mal nur die rechte Hälfte haben möchte, würde ich davon ausgehen, dass folgende Parameter korrekt wären:

bool imagecopyresampled ($dst_image, $src_image, 0, 0, 450, 0, 450, 500, 900, 500);

Dies ist allerdings nicht der Fall: Das Ergebnis war immer ein verzerrtes Bild.
Überhaupt nicht hilfreich bei der Suche nach den korrekten Parametern war der Umstand, dass mir cropper nicht die Position und Größe der Cropbox in Relation zur eigentlichen Bildgröße, sondern in Relation zur Bildgröße auf der Website (wo das Bild leicht skaliert war) geliefert hatte. Aber das ist eine andere Geschichte.

Lösung des Rätsels war, als Werte für Breite und Höhe sowohl bei Ziel wie auch bei Quelle dieselben Ziel-Werte einzusetzen:

bool imagecopyresampled ($dst_image, $src_image, 0, 0, 450, 0, 450, 500, 450, 500);

(Also vorletzter Wert ebenfalls 450 statt 900)