http://www.php.net/manual/de/ref.fileinfo.php
require_once("Config.inc.php");
require_once("Functions.inc.php");
require_once("Connection.inc.php");
//require_once("HashImage.inc.php");
//require_once("SimpleImage.inc.php");
class Image {
/* helper function: Send headers and returns an image. */
public function sendImage($filename, $browser_cache) {
$func = new Functions();
$imageRetArray = $func->getScreenResolutionFromUA();
$resolutions = array(2000, 1440, 1024, 1382, 960, 760, 480, 320); // the resolution break-points to use (screen widths, in pixels)
$jpg_quality = $imageRetArray["picQuality"]; // the quality of any generated JPGs on a scale of 0 to 100
//$sharpen = TRUE; // Shrinking images can blur details, perform a sharpen on re-scaled images?
//$watch_cache = TRUE; // check that the adapted image isn't stale (ensures updated source images are re-cached)
$browser_cache = 31536000; // How long the BROWSER cache should last (seconds, minutes, hours, days. 7days by default)
$myfilemtime = filemtime($filename);
$headers = $func->request_headers();
$image_mime = image_type_to_mime_type(exif_imagetype($filename));
$list = explode("/", $image_mime);
$extension = $list[1];
//$extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
if (in_array($extension, array('png', 'gif', 'jpeg'))) {
header("Content-Type: image/".$extension);
} else {
header("Content-Type: image/jpeg");
}
header("Cache-Control: private, max-age=".$browser_cache);
header('Expires: '.gmdate('D, d M Y H:i:s', time()+$browser_cache).' GMT');
header('Content-Length: '.filesize($filename));
// Checking if the client is validating his cache and if it is current.
if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == $myfilemtime)) {
// Client's cache IS current, so we just respond '304 Not Modified'.
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $myfilemtime).' GMT', true, 304);
} else {
// Image not cached or cache outdated, we respond '200 OK' and output the image.
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $myfilemtime).' GMT', true, 200);
//header('Content-Length: '.filesize($fn));
}
readfile($filename);
exit();
}
/* sharpen images function */
public function findSharp($intOrig, $intFinal) {
$intFinal = $intFinal * (750.0 / $intOrig);
$intA = 52;
$intB = -0.27810650887573124;
$intC = .00047337278106508946;
$intRes = $intA + $intB * $intFinal + $intC * $intFinal * $intFinal;
return max(round($intRes), 0);
}
/* refreshes the cached image if it's outdated */
public function refreshCache($source_file, $cache_file, $resolution) {
if (file_exists($cache_file)) {
// not modified
if (filemtime($cache_file) >= filemtime($source_file)) {
return $cache_file;
}
// modified, clear it
unlink($cache_file);
}
return $this->generateImage($source_file, $cache_file, $resolution, 65);
}
/* generates the given cache file for the given source file with the given resolution */
public function generateImage($source_file, $cache_file, $resolution, $quality) {
$func = new Functions();
$imageRetArray = $func->getScreenResolutionFromUA();
$resolutions = array(2000, 1440, 1024, 1382, 960, 760, 480, 320); // the resolution break-points to use (screen widths, in pixels)
$jpg_quality = $imageRetArray["picQuality"]; // the quality of any generated JPGs on a scale of 0 to 100
$sharpen = TRUE; // Shrinking images can blur details, perform a sharpen on re-scaled images?
$watch_cache = TRUE; // check that the adapted image isn't stale (ensures updated source images are re-cached)
$browser_cache = 31536000; // How long the BROWSER cache should last (seconds, minutes, hours, days. 7days by default)
$image_mime = image_type_to_mime_type(exif_imagetype($source_file));
$list = explode("/", $image_mime);
$extension = $list[1];
//echo "mime: $image_mime"; exit;
//$extension = strtolower(pathinfo($source_file, PATHINFO_EXTENSION));
// Check the image dimensions
$dimensions = getimagesize($source_file);
$width = $dimensions[0];
$height = $dimensions[1];
// We need to resize the source image to the width of the resolution breakpoint we're working with
$ratio = $height/$width;
$new_width = $resolution;
$new_height = ceil($new_width * $ratio);
$dst = ImageCreateTrueColor($new_width, $new_height); // re-sized image
/*
if (strstr($_SERVER['HTTP_USER_AGENT'], "Google") !== false){
$dst = ImageCreateTrueColor(640, 480); // re-sized image
$sharpen = FALSE;
} else {
$dst = ImageCreateTrueColor($new_width, $new_height); // re-sized image
}
*/
switch ($extension) {
case 'png':
$src = @ImageCreateFromPng($source_file); // original image
break;
case 'gif':
$src = @ImageCreateFromGif($source_file); // original image
break;
default:
$src = @ImageCreateFromJpeg($source_file); // original image
ImageInterlace($dst, true); // Enable interlancing (progressive JPG, smaller size file)
break;
}
if($extension=='png'){
imagealphablending($dst, false);
imagesavealpha($dst,true);
$transparent = imagecolorallocatealpha($dst, 255, 255, 255, 127);
imagefilledrectangle($dst, 0, 0, $new_width, $new_height, $transparent);
}
$textinfo = "Coole News gibts auf BuzzerStar.com";
// $img->text($textinfo,"./library/fonts/delicious.ttf", $fontsize, '#000000', 'bottom left', 0, -10);
//imagettftext($this->image, $font_size, $angle, $x, $y, $color, $font_file, $text);
// imagettftext($dst, 12, 1, 0,-10, "./library/fonts/delicious.ttf", $angle, $x, $y, $color, $font_file, $text);
ImageCopyResampled($dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height); // do the resize in memory
ImageDestroy($src);
// sharpen the image?
// NOTE: requires PHP compiled with the bundled version of GD (see http://php.net/manual/en/function.imageconvolution.php)
if($sharpen == TRUE && function_exists('imageconvolution')) {
$intSharpness = $this->findSharp($width, $new_width);
$arrMatrix = array(
array(-1, -2, -1),
array(-2, $intSharpness + 12, -2),
array(-1, -2, -1)
);
imageconvolution($dst, $arrMatrix, $intSharpness, 0);
}
$cache_dir = dirname($cache_file);
//echo "cachedir=$cache_dir";
// does the directory exist already?
if (!is_dir($cache_dir)) {
if (!mkdir($cache_dir, 0755, true)) {
// echo "cache dir check !mkdir"; exit;
// check again if it really doesn't exist to protect against race conditions
if (!is_dir($cache_dir)) {
// uh-oh, failed to make that directory
ImageDestroy($dst);
//echo("Failed to create cache directory: $cache_dir");
}
}
}
// if (!is_writable($cache_dir)) {
// echo("The cache directory is not writable: $cache_dir");
// }
// save the new file in the appropriate path, and send a version to the browser
switch ($extension) {
case 'png':
$gotSaved = ImagePng($dst, $cache_file);
break;
case 'gif':
$gotSaved = ImageGif($dst, $cache_file);
break;
default:
$gotSaved = ImageJpeg($dst, $cache_file, $jpg_quality);
break;
}
ImageDestroy($dst);
/*
$func = new Functions();
$imageRetArray = $func->getScreenResolutionFromUA();
$x = $imageRetArray["x"];
$y = $imageRetArray["y"];
$thumb = new Imagick();
$thumb->readImage($cache_file);
// $thumb->resizeImage($x,$y,Imagick::FILTER_CATROM,0,TRUE);
$thumb->adaptiveResizeImage($x,$y,TRUE);
$thumb->writeImage($cache_file);
$thumb->destroy();
*/
// if (!$gotSaved && !file_exists($cache_file)) {
// echo("Failed to create image: $cache_file"); exit;
// }
// Do we need to downscale the image?
if ($width <= $resolution) { // no, because the width of the source image is already less than the client width
return $source_file;
}
return $cache_file;
}
public function downloadPictureExtra($pictureUri, $lang, $pic_desc, $pic_shortcode ){
define("FILE_PUT_CONTENTS_ATOMIC_TEMP", "/tmp"); // dirname(__FILE__)."/cache");
define("FILE_PUT_CONTENTS_ATOMIC_MODE", 0777);
$config = new Config();
$func = new Functions();
$conn = new Connection();
$pdo = $conn->prepareQuery();
if (!is_dir(FILE_PUT_CONTENTS_ATOMIC_TEMP)) {
mkdir( FILE_PUT_CONTENTS_ATOMIC_TEMP, FILE_PUT_CONTENTS_ATOMIC_MODE, true );
}
$temp = tempnam(FILE_PUT_CONTENTS_ATOMIC_TEMP, 'temp');
if (!($f = @fopen($temp, 'w'))) {
$temp = FILE_PUT_CONTENTS_ATOMIC_TEMP . DIRECTORY_SEPARATOR . uniqid('temp');
if (!($f = @fopen($temp, 'w'))) {
trigger_error("file_put_contents_atomic() : error writing temporary file '$temp'", E_USER_WARNING);
return false;
}
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
//curl_setopt($ch,CURLOPT_SSLVERSION,3);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $pictureUri);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FILE, $f);
curl_exec($ch);
/* if(curl_errno($ch)){
echo 'Class Image - Line 54 -> error:' . curl_error($ch);
echo "Error Downloading : ^$pictureUri^
";
}
*/
curl_close($ch);
fclose($f);
$pictureExtension = pathinfo($pictureUri, PATHINFO_EXTENSION);
$pictureId = $func->randomString();
$pictureStorepath = $config->picture_storepath();
$newPicture = $pictureId.".".$pictureExtension;
$filename = "$pictureStorepath/$newPicture";
if (!rename($temp, $filename)) {
unlink($filename);
rename($temp, $filename);
}
chmod($filename, FILE_PUT_CONTENTS_ATOMIC_MODE);
$pos = stripos($lang, 'de');
if ($pos === false) {
// english table
//$table = $config->sql_tablename_publish_en();
$table = $config->sql_tablename_publish_de();
} else {
// deutsch table
$table = $config->sql_tablename_publish_de();
}
if (empty($pic_desc)){
$title = "Ein cooles Bild aus dem Internet, schau es dir hier an. Du kannst es downloaden, teilen und ausdrucken.";
} else {
$title = $pic_desc;
}
$writePictureSqlCode = array(':p_title' => $title, ':p_filename' => $newPicture,':p_shortcode' => $pic_shortcode,':p_uri' =>$pictureUri,':p_hash' => $pictureId);
$picttable = $config->sql_tablename_pictures();
$conn->insertPicture($pdo,$picttable,$writePictureSqlCode);
//echo "stored as: $filename
";
return 1;
}
public function downloadPicture($pictureUri, $lang){
define("FILE_PUT_CONTENTS_ATOMIC_TEMP", "/tmp");
define("FILE_PUT_CONTENTS_ATOMIC_MODE", 0777);
$config = new Config();
$func = new Functions();
$conn = new Connection();
$pdo = $conn->prepareQuery();
if (!is_dir(FILE_PUT_CONTENTS_ATOMIC_TEMP)) {
mkdir( FILE_PUT_CONTENTS_ATOMIC_TEMP, FILE_PUT_CONTENTS_ATOMIC_MODE, true );
}
$temp = tempnam(FILE_PUT_CONTENTS_ATOMIC_TEMP, 'temp');
if (!($f = @fopen($temp, 'w'))) {
$temp = FILE_PUT_CONTENTS_ATOMIC_TEMP . DIRECTORY_SEPARATOR . uniqid('temp');
if (!($f = @fopen($temp, 'w'))) {
trigger_error("file_put_contents_atomic() : error writing temporary file '$temp'", E_USER_WARNING);
return false;
}
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
//curl_setopt($ch,CURLOPT_SSLVERSION,3);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $pictureUri);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FILE, $f);
curl_exec($ch);
/* if(curl_errno($ch)){
echo 'Class Image - Line 54 -> error:' . curl_error($ch);
echo "Error Downloading : ^$pictureUri^
";
}
*/
curl_close($ch);
fclose($f);
$pictureExtension = pathinfo($pictureUri, PATHINFO_EXTENSION);
$pictureId = $func->randomString();
$pictureStorepath = $config->picture_storepath();
$newPicture = $pictureId.".".$pictureExtension;
$filename = "$pictureStorepath/$newPicture";
if (!rename($temp, $filename)) {
unlink($filename);
rename($temp, $filename);
}
chmod($filename, FILE_PUT_CONTENTS_ATOMIC_MODE);
$pos = stripos($lang, 'de');
if ($pos === false) {
// english table
//$table = $config->sql_tablename_publish_en();
$table = $config->sql_tablename_publish_de();
} else {
// deutsch table
$table = $config->sql_tablename_publish_de();
}
$stmt = $pdo->prepare("SELECT p_picture_1_description,p_shortcode FROM $table WHERE p_picture1=:picture LIMIT 1");
$stmt->bindValue(':picture', $pictureUri, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// DEBUG: print_r($stmt->errorInfo());
if (empty($rows[0]["p_picture_1_description"])){
$title = "Ein cooles Bild aus dem Internet, schau es dir hier an. Du kannst es downloaden, teilen und ausdrucken.";
} else {
$title = $rows[0]["p_picture_1_description"];
}
$writePictureSqlCode = array(':p_title' => $title, ':p_filename' => $newPicture,':p_shortcode' => $rows[0]["p_shortcode"],':p_uri' => $pictureUri,':p_hash' => $pictureId);
$picttable = $config->sql_tablename_pictures();
$conn->insertPicture($pdo,$picttable,$writePictureSqlCode);
return 1;
}
public function checkHeader($pictureUri){
/*
// is cURL installed yet?
if (!function_exists('curl_init')){
die('Sorry cURL is not installed!');
}
*/
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
//curl_setopt($ch,CURLOPT_SSLVERSION,3);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $pictureUri);
curl_setopt($ch, CURLOPT_TIMEOUT,1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,1);
//curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
$content = curl_exec ($ch);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
curl_close($ch);
//echo "pictureUri=$pictureUri;contentType=$contentType
";
//$matches = preg_grep ('/image/i', $contentType);
$pos = stripos($contentType, 'image');
if ($pos === false) {
return 0;
} else {
return 1;
}
}
public function getExtension($pictureUri){
$imageArray = array ( 'gif', 'jpeg', 'png','swf','psd','bmp','tiff', 'tiff','jpc','jp2','jpf','jb2','swc','aiff','wbmp','xbm');
$path_info = pathinfo($pictureUri);
return trim(strtolower($path_info['extension'])); // "bill"
}
public function checkExtension($pictureUri){
$imageArray = array ( 'gif', 'jpeg', 'png','swf','psd','bmp','tiff', 'tiff','jpc','jp2','jpf','jb2','swc','aiff','wbmp','xbm');
$path_info = pathinfo($pictureUri);
$ext = trim(strtolower($path_info['extension'])); // "bill"
// echo "extension=$key und $ext
";
if (in_array($ext, $imageArray)){
return 1;
} else {
return 0;
}
}
public function text($text, $font_file, $font_size, $color, $position, $x_offset = 0, $y_offset = 0, $filename) {
$extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
switch (strtolower($extension)) {
case 'gif':
$image = imagecreatefromgif($filename);
break;
case 'jpeg':
$image = imagecreatefromjpeg($filename);
break;
case 'png':
$image = imagecreatefrompng($filename);
break;
default:
throw new Exception('Invalid image: '.$this->filename);
break;
}
// todo - this method could be improved to support the text angle
$angle = 0;
// Determine text color
$rgba = $this->normalize_color($color);
$color = imagecolorallocatealpha($image, $rgba['r'], $rgba['g'], $rgba['b'], $rgba['a']);
// Determine textbox size
$box = imagettfbbox($font_size, $angle, $font_file, $text);
if (!$box) {
throw new Exception('Unable to load font: '.$font_file);
}
$box_width = abs($box[6] - $box[2]);
$box_height = abs($box[7] - $box[1]);
// Determine position
switch (strtolower($position)) {
case 'top left':
$x = 0 + $x_offset;
$y = 0 + $y_offset + $box_height;
break;
case 'top right':
$x = $this->width - $box_width + $x_offset;
$y = 0 + $y_offset + $box_height;
break;
case 'top':
$x = ($this->width / 2) - ($box_width / 2) + $x_offset;
$y = 0 + $y_offset + $box_height;
break;
case 'bottom left':
$x = 0 + $x_offset;
$y = $this->height - $box_height + $y_offset + $box_height;
break;
case 'bottom right':
$x = $this->width - $box_width + $x_offset;
$y = $this->height - $box_height + $y_offset + $box_height;
break;
case 'bottom':
$x = ($this->width / 2) - ($box_width / 2) + $x_offset;
$y = $this->height - $box_height + $y_offset + $box_height;
break;
case 'left':
$x = 0 + $x_offset;
$y = ($this->height / 2) - (($box_height / 2) - $box_height) + $y_offset;
break;
case 'right';
$x = $this->width - $box_width + $x_offset;
$y = ($this->height / 2) - (($box_height / 2) - $box_height) + $y_offset;
break;
case 'center':
default:
$x = ($this->width / 2) - ($box_width / 2) + $x_offset;
$y = ($this->height / 2) - (($box_height / 2) - $box_height) + $y_offset;
break;
}
// Add the text
imagettftext($image, $font_size, $angle, $x, $y, $color, $font_file, $text);
switch (strtolower($extension)) {
case 'gif':
imagegif($image);
break;
case 'jpeg':
imagejpeg($image, null, round(80)); // 80 = quality
break;
case 'png':
imagepng($image, null, round(9 * 80 / 100));
break;
default:
throw new Exception('Unsupported image format: '.$this->filename);
break;
}
return $filename;
}
} // public class Image(){
?>