Dateien hochladen
Dieser erste Teil hat noch nicht unbedingt was mit Bildverarbeitung zu tun, aber meistens kommen die Bilder ja über die PHP-Applikation erst auf den Server.
Um eine Datei auf den Webserver zu laden benötigt man ein Formular, das in seiner einfachsten Form ungefähr so aussehen könnte:
<form name="uploadform" method="post" enctype="multipart/form-data" action="">
<input type="file" name="thefile" />
<input name="thesubmit" type="submit" value="Upload image" />
</form>
Wichtig ist, dass als Methode POST angegeben wird und als MIME-Typ (enctype) multipart/form-data, da der Dateiupload sonst nicht funktioniert.
Im Ziel-Script (das im action-Attribut angegeben werden kann, wenn nichts angegeben wird, wird das selbe Script wieder geladen) kann man nun die hochgeladene Datei überprüfen und in ein Verzeichnis seiner Wahl kopieren:
<?php
//überprüfen, ob das Formular gesendet wurde
if(isset($_POST['thesubmit'])){
//Metadaten, die uns PHP über die Datei liefert ausgeben
echo $_FILES['thefile']['name'] . "<br />";
echo $_FILES['thefile']['type'] . "<br />";
echo $_FILES['thefile']['tmp_name'] . "<br />";
echo $_FILES['thefile']['error'] . "<br />";
echo $_FILES['thefile']['size'] . "<br />";
//überprüfen des MIME-Typs
$mime = $_FILES['thefile']['type'];
if($mime == 'image/gif' || $mime == 'image/jpeg' || $mime == 'image/png'){
//aktueller Pfad und Dateiname des Bildes
$oldfile = $_FILES['thefile']['tmp_name'];
//vorgesehener Pfad und Dateiname des Bildes
$newfile = 'uploads/'.$_FILES['thefile']['name'];
//datei kopieren
move_uploaded_file($oldfile, $newfile);
}
}
?>
Das Bild wird also hochgeladen, überprüft ob es sich um ein Bild handelt, dann wird es aus dem Temporären Verzeichnis in ein beliebiges neues kopiert, in unserem Fall uploads/, mit dem Originalnamen dahinter.
Achtung! Die Überprüfung des MIME-Typs (oder auch der Dateiendung) genügt noch nicht als sichere Überprüfung der Datei. Eine bessere Methode ist, mit den weiter unten vorgestellten Funktionen zu prüfen, ob das Bild tatsächlich eine Höhe und eine Breite hat. Ist auch keine 100% sichere Methode, aber schon mal besser als gar keine.
Auch der Dateiname sollte geändert werden, der Originalname sollte niemals übernommen werden.
Bild von Datei laden
Dafür gibts drei Funktionen für gif, jpeg und png:
- resource imagecreatefromgif ( string $filename )
-
resource imagecreatefromjpeg ( string $filename )
-
resource imagecreatefrompng( string $filename )
Dadurch erhält man einen Zeiger auf die Grafik, z.B.:
$image = imagecreatefrompng( 'einbild.png' );
Daten eines Bildes - Metadaten
Für viele Anwendungen in der Bildverarbeitung ist es wichtig, Daten über das Bild zu erhalten. Dazu gehören unter anderem Höhe, Breite, Typ, Farbtiefe usw. Die gängigste Funktion für diese Metadaten ist getimagesize(). Diese Funktion liefert ein Array mit 7 Elementen, die verschiedene Metainformationen beinhalten.
- Index 0 Breite des Bildes
- Index 1 Höhe des Bildes
- Index 2 ist eine der IMAGETYPE-Konstanten (IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_SWF, IMAGETYPE_PSD, IMAGETYPE_BMP, IMAGETYPE_WBMP, IMAGETYPE_XBM, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM, IMAGETYPE_IFF, IMAGETYPE_JB2, IMAGETYPE_JPC, IMAGETYPE_JP2, IMAGETYPE_JPX, IMAGETYPE_SWC, IMAGETYPE_ICO)
- Index 3 Textstring im Format 'height="yyy" width="xxx"'für ein IMG-Tag.
- Index mime Der MIME Typ des Bildes
- Index channels 3 für RGB und 4 für CMYK Bilder.
- Index bits Die Farbtiefe in Bit pro Farbe .
Größe eines Bildes ändern
Um ein Bild zu skalieren, braucht man mehrere Funktionen, die man am besten in einer Funktion zusammenfasst:
public static function scaleImage($image, $maxwidth, $maxheight){
list($image_width, $image_height) = getimagesize($file);
if($image_width > $image_height){
$new_image_width = $maxwidth;
$new_image_height = $image_height*($maxheight/$image_height);
}else{
$new_image_height = $maxheight;
$new_image_width = $image_width * ($maxwidth/$image_width);
}
$new_image = imagecreatetruecolor(round($new_image_width),
round($new_image_height));
imagecopyresized($new_image, $image, 0, 0, 0, 0, $new_image_width,
$new_image_height, $image_width, $image_height);
return $new_image;
}
Die Funktion nimmt als Parameter einen Zeiger und die gewünschte maximale Breite und maxiamle Höhe entgegen. Je nachdem, ob Höhe oder Breite größer ist, wird dann der andere Wert berechnet.
Danach wird ein neues Bild mit der berchneten Größe erstellt.
Schlußendlich kopiert die Funktion imagecopyresized() das alte Bild in das neue Bild.
Die verwendeten Funktionen:
resource imagecreatetruecolor ( int $width , int $height )
bool imagecopyresized ($to, $from, $to_x, $to_y, $from_x, $from_y, $to_w, $to_h, $from_w, $from_h)
Bild speichern bzw. ausgeben
Um ein Bild zu speichern oder im Dokument auszugeben gibt es wieder für jedes Format die entsprechenden Funktionen:
bool imagegif ( resource $image [, string $filename ] )
bool imagejpeg ( resource $image [, string $filename [, int $quality ]] )
bool imagepng ( resource $image [, string $filename [, int $quality [, int $filters ]]] )
Das Bild wird einfach im Skript ausgegeben, wenn kein Dateiname angegeben ist.
Die Qualität wird für JPEGs von 0-100 und bei PNGs von 0-9 angegeben.
$filters kann eine der Konstanten PNG_NO_FILTER, PNG_FILTER_NONE, PNG_FILTER_SUB , PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH oder PNG_ALL_FILTERS sein.
Neues, leeres Bild erstellen
Das geschieht durch die Funktion
resource imagecreate ( int $width , int $height )
Einfach Breite und Höhe angeben und den zurückgegebenen Zeiger in einer Variable speichern.
Farben definieren
Zu Beginn ist die Farbpalette des Bildes leer, das heißt man muss jede neue Farbe vor jeder Operation definieren:
int imagecolorallocate ( resource $image , int $red , int $green , int $blue )
Also z.B.:
$white = imageColorAllocate($image, 255, 255, 255)
Diese Farbe kann dann manchen Funktionen mitgegeben werden.
Außerdem legt der erste Aufruf der Funktion den Hintergrund der Grafik fest, außer sie wurde mittels imagecreatetruecolor() erstellt.
Ausschnitt eines Bildes in ein anderes kopieren
bool imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )
Text einfügen
Zeichenketten kann man mithilfe der Funktion
bool imagestring ( resource $image , int $font , int $x , int $y , string $string , int $color )
ausgeben, wobei die Parameter für das Bild, die Schriftart (1-5), die Position, die auszugebende Zeichenkette und die Farbe stehen.
Für weitere Schriftarten siehe die Funktion
int imageloadfont ( string $file )
Zeichnen
Man kann in ein Bild verschiedene Formen zeichnen, dafür gibt’s unter anderem die folgenden Funktionen:
bool imagesetpixel ( resource $image , int $x , int $y , int $color )
bool imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
bool imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
bool imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 ,int $color )
bool imageellipse ( resource $image , int $cx , int $cy , int $width , int $height , int $color )
bool imagefilledellipse ( resource $image , int $cx , int $cy , int $width , int $height, int $color )
bool imagearc ( resource $image , int $cx , int $cy , int $width , int $height , int $start , int $end , int $color )
bool imagepolygon ( resource $image , array $points , int $num_points , int $color )