Online-Bild per PHP drehen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
bild
code
dank
datei
drehen
einfaches drehen
erstellen
format
funktion
grad
http
image
info
kopf
laden
manual
sagen
speichern
stellen
winkel
-
Hallo Leute,
habe da eine Frage.
Ist es mit PHP (und den image funktionen) möglich, ein zb von mir hochgeladens Bild, welches sagen wir auf dem Kopf steht weil ich es vorher nicht \"gerade gedreht\" habe, so zu drehen dass es dann richtig anzusehen ist?
Dass es grundsätzlich möglich ist, weiß ich da ich es schon wo gesehen habe, nur wie. Muss man das Bild neu generieren? Oder gibts da irgendwelche Spezialfunktionen?
Wäre über Tipps sehr dankbar!
MfG,
.i -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ist es mit PHP (und den image funktionen) möglich, ein zb von mir hochgeladens Bild, welches sagen wir auf dem Kopf steht weil ich es vorher nicht \"gerade gedreht\" habe, so zu drehen dass es dann richtig anzusehen ist?
http://de.php.net/manual/de/function.imagerotate.php
Dass es grundsätzlich möglich ist, weiß ich da ich es schon wo gesehen habe, nur wie. Muss man das Bild neu generieren? Oder gibts da irgendwelche Spezialfunktionen?
Die Image-Funktionen generieren ein neues Bild, welches du aber auch sichern kannst damit du nicht bei jedem Seitenaufruf das Bild neu drehst sondern das Bild zB nur nach dem Upload drehst, dann speicherst und das gespeicherte Bild dann anzeigst. -
Ich würde es gleich beim Upload drehen, da das sonst bei jedem Seitenaufruf gedreht werden muss, und das belastet den Server.
Sonst wie in dem PHP Handbuch:
// Dateiname und Drehung: $filename = \'test.jpg\'; $degrees = 180; // Drehung $rotate = imagerotate($source, $degrees, 0); // Ausgabe imagejpeg($rotate);
Du solltest vorher nur noch prüfen, ob das Bild überhaupt gedreht werden muss.
-
Ist es mit PHP (und den image funktionen) möglich, ein zb von mir hochgeladens Bild, welches sagen wir auf dem Kopf steht weil ich es vorher nicht \"gerade gedreht\" habe, so zu drehen dass es dann richtig anzusehen ist?
Dass es grundsätzlich möglich ist, weiß ich da ich es schon wo gesehen habe, nur wie. Muss man das Bild neu generieren? Oder gibts da irgendwelche Spezialfunktionen?
MfG,
.i
Das Problem ist nicht die Rotation, die erledigst du mit imageRotate() oder einer der benutzerdefinierten Funktionen, die im Handbuch zu imageRotate() aufgeführt sind. Das Problem ist, dass das API der Grafik-Funktionen in PHP sehr, ähm, gewöhnungsbedürftig und wenig intuitiv ist. Du musst nämlich erstmal das Dateiformat des hochgeladenen Bildes ermitteln. Das geht mit getimagesize():
http://de.php.net/manual/de/function.getimagesize.php
Dann erst kannst du eine der formatabhängigen Bilder-Lade-Funktionen draufloslassen:
http://de.php.net/manual/de/function.imagecreatefromjpeg.php
http://de.php.net/manual/de/function.imagecreatefrompng.php
http://de.php.net/manual/de/function.imagecreatefromgif.php
Diese Funktionen erzeugen eine so genannte Image-Ressource (engl. \"image resource\"). Das ist ein Zeiger auf eine Datenstruktur, die die Grafikdaten (die Pixel halt) vorhält.
Diese kannst du dann bearbeiten. Drehen um beliebige Winkel geht mit imageRotate:
http://de.php.net/manual/de/function.imagerotate.php
Für \"einfaches Drehen\" um 90-Grad-Winkel (also auch auf den Kopf stellen), gibts in den Benutzer-Kommentaren massig Beispiele. Diese Funktionen haben den Vorteil, dass alle Pixel als Ganzes erhalten bleiben. Beim Rotieren um einen freien Winkel können diese durch das Antialiasing verändert werden.
Außerdem musst du beachten, dass imageRotate() das Bild nicht einfach rotiert, sondern eine neue Image-Ressource erzeugt, die das Bild als rotierte Version enthält. Das Original steht unverändert in der alten Ressource.
Am Ende musst du das neue Bild auch wieder abspeichern, dazu gibts wieder für jedes unterstützte Dateiformat eine extra Funktion:
http://de.php.net/manual/de/function.imagejpeg.php
http://de.php.net/manual/de/function.imagepng.php
http://de.php.net/manual/de/function.imagegif.php
Hier mal eine Rohfassung einer Funktion, die die geforderten Aufgaben ausführt (mit Anwendungsbeispiel unten dran):
/// lädt Bild, rotiert um angegebenen Winkel /// und speichert das rotierte Bild in der /// gleichen(!) Datei function bild_rotieren( $datei, $winkel ) { $formate = array ( 1 => \'imagecreatefromgif\', 2 => \'imagecreatefromjpeg\', 3 => \'imagecreatefrompng\', ); if (!file_exists($datei)) { return FALSE; } // format bestimmen $info = getimagesize($datei); if (!isset($formate[$info[2]])) { // falsches Format return FALSE; } $lade_bild = $formate($info[2]); // bild laden if (!$img = $lade_bild($datei)) { // laden fehlgeschlagen (oft wegen Speichermangel) return FALSE; } // rotierte Kopie des Bildes erstellen if (!$rotiert = imageRotate($img, $winkel, $hintergrundfarbe = 0) { // rotieren fehlgeschlagen (meist wegen Speichermangel) return FALSE; } $speichere_bild = preg_replace(\'/createfrom/\', \'\', $formate($info[2]); if (!$speichere_bild($rotiert, $datei)) { // konnte Datei nicht speichern return FALSE; } return TRUE; } $datei = \'schlagmichtot.jpg\'; $winkel = 90; if (bild_rotieren($datei, $winkel)) { print(\'Fehler aufgetreten!\'); } else { print(\'Scheint geklappt zu haben ...\'); }
Ich hoffe, das Teil funktioniert auf Anhieb ... -
\"einfaches Drehen\" um 90-Grad-Winkel (also auch auf den Kopf stellen)
90° sind \"auf die Seite legen\", 180° sind \"auf den Kopf stellen\"
Beitrag geändert: 25.6.2008 17:06:08 von merovius -
... und was wäre dann deiner Meinung nach \"um 270 Grad drehen\"?
Ich hab mich wohl unklar ausgedrückt. Es ging mir um alle Arten von Winkeln, die im 90-Grad-Raster liegen. Das Auf-den-Kopf-Stellen (um 180 Grad drehen) kann man übrigens mit einmal \"Vertikal Spiegeln\" (spiegen heißt in dem Fall auf Englisch \"flip\") und anschließend \"Horizontal Spiegeln\" prima selberbasteln (für die Hobbythek-Freunde). Nebenbei dürfte das weniger Speicher brauchen, als imageRotate() -- was bei sehr großen Bildern manchmal wichtig sein könnte. -
Danke für die kleine Diskusionsrunde :D
Gedacht wars so:
Jeder User kann Fotoalben erstellen und Fotos hochladen, manche laden jedoch Fotos hoch die nicht richtig gedreht sind, deshalb wollte ich den Usern die Möglichkeit geben, das Bild am Server zu drehen und nicht noch einmal neu hochladen zu müssen (und ev. Kommentare etc. zu verlieren).
-> Deshalb wär mir das vorherige Bild egal und ich würde das gedrehte durch das vorherige ersetzen, speichern und in Zukunft anzeigen.
--
Leider hab ich momentan eh keine Lust und Zeit das zu machen :D -- aber vorgemerkt ists mal :)
Danke nochmal!
MfG,
.i -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage