PHP-Einfach.de PHP lernen leicht gemacht

Navigation
» Startseite
» Newsübersicht
» Kontakt
» Impressum

Community
» Forum
» Gästebuch

Tutorial
» PHP Tutorial
» MySQL Tutorial
» PHP
» MySQL
» Codeschnipsel

Downloads
» Einführung
» Scripts
» Command Board

Sonstiges
» md5-Generator
» Generator
» Wissenswertes

PHP lernen


Dieses Projekt wird unterstützt von
Lichteffekte Shop

 
Partner:
PHP Forum
Mathe Nachhilfe
Suchmaschinenoptimierung

Bild verkleinern (JPEG/PNG/GIF)

Zurück zur Übersicht

Allgemeine Funktion zum Verkleinern von Bildern.

Alternativ existiert noch direkt ein Codeschnipsel für Thumbnails

Angeregt durch eine Anfrage von Mr. Apple und da ich gesehen habe, dass es hier noch keinen all-umfassende Bildverkleinerungs-Code gibt, habe ich nachfolgende Funktion entwickelt und stelle sie euch hier zur freien Verfügung.

Funktionsbeschreibung
Die nachfolgende PHP-Funktion verkleinert oder vergrößert ein auf dem Webserver gespeichertes Bild. Die Funktion ist dabei auf alle im Web gebräuchlichen Bildformate (GIF, PNG, JPEG) anwendbar. Typischer Anwendungsfall ist die Erstellung von Vorschaubildern (Thumbnails).

Funktionsparameter
Der Pfad, unter dem das Bild zu finden ist, welches als Vorlage dienen soll, wird mit $filepath_old übergeben, der Pfad, unter dem das neue, verkleinerte resp. vergrößerte Bild gespeichert werden soll, wird mit $filepath_new übergeben. Mit $image_dimension wird ein ganzzahliger Pixelwert übergeben, dessen Bedeutung erst durch $scale_mode definiert wird. Die möglichen Werte für diesen Parameter sind:

-1: $image_dimension wird als neue Breite des Bildes aufgefasst; die Höhe wird so angepasst, dass das Seitenverhältnis des Bildes erhalten bleibt. Ideal, wenn das Bild in eine Spalte mit fester Breite eingefügt werden soll.
-2: $image_dimension wird als neue Höhe des Bildes aufgefasst; die Breite wird so angepasst, dass das Seitenverhältnis des Bildes erhalten bleibt. Ideal, wenn das Bild in eine Zeile mit fester Höhe eingefügt werden soll.
0: [Standardwert] $image_dimension wird als neue längste Seite des Bildes aufgefasst. Die andere Seite wird entsprechend verkleinert, damit das Seitenverhältnis des Bildes erhalten bleibt. Ideal, wenn das Bild in eine quadratische Box mit fester Größe eingepasst werden soll (typisch für eine Thumbnail-Übersicht).
1: $image_dimension wird als neue kürzeste Seite des Bildes aufgefasst. Die andere Seite wird entsprechend vergrößert, damit das Seitenverhältnis des Bildes erhalten bleibt. Ideal, wenn das Bild eine Mindestgröße nicht unterschreiten soll.


 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
<?php

 
function resizeImage ($filepath_old$filepath_new$image_dimension$scale_mode 0) {
  if (!(
file_exists($filepath_old)) || file_exists($filepath_new)) return false;

  
$image_attributes getimagesize($filepath_old);
  
$image_width_old $image_attributes[0];
  
$image_height_old $image_attributes[1];
  
$image_filetype $image_attributes[2];

  if (
$image_width_old <= || $image_height_old <= 0) return false;
  
$image_aspectratio $image_width_old $image_height_old;

  if (
$scale_mode == 0) {
   
$scale_mode = ($image_aspectratio ? -: -2);
  } elseif (
$scale_mode == 1) {
   
$scale_mode = ($image_aspectratio ? -: -1);
  }

  if (
$scale_mode == -1) {
   
$image_width_new $image_dimension;
   
$image_height_new round($image_dimension $image_aspectratio);
  } elseif (
$scale_mode == -2) {
   
$image_height_new $image_dimension;
   
$image_width_new round($image_dimension $image_aspectratio);
  } else {
   return 
false;
  }

  switch (
$image_filetype) {
   case 
1:
    
$image_old imagecreatefromgif($filepath_old);
    
$image_new imagecreate($image_width_new$image_height_new);
    
imagecopyresampled($image_new$image_old0000$image_width_new$image_height_new$image_width_old$image_height_old);
    
imagegif($image_new$filepath_new);
    break;
 
   case 
2:
    
$image_old imagecreatefromjpeg($filepath_old);
    
$image_new imagecreatetruecolor($image_width_new$image_height_new);
    
imagecopyresampled($image_new$image_old0000$image_width_new$image_height_new$image_width_old$image_height_old);
    
imagejpeg($image_new$filepath_new);
    break;

   case 
3:
    
$image_old imagecreatefrompng($filepath_old);
    
$image_colordepth imagecolorstotal($image_old);

    if (
$image_colordepth == || $image_colordepth 255) {
     
$image_new imagecreatetruecolor($image_width_new$image_height_new);
    } else {
     
$image_new imagecreate($image_width_new$image_height_new);
    }

    
imagealphablending($image_newfalse);
    
imagecopyresampled($image_new$image_old0000$image_width_new$image_height_new$image_width_old$image_height_old);
    
imagesavealpha($image_newtrue);
    
imagepng($image_new$filepath_new);
    break;

   default:
    return 
false;
  }

  
imagedestroy($image_old);
  
imagedestroy($image_new);
  return 
true;
 }

?>


Erläuterungen zum Quellcode
In Zeile 4 wird zunächst überprüft, ob überhaupt eine Datei unter dem angegebenen Dateipfad existiert und ob unter dem neuen Dateipfad nicht schon eine Datei vorhanden ist (diese würde sonst überschrieben). Will man ein Überschreiben zulassen, entfernt man einfach den zweiten Teil der Bedingung.

In den Zeilen 6-9 ermitteln wir die Attribute des Bildes, welches wir anschließend verkleinern resp. vergrößern wollen. In Zeile 11 checken wir noch kurz, ob wir als Breite und Höhe sinnvolle Werte ermitteln konnten (ist die Datei versehentlich gar keine gültige Bilddatei, ist hier 0 zu erwarten, was bei den nachfolgenden Berechnungen zu einer Reihe von Fehlern führen würde. Und schließlich berechnene wir in Zeile 12 das Seitenverhältnis des Bildes (Breite:Höhe).

In den Zeilen 14-18 bestimmen wir abhänging von (positiven) $scale_mode und vom Seitenverhältnis des Bildes, ob wir $image_dimension als neue Breite (-1) oder neue Höhe (-2) auffassen müssen. Dies wird dann in den Zeilen 20-28 umgesetzt, wobei sich der jeweils andere Wert aus einer Berechnung mit $image_aspectratio ergibt. Dieser muss natürlich gerundet werden, da wir keine halben Pixel erzeugen können.

In den Zeilen 30-53 findet dann die eigentliche Verkleinerung des Bildes statt. Das Grundprinzip ist hier jeweils gleich: man erstelle ein Bildobjekt aus der Originaldatei und ein neues, leeres Bildobjekt, man kopiere das Original-Bildobjekt in der Größe angepasst in das neue Bildobjekt und speichere das neue Bildobjekt. Je nach Bildformat gibt es jedoch feine Unterschiede. GIF unterstützt nur 256 Farben, weshalb wir hier per imagecreate nur ein Palettenfarben-Bild erstellen dürfen, im Gegensatz zu JPEG, wo wir mit imagecreatetruecolor ein Echtfarben-Bild erzeugen. Besonders kompliziert wird es bei PNG, da sich dahinter sowohl ein Palettenfarben-Bild, als auch ein Echtfarben-Bild verbergen kann, was wir über die Bestimmung der Farbtiefe auswerten. Wir könnten auch immer ein Echtfarben-Bild erzeugen, welches uns stets optimale Bildqualitäten garantieren würde (bei der Verkleinerung kommen durch Mittelwertbildung häufig zusätzliche Farben dazu für die dann u.U. kein Platz mehr in der Palette ist), doch die Dateigröße schießt dabei in der Regel gigantisch in die Höhe. Außerdem müssen wir noch den Alpha-Kanal in PNG-Bildern berücksichtigen, wenn wir auch Bilder mit transparenten Flächen korrekt verkleinern wollen.

Zuletzt entfernen wir in den Zeilen 65-66 die Bildobjekte aus dem Speicher. Ordnung muss sein. ;)

Anmerkung
Ich habe diese allgemeine Funktion aus einer meiner stärker spezialisierten Funktionen entwickelt und noch nicht selbst getestet. Daher könnten sich noch Schreib- oder Logikfehler in dem Skript befinden. Sollte dir ein solcher Fehler auffallen, wäre ich um eine Rückmeldung dankbar.

Kommentare

Zurück zur Übersicht

Autor Thoro

News
13.08 - » Spam im Gästebuch
Endlich Schluss mit dem Spam

08.12 - » Clanletter 2.0
Clanletter wurde komplett neu programmiert

01.09 - » Command Board 1.0 - 2.0
Das Command Board 1.0 Beta 2.0 ist erschienen


Mehr

Forum
» Entwickler Forum

» insert nach login

» Tabellenzelle zu groß







© PHP-Einfach.de 2003 - 2012