Bildbearbeitung mit PHP

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bildbearbeitung mit PHP

    Hallo!

    Ich habe keine Kenntnisse auf dem Gebiet, würde aber gerne etwas lernen.

    Welche Bildformate kann man mit PHP bearbeiten? Welche Art der Formatierungen sind möglich? Skalierungen, Konvertierungen, Rotationen, Effekte... ? Welche Funktionen gibt es zur Bildbearbeitung? Fragen über Fragen! :D
  • Man kann alles machen ;)
    Naja, zumindest die Webformate kannst du bearbeiten..
    inkl. Transparenzen & co

    Vektorgrafiken, bzw. Photoshop Dateien sind nicht standardmäßig implementiert, lassen sich mit viel Freizeit aber bestimmt auch umsetzen
    sind schließlich auch nur 0en und 1en

    Aber zurück zur PHP Bildbearbeitung
    anfangs musst du dich entscheiden ob du mit der GDlib oder mit ImageMagick arbeitest

    GdLib in der Version2 (dürfte überall standard sein) kann die bekannten webformate (png, gif, jpeg, wbmp) inkl. alphakanal (das was der IE immer noch nicht richtig kann)

    zurückgreifen kann sie außerdem auf truetype und postscript schriftarten
    (die musst du seperat ins verzeichnis laden)
    [phpdoc]imagerotate[/phpdoc], und viele andere standardfunktionen erleichtern die arbeit

    ImageMagick kann wesentlich mehr formate..
    habe es aber selber nie verwendet, da man es zusätzlich auf dem server installieren muss..
    und warum die arbeit machen, wenn GD alle nötigen funktionen besitzt

    http://de.php.net/image#AEN56652

    //Edit:
    hier ein nettes tool: http://net4visions.com/dev/imanager/imanager.php
  • GD scheint die herkömmlichere Methode zu sein, mit PHP Bilder zu bearbeiten. Zu ImageMagick konnte ich auf http://de.php.net/image nichts finden.

    GD 2 ist wohl nicht selbstverständlich. Auf einem der Server, auf die ich ZUgriff habe, ist laut PHP-Info GD version "1.6.2 or higher" installiert. Der Server hat die PHP-Version 4.2.3 - ist also nicht steinalt (wobei das nicht sehr neu ist).

    Habe mich mal hingesetzt und ein kleines Script geschrieben:

    Quellcode

    1. <?php
    2. header("Content-type: image/jpeg");
    3. $src = "quellbild.jpg";
    4. $quellbild = imagecreatefromjpeg($src);
    5. $weite = imagesx($quellbild);
    6. $hoehe = imagesy($quellbild);
    7. $thumb = imagecreate($weite/3,$hoehe/3);
    8. imagecopyresized($thumb, $quellbild, 0, 0, 0, 0, $weite/3, $hoehe/3, $weite, $hoehe);
    9. imagejpeg($thumb);
    10. imagedestroy($thumb);
    11. ?>
    Alles anzeigen


    Erstellt eine um 1/3 verkleinerte Version des Bildes "quellbild.jpg", aufzurufen unter der URL des Scripts.
  • so, habe mein thumbnail-script fertig. man kann es aufrufen nach dem muster thumb.php?kat=verzeichnis&subkat=unterverzeichnis&num=dateiname

    hier der quelltext:

    Quellcode

    1. <?php
    2. $kat = $_GET["kat"];
    3. $subkat = $_GET["subkat"];
    4. $num = $_GET["num"];
    5. // Wir wollen verhindern, dass der User Slashs in die Variablen packt
    6. // Sonst erhält er noch Zugriff auf Verzeichnisse, auf die er keinen Zugriff haben soll.
    7. if(strpos($kat,"/")!==false) exit("Ung&uuml;ltige Variable!");
    8. else if(strpos($subkat,"/")!==false) exit("Ung&uuml;ltige Variable!");
    9. else header("Content-type: image/jpeg");
    10. $src = "fotos/".$kat."/";
    11. if ($subkat) $src.=$subkat."/";
    12. $src.=$num.".jpg";
    13. $quellbild = imagecreatefromjpeg($src);
    14. $weite = imagesx($quellbild);
    15. $hoehe = imagesy($quellbild);
    16. // Je nach Proportion ist die Weite entweder 120 oder 90.
    17. if($weite>$hoehe) {
    18. $weiteth = 120;
    19. $hoeheth = ($weiteth/$weite)*$hoehe;
    20. }
    21. else {
    22. $weiteth = 90;
    23. $hoeheth = ($weiteth/$weite)*$hoehe;
    24. }
    25. // Bei GD 2.x wird imagecreatetruecolor verwendet, ansonsten imagecreate
    26. if(!@$thumb = imagecreatetruecolor($weiteth,$hoeheth)) $thumb = imagecreate($weiteth,$hoeheth);
    27. // Statt imagecopyresized könnte man auch imagecopyresampled verwenden. Die Qualität davon ist wesentlich besser.
    28. // Es ist allerdings erst in GD 2.x verfügbar und die Geschwindigkeit ist wesentlich langsamer.
    29. imagecopyresized($thumb, $quellbild, 0, 0, 0, 0, $weiteth, $hoeheth, $weite, $hoehe);
    30. imagejpeg($thumb);
    31. imagedestroy($thumb);
    32. ?>
    Alles anzeigen
  • hier nun ein auszug aus meinem galerie-script, was diese thumbnails verwendet (online-demo unter http://hanau.nazarener.de/pio/galerie.php):

    Quellcode

    1. <?php [...] $PHP_SELF = $_SERVER["PHP_SELF"];
    2. // Zunächst werden die einzelnen Galerien definiert, in diesem Fall die Galerie "uebernachtung".
    3. // $kat beschreibt das Verzeichnis, in dem die Bilder liegen
    4. $kat["uebernachtung"]="uebernachtung";
    5. // $subkat kann außerdem noch ein Unterverzeichnis definieren. Hier nicht der Fall.
    6. // $num beschreibt das Vorschaubild in der Auflistung der einzelnen Galerien.
    7. $num["uebernachtung"] = "079";
    8. // Die nach außen hin sichtbare Bezeichnung der Galerie
    9. $headline["uebernachtung"] = "&uuml;bernachtung";
    10. // Beschreibung der Galerie
    11. $description["uebernachtung"] = "Fotos von unserer &Uuml;bernachtung im Oktober 2005 mit Ausflug zum Opel-Zoo.";
    12. // Und so geht das weiter mit den anderen Galerien
    13. [...]
    14. $zeige = $_GET["zeige"];
    15. // $zeige bestimmt, welche Galerie aufgerufen werden soll
    16. $seite = $_GET["seite"];
    17. // $seite bestimmt, welche Seite der Galerie angezeigt werden soll.
    18. if(!$seite) $seite = "1";
    19. // Diese Funktion erstellt einen Link in der Seitennavigation.
    20. function navlink($seite) {
    21. global $PHP_SELF;
    22. global $zeige;
    23. $return = "<a href=\"".$PHP_SELF."?zeige=".$zeige."&amp;seite=".$seite."\">".$seite."</a>";
    24. return $return;
    25. }
    26. // Diese Funktion erstellt die Navigation und benutzt dabei die obige Funktion.
    27. function shownavi($where) {
    28. global $seite;
    29. global $fotos;
    30. // Es werden 16 Fotos pro Seite angezeigt.
    31. $seiten = ceil($fotos/16);
    32. $return = "<p align=\"center\" style=\"text-align:center;\">";
    33. if($where=="oben") $return .= "Seite ".$seite."<br />\n";
    34. for($i=1; $i<=$seiten; $i++) {
    35. if($i>"1") $return .= " ";
    36. if($seite!=$i) $return .= navlink($i);
    37. else $return .= $seite;
    38. }
    39. if($where=="unten") $return .= "<br />Seite ".$seite."\n";
    40. $return .= "</p>";
    41. return $return;
    42. }
    43. // Diese Funktion ist für die Anzeige eines einzelnen Fotos verantwortlich.
    44. // Es werden ihr der Dateiname des Fotos (ohne Endung) und der Key der entsprechenden Galerie übermittelt.
    45. // Hierbei wird Gebrauch von thumb.php gemacht!
    46. function showfoto($nummer,$zeige) {
    47. global $kat, $subkat;
    48. $return = "<a href=\"fotos/".$kat[$zeige]."/";
    49. if($subkat[$zeige]) $return.=$subkat[$zeige]."/";
    50. $return .= $nummer.".jpg\" target=\"_blank\"><img
    51. src=\"thumb.php?kat=".$kat[$zeige];
    52. if($subkat[$zeige]) $return.="&amp;subkat=".$subkat[$zeige];
    53. $return .= "&amp;num=".$nummer."\"
    54. alt=\"Foto ".$nummer.", Anklicken zum Vergr&ouml;&szlig;ern\" /></a>";
    55. return $return;
    56. }
    57. [...]
    58. if($zeige) {
    59. // Wenn $zeige übergeben wird, soll eine bestimmte Galerie angezeigt werden.
    60. echo "<div style=\"text-align:center;\"><h3>".$headline[$zeige]."</h3></div>\n";
    61. echo $description[$zeige]."<br />&nbsp;\n";
    62. echo "<br />Alle Fotos k&ouml;nnen per Klick vergr&ouml;&szlig;ert werden!\n";
    63. // In diesem Verzeichnis befinden sich die Fotos:
    64. $dir = "fotos/".$kat[$zeige];
    65. if($subkat[$zeige]) $dir.="/".$subkat[$zeige];
    66. if (!is_dir($dir)) exit("Verzeichnis nicht gefunden!");
    67. if (!$diropen = opendir($dir)) exit("Konnte Verzeichnis nicht &ouml;ffnen!");
    68. // In einer Schleife wird das Verzeichnis schon einmal ausgelesen, um zu überprüfen, wieviele Fotos es darin gibt.
    69. $i=0;
    70. while (($file = readdir($diropen)) !== false) {
    71. $src = $dir."/".$file;
    72. // Was kein Foto ist, zählt nicht
    73. if(!@$properties = getimagesize($src)) continue;
    74. // Was kein JPG ist, zählt auch nicht.
    75. else if($properties[2]!=2) continue;
    76. else $i++;
    77. }
    78. closedir($diropen);
    79. // Jetzt wissen wir, wieviele Fotos es gibt und können die Navigation anlegen.
    80. $fotos=$i;
    81. echo shownavi("oben")."\n";
    82. echo "<table style=\"margin-left:auto; margin-right:auto;\">\n";
    83. // Je nach Seite müssen wir bei einem unterschiedlichen Bild mit der Darstellung beginnen.
    84. // Erinnerung: Es gibt 16 Bilder pro Seite.
    85. $startwert = $seite-1;
    86. $startwert *= 16;
    87. $startwert++;
    88. $endwert = $startwert+15;
    89. $i=1;
    90. $src="";
    91. $file="";
    92. if (!$diropen = opendir($dir)) exit("Konnte Verzeichnis nicht &ouml;ffnen!");
    93. // Das Verzeichnis wird nochmal ausgelesen - diesmal mit dem Ziel die Bilder anzuzeigen!
    94. while (($file = readdir($diropen)) !== false) {
    95. $src = $dir."/".$file;
    96. // Was kein Bild oder kein JPG ist, fliegt wieder raus...
    97. if(!@$properties = getimagesize($src)) continue;
    98. else if($properties[2]!=2) continue;
    99. // Bilder von früheren Seiten werden ebenfalls nicht dargestellt.
    100. else if($i<$startwert) {
    101. $i++;
    102. continue;
    103. }
    104. // Bilder von späteren Seiten genausowenig.
    105. else if($i>$endwert) break;
    106. // Bei jedem 4.Bild beginnt eine neue Tabellenzeile.
    107. if(is_int(($i-1)/4)) echo "<tr>\n";
    108. echo " <td style=\"text-align:center;\">";
    109. // Mittels der Funktion showfoto() werden jetzt die Bilder dargestellt, wenn noch welche da sind.
    110. if($i<=$fotos) echo showfoto(basename($file,".jpg"),$zeige);
    111. else echo "&nbsp;";
    112. echo "</td>\n";
    113. $i++;
    114. }
    115. // In unserer letzten Tabellenzeilen sind evtl. Spalten freigeblieben. Die werden jetzt aufgefüllt.
    116. if(is_int(($i-1)/4)!==true) {
    117. echo " <td style=\"text-align:center;\">";
    118. echo "&nbsp;";
    119. echo "</td>\n";
    120. }
    121. while(is_int($i/4)!==true&&is_int(($i-1)/4)!==true) {
    122. echo " <td style=\"text-align:center;\">";
    123. echo "&nbsp;";
    124. echo "</td>\n";
    125. $i++;
    126. }
    127. echo "</tr>\n";
    128. echo "</table>\n";
    129. echo shownavi("unten")."\n";
    130. }
    131. else {
    132. // Sollte man keine Galerie ausgewählt haben, wird eine Übersicht der Galerien angezeigt.
    133. echo "Du befindest dich jetzt in unserer Fotogalerie! Links kannst du eine
    134. Fotogalerie ausw&auml;hlen, die du ansehen m&ouml;chtest. Die Galerien sind chronologisch geordnet,
    135. d.h. die neuesten Galerien erscheinen oben, die &auml;ltesten unten. Es folgt eine
    136. Beschreibung der einzelnen Galerien.
    137. <p></p>";
    138. // Wir arbeiten wieder mit unseren anfangs definierten Arrays. $what interessiert uns dabei gar nicht.
    139. foreach($kat as $now => $what) {
    140. // In einer Tabelle wird links ein Vorschaubild angezeigt, rechts die Überschrift und eine Beschreibung der Galerie.
    141. echo " <table style=\"border:1px solid black; width:100%; margin-bottom:10px;\">
    142. <tr style=\"vertical-align:top;\">
    143. <td style=\"width:120px;\"><img src=\"thumb.php?kat=".$kat[$now];
    144. if($subkat[$now]) echo "&amp;subkat=".$subkat[$now];
    145. echo "&amp;num=".$num[$now]."\" alt=\"\" /></td>
    146. <td><a href=\"galerie.php?zeige=".$now."\">:: ".$headline[$now]." ::</a><br />
    147. ".$description[$now]."</td>
    148. </tr>
    149. </table>";
    150. }
    151. }
    152. [...]
    153. ?>
    Alles anzeigen