Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Bild verkleinern (JPEG/PNG/GIF)    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag
Thoro
Mitglied
Exzellenter User


Dabei seit: 29.09.2008
Herkunft: keine Angabe
Posts: 1126
     Bild verkleinern (JPEG/PNG/GIF) Zitat | Bearbeiten

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.


Leidenschaftlicher Rechtschreibfehler-Sammler sucht mehrere Lagerhallen zwecks Erweiterung der Sammlung. Bis zur Vergrößerung der Lagerkapazitäten bitte möglichst keine Rechtschreibfehler mehr posten. Danke.

Post wurde schon 1x editiert, das letzte mal am 04.10.2008 um 19:13 von Andavos
04.10.2008, 13:44 Profil | PM | Homepage | E-Mail  
Gast


      Zitat | Bearbeiten

Wieso funktioniert das nicht?
Ich verzweifle echt noch.??!!!


10.07.2011, 12:55  
Gast


      Zitat | Bearbeiten

Wahrscheinlich hast du vergessen, den Bildpfad der Datei die du hochlädst korrekt anzugeben.

Füge am ganz am Anfang der Funktion einfach folgenden Befehl hinzu:

move_uploaded_file($_FILES['bild']['tmp_name'], $filepath_old);

vor dem Funktionsaufruf musst du natürlich alle Variablen definieren.

$filepath_old = Ort, wo du die unskallierte Datei abspeichern möchtest!

Bei mir hats so wunderbar geklappt!

LG


13.07.2011, 16:18  
Gast


      Zitat | Bearbeiten

Vieln Dank. Hat mir ne Menge Arbeit erspart!


04.08.2011, 13:43  
Gast


     Bild verkleinern (JPEG/PNG/GIF) Zitat | Bearbeiten

Hallo Leute.

Also ich bekomms einfach nicht hin.
Ich rufe die Funktion wie folgt auf:

 PHP 
1:
resizeImage ("./fileold/", "./filenew/", 0);


und nichts passiert.
Kann mir da vielleicht mal einer ein Beispiel geben, wie man den Code verwendet?



30.11.2011, 12:58  
FalkenaugeMihawk
Mitglied
Perfekter User


Dabei seit: 05.06.2010
Herkunft: Schweiz
Posts: 2619
      Zitat | Bearbeiten

 PHP 
1:
resizeImage('bild.png', 'bild2.png', 50,  0);





Post wurde schon 1x editiert, das letzte mal am 30.11.2011 um 13:44 von FalkenaugeMihawk
30.11.2011, 13:43 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Oh, super! Danke für die schnelle Antwort.
Mann bin ich blöd! Das test ich dann gleich.


30.11.2011, 14:31  
micha67
Mitglied
Neuling


Dabei seit: 19.08.2014
Herkunft: keine Angabe
Posts: 1
      Zitat | Bearbeiten

Hallo,

ich hoffe mir kann hier jemand helfen.

Ich komme mit diesem Script nicht klar.

Über

function resizeImage................

habe ich folgendes hinzugefügt:

$filepath_old = "bilder/";


$filepath_new = "bilder/thumbnails";

und dann unter

..........
return false;
}

 PHP 
1:
resizeImage('bild1.jpg', 'tn_bild2.jpg', 50,  0);


Doch leider passiert da nix :-(

Hat jemand noch einen Tipp parat?

Und dann noch etwas was eigentlich nicht hier rein gehört:

 PHP 
1:
2:
3:
if(!empty($row->age)){ // sofern alter angegeben
echo "$lang['alter'];: ".$row->age."<br>\n";           
}


Was ist daran falsch das eine Fehlermeldung rauskommt? Ich habe schon alles rumprobiert und bin am verzweifeln.

Vielen Dank!

Grüße, Micha




Post wurde schon 1x editiert, das letzte mal am 19.08.2014 um 12:41 von micha67
19.08.2014, 11:36 Profil | PM | E-Mail  
Seiten (1):  1 
PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Bild verkleinern (JPEG/PNG/GIF)   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz