Thumbnails erstellen mit PHP
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,
Cool, danke!
Carabon
13 Jul 09 at 16:42
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);
}
Business-Development
15 Jan 14 at 13:27