PHP-Einfach.de
  • PHP Tutorial
  • MySQL Tutorial
  • Für Fortgeschrittene
  • Webhosting
  • Forum

Codeschnipsel

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

 
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 <= 0 || $image_height_old <= 0) return false;
  
$image_aspectratio = $image_width_old / $image_height_old;

  if (
$scale_mode == 0) {
   
$scale_mode = ($image_aspectratio > 1 ? -1 : -2);
  } elseif (
$scale_mode == 1) {
   
$scale_mode = ($image_aspectratio > 1 ? -2 : -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_old, 0, 0, 0, 0, $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_old, 0, 0, 0, 0, $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 == 0 || $image_colordepth > 255) {
     
$image_new = imagecreatetruecolor($image_width_new, $image_height_new);
    } else {
     
$image_new = imagecreate($image_width_new, $image_height_new);
    }

    
imagealphablending($image_new, false);
    
imagecopyresampled($image_new, $image_old, 0, 0, 0, 0, $image_width_new, $image_height_new, $image_width_old, $image_height_old);
    
imagesavealpha($image_new, true);
    
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

Autor Thoro

Zurück zur Übersicht
Autor: Nils Reimers
Zurück: URLs im Text identifizieren

Für Fortgeschrittene

  • Objektorientierte Programmierung
  • PHP Sicherheit
  • Script-Beispiele
  • Codeschnipsel
  • Stellenmarkt
Mit freundlicher Unterstützung von:
  • Punkt191 Werbeagentur
  • CasinoAndy Finland
  • Casinoohnelizenz.info
  • Cryptocasinomaster.com
  • CasinoHEX.at
  • inkedin.com

Hoster – Geringste Ausfallzeit

  1. webgo Ø 1 Min.
  2. Linevast Ø 2 Min.
  3. netcup Ø 3 Min.
  4. All-Inkl.com Ø 6 Min.
  5. checkdomain Ø 8 Min.
  6. dogado Ø 17 Min.
  7. bplaced Ø 17 Min.
  8. Contabo Ø 25 Min.
  9. Hetzner Ø 49 Min.
  10. ONE.com Ø 62 Min.
» Mehr erfahren

Impressum | Datenschutz | Auf PHP-Einfach.de werben

© PHP-Einfach.de 2003 - 2023

Cookie-Zustimmung verwalten
Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Anbieter verwalten Lese mehr über diese Zwecke
Einstellungen ansehen
{title} {title} {title}