*/ // error_reporting(E_ALL); error_reporting(0); /* if (preg_match("/.jpg$|.jpeg$/i", $_GET['filename'])) header('Content-type: image/jpeg'); if (preg_match("/.gif$/i", $_GET['filename'])) header('Content-type: image/gif'); if (preg_match("/.png$/i", $_GET['filename'])) header('Content-type: image/png'); */ // flip functions from http://stackoverflow.com/questions/8232722/how-to-flip-part-of-an-image-horizontal-with-php-gd function flipVertical(&$img) { $size_x = imagesx($img); $size_y = imagesy($img); $temp = imagecreatetruecolor($size_x, $size_y); $x = imagecopyresampled($temp, $img, 0, 0, 0, ($size_y-1), $size_x, $size_y, $size_x, 0-$size_y); if ($x) { $img = $temp; } else { die("Unable to flip image"); } } function flipHorizontal(&$img) { $size_x = imagesx($img); $size_y = imagesy($img); $temp = imagecreatetruecolor($size_x, $size_y); $x = imagecopyresampled($temp, $img, 0, 0, ($size_x-1), 0, $size_x, $size_y, 0-$size_x, $size_y); if ($x) { $img = $temp; } else { die("Unable to flip image"); } } function str_split_php4( $text, $split = 1 ) { // place each character of the string into and array $array = array(); for ( $i=0; $i < strlen( $text ); ) { $key = NULL; for ( $j = 0; $j < $split; $j++, $i++ ) { $key .= $text[$i]; } array_push( $array, $key ); } return $array; } function sanitize($name) { // Sanitize image filename (taken from http://iamcam.wordpress.com/2007/03/20/clean-file-names-using-php-preg_replace/ ) $fname=$name; $replace="_"; $pattern="/([[:alnum:]_\.-]*)/"; $fname=str_replace(str_split_php4(preg_replace($pattern,$replace,$fname)),$replace,$fname); return $fname; } // Make sure the "thumbs" directory exists. if (!is_dir('thumbs') && is_writable('.')) { mkdir('thumbs',0700); } // Thumbnail file name and path. // (We always put thumbnails in jpg for simplification) $thumbname = 'thumbs/'.sanitize($_GET['filename']).'.jpg'; if (file_exists($thumbname))// If thumbnail exists, serve it. { $fd = fopen($thumbname, "r"); $cacheContent = fread($fd,filesize ($thumbname)); fclose($fd); header('Content-type: image/jpeg'); echo($cacheContent); } else // otherwise, generate thumbnail, send it and save it to file. { // Display error image if file isn't found if (!is_file($_GET['filename'])) { header('Content-type: image/jpeg'); $errorimage = ImageCreateFromJPEG('images/questionmark.jpg'); ImageJPEG($errorimage,null,90); } // Display error image if file exists, but can't be opened if (substr(decoct(fileperms($_GET['filename'])), -1, strlen(fileperms($_GET['filename']))) < 4 OR substr(decoct(fileperms($_GET['filename'])), -3,1) < 4) { header('Content-type: image/jpeg'); $errorimage = ImageCreateFromJPEG('images/cannotopen.jpg'); ImageJPEG($errorimage,null,90); } // Define variables $target = ""; $xoord = 0; $yoord = 0; if ($_GET['size'] == "") { $_GET['size'] = 120; } $imgsize = GetImageSize($_GET['filename']); $width = $imgsize[0]; $height = $imgsize[1]; if ($width > $height) // If the width is greater than the height it’s a horizontal picture { $xoord = ceil(($width-$height)/2); $width = $height; // Then we read a square frame that equals the width } else { $yoord = ceil(($height-$width)/2); $height = $width; } $degrees = 0; $flip = ''; // Rotate JPG pictures if (preg_match("/.jpg$|.jpeg$/i", $_GET['filename'])) { if (function_exists('exif_read_data') && function_exists('imagerotate')) { $exif = exif_read_data($_GET['filename'], 0, true); if (isset($exif['IFD0']) && isset($exif['IFD0']['Orientation'])) $ort = $exif['IFD0']['Orientation']; else $ort = 0; switch($ort) { case 3: // 180 rotate right $degrees = 180; break; case 6: // 90 rotate right $degrees = 270; break; case 8: // 90 rotate left $degrees = 90; break; case 2: // flip vertical $flip = 'vertical'; break; // see http://www.daveperrett.com/articles/2012/07/28/exif-orientation-handling-is-a-ghetto/ for more info on orientation case 7: // flipped $degrees = 90; $flip = 'vertical'; break; case 5: // flipped $degrees = 270; $flip = 'vertical'; break; case 4: // flipped $degrees = 180; $flip = 'vertical'; break; } } } $target = ImageCreatetruecolor($_GET['size'],$_GET['size']); //if the picture can be transparent, add a white background instead a black if (preg_match("/.gif$/i", $_GET['filename']) || preg_match("/.png$/i", $_GET['filename'])) { $backgroundColor = imagecolorallocate($target, 255, 255, 255); imagefill($target, 0, 0, $backgroundColor); } if (preg_match("/.jpg$/i", $_GET['filename'])) $source = ImageCreateFromJPEG($_GET['filename']); if (preg_match("/.gif$/i", $_GET['filename'])) $source = ImageCreateFromGIF($_GET['filename']); if (preg_match("/.png$/i", $_GET['filename'])) $source = ImageCreateFromPNG($_GET['filename']); imagecopyresampled($target,$source,0,0,$xoord,$yoord,$_GET['size'],$_GET['size'],$width,$height); imagedestroy($source); //if (preg_match("/.jpg$/i", $_GET['filename'])) ImageJPEG($target,null,90); //if (preg_match("/.gif$/i", $_GET['filename'])) ImageGIF($target,null,90); //if (preg_match("/.png$/i", $_GET['filename'])) ImageJPEG($target,null,90); // Using ImageJPEG on purpose //proper rotation by jan niggemann if ($degrees != 0) { $target = imagerotate($target, $degrees, 0); } ob_start(); // Start output buffering. header('Content-type: image/jpeg'); // We always render the thumbnail in JPEG even if the source is GIF or PNG. //proper mirror (aka flip) by jan niggemann if ($flip == 'vertical') { //only in php >= 5.5.0 ImageJPEG(imageflip($target, IMG_FLIP_VERTICAL),null,80); flipVertical($target); flipHorizontal($target); flipVertical($target); } ImageJPEG($target,null,80); imagedestroy($target); $cachedImage = ob_get_contents(); // Get the buffer content. ob_end_flush();// End buffering if (is_writable(dirname($thumbname))) { $fd = fopen($thumbname, "w"); // Save buffer to disk if ($fd) { fwrite($fd,$cachedImage); fclose($fd); } } } ?>