PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Thumbnails erstellen mit PHP

with 2 comments

Da es im Zend Framework keine schöne Klasse für diese Aufgabe gibt (Zend_Image gab es mal als Proposal, wurde aber abgelehnt), muss man anderweitig eine Lösung finden.

Ich habe dazu eine uralte Funktion, die aber nach wie vor fabelhaft funktioniert. Man übergibt einfach nur den Pfad zur Quelldatei (häufig ist das eine hochgeladene Datei, es kann sowohl ein jpg als auch ein gif sein), ein Zielverzeichnis (häufig ein Ordner im webroot), sowie Informationen über die Zieldatei: Dateiname, Endung, maximale Höhe und Breite.

Ein Beispiel würde so aussehen:

Util::createThumbnailAndSave($_FILES['uploadfile']['tmp_name'], 'images/uploads', $_FILES['uploadfile']['name'], 'jpg', 250, 250)

Danach schreibt man die Informationen über die Datei natürlich noch in eine Datenbank, damit man sie auf der Webseite einbinden kann.

Und natürlich möchte ich euch meine kleine Funktion nicht vorenthalten. Es wird kein Imagick benötigt, sondern nur eine „normale“ PHP-Installation incl. aktivierten GD-Funktionen.

public static function createThumbnailAndSave($filePath, $targetDir, $targetFilename, $targetExtension, $targetWidth, $targetHeight)
{
	$imageinfo = getimagesize($filePath);

	// check if source image is smaller than target dimensions
	if ($imageinfo[0] > $targetWidth || $imageinfo[1] > $targetHeight)
	{
		if ($imageinfo[2] == 1) {       // GIF
			$srcImg = imagecreatefromgif($filePath);
		}
		elseif ($imageinfo[2] == 2) {   // JPG
			$srcImg = imagecreatefromjpeg($filePath);
		}
		$widthDivisor = $imageinfo[0] / $targetWidth;
		$heightDivisor = $imageinfo[1] / $targetHeight;
		if ($widthDivisor > $heightDivisor)
		{
			$dstImg = imagecreatetruecolor($targetWidth, $imageinfo[1] / $widthDivisor);
		}
		else
		{
			$dstImg = imagecreatetruecolor($imageinfo[0] / $heightDivisor, $targetHeight);
		}
              
		imagecopyresampled($dstImg, $srcImg, 0, 0, 0, 0, imagesx($dstImg), imagesy($dstImg), imagesx($srcImg), imagesy($srcImg));

		// Save to harddisc and delete from RAM
		imagejpeg($dstImg, $targetDir . "/" . $targetFilename . "." . $targetExtension, 95);
		$fsize = filesize($targetDir . "/" . $targetFilename . "." . $targetExtension);
		if ($fsize > 50000)
		{
			imagejpeg($dstImg, $targetDir . "/" . $targetFilename . "." . $targetExtension, 60);
		}
		imagedestroy($dstImg);
		imagedestroy($srcImg);
	}
	else {
		copy($filePath, $targetDir . "/" . $targetFilename . "." . $targetExtension);
	}
	chmod($targetDir . "/" . $targetFilename . "." . $targetExtension, 0777);
}

Eigentlich könnte ich sie mal auf Aktualität überprüfen, heutzutage würde ich sie wahrscheinlich auch etwas anders schreiben. Aber für meine paar kleinen privaten Homepages reicht es. Alternativen sind natürlich fertige Klassen von phpclasses.org etc,

Written by Michael Kliewe

Juni 28th, 2009 at 10:36 pm

Posted in PHP

Tagged with , , ,

2 Responses to 'Thumbnails erstellen mit PHP'

Subscribe to comments with RSS or TrackBack to 'Thumbnails erstellen mit PHP'.

  1. Cool, danke!

    Carabon

    13 Jul 09 at 16:42

  2. Hier das ganze etwas erweitert 😉

    function createThumbnailAndSave($filePath, $targetDir, $targetFilename, $targetExtension, $targetWidth, $targetHeight) {
    $imageinfo = getimagesize($filePath);
    ini_set(‚memory_limit‘, round($imageinfo[0]*$imageinfo[1]/100000,0).’M‘);
    if ($imageinfo[0] > $targetWidth || $imageinfo[1] > $targetHeight) {
    if ($imageinfo[2] == 1) {
    $srcImg = imagecreatefromgif($filePath);
    }elseif ($imageinfo[2] == 2) {
    $srcImg = imagecreatefromjpeg($filePath);
    }elseif ($imageinfo[2] == 3) {
    $srcImg = imagecreatefrompng($filePath);
    }
    $widthDivisor = $imageinfo[0] / $targetWidth;
    $heightDivisor = $imageinfo[1] / $targetHeight;
    if ($widthDivisor > $heightDivisor) {
    $dstImg = @imagecreatetruecolor($targetWidth, $imageinfo[1] / $widthDivisor) or die(‚Cannot Initialize new GD image stream‘);;
    } else {
    $dstImg = @imagecreatetruecolor($imageinfo[0] / $heightDivisor, $targetHeight) or die(‚Cannot Initialize new GD image stream‘);;
    }
    imagecopyresampled($dstImg, $srcImg, 0, 0, 0, 0, imagesx($dstImg), imagesy($dstImg), imagesx($srcImg), imagesy($srcImg));
    if ($targetExtension == ‚jpg‘) {
    imagejpeg($dstImg, $targetDir . „/“ . $targetFilename . „.“ . $targetExtension, 95);
    $fsize = filesize($targetDir . „/“ . $targetFilename . „.“ . $targetExtension);
    if ($fsize > 50000) {
    imagejpeg($dstImg, $targetDir . „/“ . $targetFilename . „.“ . $targetExtension, 60);
    }
    }elseif ($targetExtension == ‚png‘) {
    imagealphablending($dstImg, false);
    $colorTransparent = imagecolorallocatealpha($dstImg, 0, 0, 0, 127);
    imagefill($dstImg, 0, 0, $colorTransparent);
    imagesavealpha($dstImg, true);

    $pngQuality = round(abs((95 – 100) / 11.111111));// 95 %
    imagepng($dstImg, $targetDir . „/“ . $targetFilename . „.“ . $targetExtension, $pngQuality);
    $fsize = filesize($targetDir . „/“ . $targetFilename . „.“ . $targetExtension);
    if ($fsize > 50000) {
    $pngQuality = round(abs((60 – 100) / 11.111111)); // 60 %
    imagepng($dstImg, $targetDir . „/“ . $targetFilename . „.“ . $targetExtension, $pngQuality);
    }
    }elseif ($targetExtension == ‚gif‘) {
    $colourBlack = imagecolorallocate($dstImg,0,0,0);
    imagefill($dstImg,0,0,$colourBlack );
    imagecolortransparent($dstImg,$colourBlack );
    imagegif($dstImg, $targetDir . „/“ . $targetFilename . „.“ . $targetExtension);
    }
    imagedestroy($dstImg);
    imagedestroy($srcImg);
    } else {
    copy($filePath, $targetDir . „/“ . $targetFilename . „.“ . $targetExtension);
    }
    chmod($targetDir . „/“ . $targetFilename . „.“ . $targetExtension, 0777);
    }

Leave a Reply

You can add images to your comment by clicking here.