thumb.php
Erstellt ein Miniaturbild von lokalen oder entfernen Bilddateien (inkl. Caching).
- thumb.php
<? /* ################################################################################################## thumb.php written by Heiko Barth :: 2005; improved 2007 www.heiko-barth.de Copyright (c) 2005 Heiko Barth This script is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. USING AT YOUR OWN RISK. ################################################################################################## */ // cache mode settings $cache = true; // true/false --> enable/disable cache mode $cache_dir = "./cache"; // server directory -> must be writeable $cache_web_dir = "/fotos/cache"; // web directory $allow_remote = false; // allow remote located images; when setting true be sure to also set allow_url_fopen=on in your server php.ini $default_width = 160; // define default width $default_height = 120; // define default height // So if there's something you don't like, don't sit on the sidelines. Get involved and reform it. Evolution works better than revolution, after all! // imagecopyresampled can be used instead of imagecopyresized; its a bit slower, but ppl think there are better quality results - not my opinion ;-) // requiered argument $pic = $_REQUEST["pic"]; if (!$allow_remote) { if (preg_match('/^(http|ftp):/i', $pic)) { die("Remote images are not allowed."); } } // optional parameters $maxwidth = (isset($_REQUEST['width']) ? floor($_REQUEST['width']) : $default_width); $maxheight = (isset($_REQUEST['height']) ? floor($_REQUEST['height']) : $default_height); $getimg = @getimagesize($pic); // 0. width // 1. height // 2. typ: 1=GIF, 2=JPEG, 3=PNG // 3. html tag (e.g. 'width="111" height="24"') // preventing from accessing non gfx files. if ($getimg[2] < 1 || $getimg[2] > 3 || $getimg[2] == "") { die("No valid gfx-source."); } $oldwidth = $getimg[0]; $oldheight = $getimg[1]; // if original is smaller then or equal to new image if ($oldwidth <= $maxwidth && $oldheight <= $maxheight) { header("HTTP/1.1 302 Found"); header("Location: " . $pic); } else { // image should be resized $widthdif = $oldwidth / $maxwidth; $heightdif = $oldheight / $maxheight; $maxdif = max($widthdif, $heightdif); $newwidth = floor($oldwidth / $maxdif); $newheight = floor($oldheight / $maxdif); // caching enabled if ($cache) { $char_replace = array(".", "/"); $cache_dir = $cache_dir . "/" . str_replace($char_replace, "", dirname($pic)) . "w" . $newwidth . "h" . $newheight . basename($pic); $cache_web_dir = $cache_web_dir . "/" . str_replace($char_replace, "", dirname($pic)) . "w" . $newwidth . "h" . $newheight . basename($pic); if (file_exists($cache_dir)) { // yeah, cached content header("HTTP/1.1 302 Found"); header("Location: " . $cache_web_dir); die; } } $smallimg = imagecreatetruecolor($newwidth,$newheight); switch ($getimg[2]) { case 1: // gif image $bigimg = imagecreatefromgif($pic); imagecopyresized($smallimg, $bigimg, 0, 0, 0, 0, $newwidth, $newheight, $oldwidth, $oldheight); if ($cache) { imagegif($smallimg, $cache_dir); header("HTTP/1.1 302 Found"); header("Location: " . $cache_web_dir); } else { header("Content-Type: image/gif"); imagegif($smallimg); } break; case 2: // jpg image $bigimg = imagecreatefromjpeg($pic); imagecopyresized($smallimg, $bigimg, 0, 0, 0, 0, $newwidth, $newheight, $oldwidth, $oldheight); if ($cache) { imagejpeg($smallimg, $cache_dir); header("HTTP/1.1 302 Found"); header("Location: " . $cache_web_dir); } else { header("Content-Type: image/jpeg"); imagejpeg($smallimg); } break; case 3: // png image $bigimg = imagecreatefrompng($pic); imagecopyresized($smallimg, $bigimg, 0, 0, 0, 0, $newwidth, $newheight, $oldwidth, $oldheight); if ($cache) { imagepng($smallimg, $cache_dir); header("HTTP/1.1 302 Found"); header("Location: " . $cache_web_dir); } else { header("Content-Type: image/png"); imagepng($smallimg); } break; } }