<?php
// Defines
define("RESIZE_STRETCH" , "stretch");
define("RESIZE_FIT" , "fit");
define("RESIZE_CROP" , "crop");
define("POSITION_TOP" , "top");
define("POSITION_CENTER", "center");
define("POSITION_BOTTOM", "bottom");
define("POSITION_LEFT" , "left");
define("POSITION_RIGHT" , "right");
// Script is directly called
if(isset($_GET['src']) && (isset($_GET['w']) || isset($_GET['h']) || isset($_GET['m']) || isset($_GET['f']) || isset($_GET['q']))){
$ImageProcessor = new ImageProcessor(true);
$ImageProcessor->Load($_GET['src'], true);
$ImageProcessor->EnableCache("imagecache/", 3000);
$width = isset($_GET['w']) ? $_GET['w'] : null;
$height = isset($_GET['h']) ? $_GET['h'] : null;
$mode = RESIZE_STRETCH;
if(isset($_GET['mode'])){
switch($_GET['mode']){
case "stretch":
$mode = RESIZE_STRETCH;
break;
case "fit":
$mode = RESIZE_FIT;
break;
case "crop":
$mode = RESIZE_CROP;
break;
}
}
if(isset($_GET['m'])){
$ImageProcessor->Watermark($_GET['m']);
}
if(isset($_GET['w']) || isset($_GET['h'])){
$ImageProcessor->Resize($width, $height, $mode);
}
if(isset($_GET['f']) && $_GET['f'] == "bw"){
$ImageProcessor->FilterGray();
}
$quality = isset($_GET['q']) ? $_GET['q'] : 80;
$ImageProcessor->Parse($quality);
}
class ImageProcessor
{
/**
* Origninal image path
*
* @var string
*/
private $_image_path;
/**
* Image name
*
* @var string
*/
protected $_image_name;
/**
* Image type
*
* @var int
*/
private $_image_type;
/**
* Image mime type
*
* @var string
*/
protected $_mime;
/**
* Image file extension
*
* @var string
*/
protected $_extension;
/**
* Is it a direct url call?
*
* @var bool
*/
private $_direct_call = false;
/**
* Old image height
*
* @var int
*/
private $_old_height;
/**
* Old image width
*
* @var int
*/
private $_old_width;
/**
* New image height
*
* @var int
*/
private $_new_height;
/**
* New image width
*
* @var int
*/
private $_new_width;
/**
* Resize mode
*
* @var defined
*/
private $_resize_mode;
/**
* Image resource
*
* @var Resource
*/
private $_image_resource;
/**
* Cache folder
*
* @var string
*/
private $_cache_folder;
/**
* Cache time to live
*
* @var int
*/
private $_cache_ttl;
/**
* Cache on
*
* @var bool
*/
private $_cache = false;
/**
* Cache skip
*
* @var bool
*/
private $_cache_skip = false;
/**
* Cleanup url
*
* @access private
* @param string $image
* @return string
*/
private function cleanUrl($image){
$cimage = str_replace("\\", "/", $image);
return $cimage;
}
/**
* Show error
*
* @access private
* @param string $message
* @return void
*/
private function showError($message=""){
if($this->_direct_call){
header('HTTP/1.1 400 Bad Request');
die($message);
}else{
trigger_error($message, E_USER_WARNING);
}
}
/**
* Get image resource
*
* @access private
* @param string $image
* @param string $extension
* @return resource
*/
private function GetImageResource($image, $extension){
switch($extension){
case "jpeg":
case "jpg":
@ini_set('gd.jpeg_ignore_warning', 1);
$resource = imagecreatefromjpeg($image);
break;
case "gif":
$resource = imagecreatefromgif($image);
break;
case "png":
$resource = imagecreatefrompng($image);
break;
}
return $resource;
}
/**
* Save image to cache folder
*
* @access private
* @return void
*/
private function cacheImage($name, $content){
// Write content file
$path = $this->_cache_folder . $name;
$fh = fopen($path, 'w') or die("can't open file");
fwrite($fh, $content);
fclose($fh);
}
/**
* Get an image from cache
*
* @access public
* @param string $name
* @return void
*/
private function cachedImage($name){
$file = $this->_cache_folder . $name;
$fh = fopen($file, 'r');
$content = fread($fh, filesize($file));
fclose($fh);
return $content;
}
/**
* Get name of the cache file
*
* @access private
* @return string
*/
private function generateCacheName(){
$get = implode("-", $_GET);
return md5($this->_resize_mode . $this->_image_path . $this->_old_width . $this->_old_height . $this->_new_width . $this->_new_height . $get) . "." . $this->_extension;
}
/**
* Check if a cache file is expired
*
* @access private
* @return bool
*/
private function cacheExpired(){
$path = $this->_cache_folder . $this->generateCacheName();
if(file_exists($path)){
$filetime = filemtime($path);
return $filetime < (time() - $this->_cache_ttl);
}else{
return true;
}
}
/**
* Merges to layers for watermark
* but keeps a clean images when using 24bit png
*
* @return void
*/
private function imagecopymergeAlpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){
if(!isset($pct)){
return false;
}
$pct /= 100;
// Get image width and height
$w = imagesx( $src_im );
$h = imagesy( $src_im );
$marge_right = round(imagesx($dst_im)/2)-round(imagesx($src_im)/2);
$marge_bottom = round(imagesy($dst_im)/2)-round(imagesy($src_im)/2);
// Turn alpha blending off
imagealphablending( $src_im, false );
// Find the most opaque pixel in the image (the one with the smallest alpha value)
$minalpha = 10;
for( $x = 0; $x < $w; $x++ )
for( $y = 0; $y < $h; $y++ ){
$alpha = ( imagecolorat( $src_im, $x, $y ) >> 24 ) & 0xFF;
if( $alpha < $minalpha ){
$minalpha = $alpha;
}
}
//loop through image pixels and modify alpha for each
for( $x = 0; $x < $w; $x++ ){
for( $y = 0; $y < $h; $y++ ){
//get current alpha value (represents the TANSPARENCY!)
$colorxy = imagecolorat( $src_im, $x, $y );
$alpha = ( $colorxy >> 24 ) & 0xFF;
//calculate new alpha
if( $minalpha !== 127 ){
$alpha = 127 + 127 * $pct * ( $alpha - 127 ) / ( 127 - $minalpha );
} else {
$alpha += 127 * $pct;
}
//get the color index with new alpha
$alphacolorxy = imagecolorallocatealpha( $src_im, ( $colorxy >> 16 ) & 0xFF, ( $colorxy >> 8 ) & 0xFF, $colorxy & 0xFF, $alpha );
//set pixel with the new color + opacity
if( !imagesetpixel( $src_im, $x, $y, $alphacolorxy ) ){
return false;
}
}
}
// The image copy
imagecopy($dst_im, $src_im, imagesx($dst_im)-$w-$marge_right, imagesy($dst_im)-$h-$marge_bottom, $src_x, $src_y, $src_w, $src_h);
}
/**
* Get the extension name of a file
*
* @param string $file
* @return string
*/
private function getExtension($file){
$parts = explode(".", $file);
return strtolower(end($parts));
}
/**
* Lazy load the image resource
* needed for the caching to work
*
* @return void
*/
private function lazyLoad(){
if(empty($this->_image_resource)){
if($this->_cache && !$this->cacheExpired()){
$this->_cache_skip = true;
return;
}
$resource = $this->GetImageResource($this->_image_path, $this->_extension);
$this->_image_resource = $resource;
}
}
/**
* Constructor
*
* @access public
* @param bool $direct_call
* @return void
*/
public function __construct($direct_call=false){
//Check if GD extension is loaded
if (!extension_loaded('gd') && !extension_loaded('gd2')) {
$this->showError("GD is not loaded");
}
$this->_direct_call = $direct_call;
}
/**
* Resize
*
* @param int $width
* @param int $height
* @param define $mode
* @param bool $auto_orientation houd rekening met orientatie wanneer er een resize gebeurt
*/
public function Resize($width=100, $height=100, $mode=RESIZE_STRETCH, $auto_orientation=false){
// Validate resize mode
$valid_modes = array("stretch", "fit", "crop");
if(in_array($mode, $valid_modes)){
$this->_resize_mode = $mode;
}else{
$this->showError("The resize mode '" . $mode . "' does not exists.");
}
// Aspect ratio resize based on width
if(is_numeric($width) && !is_numeric($height)){
$ratio = $this->_old_width / $width;
$height = ceil($this->_old_height / $ratio);
}
// Aspect ratio resize based on height
if(is_numeric($height) && !is_numeric($width)){
$ratio = $this->_old_height / $height;
$width = ceil($this->_old_width / $ratio);
}
// Mode calculations
switch($mode){
case "stretch":
$dst_x = 0;
$dst_y = 0;
$src_x = 0;
$src_y = 0;
$dst_w = $width;
$dst_h = $height;
$src_w = $this->_old_width;
$src_h = $this->_old_height;
break;
case "fit":
$dst_x = 0;
$dst_y = 0;
$src_x = 0;
$src_y = 0;
$dst_w = ($this->_old_width > $this->_old_height) ? $this->_old_width : $width;
$dst_h = ($this->_old_height > $this->_old_width) ? $this->_old_height : $height;
$src_w = $this->_old_width;
$src_h = $this->_old_height;
if($dst_w == $this->_old_width){
$ratio = $dst_h/$this->_old_height;
$dst_w = floor($dst_w * $ratio);
}
if($dst_h == $this->_old_height){
$ratio = $dst_w/$this->_old_width;
$dst_h = floor($dst_h * $ratio);
}
$width = $width > $dst_w ? $dst_w : $width;
$height = $height > $dst_h ? $dst_h : $height;
break;
case "crop":
$width = $width > $this->_old_width ? $this->_old_width : $width;
$height = $height > $this->_old_height ? $this->_old_height : $height;
$dst_x = 0;
$dst_y = 0;
$calc_x = ceil($this->_old_width/2) - floor($width / 2);
$src_x = $calc_x > 0 ? $calc_x : 0;
$calc_y = ceil($this->_old_height/2) - floor($height / 2);
$src_y = $calc_y > 0 ? $calc_y : 0;
$dst_w = $this->_old_width;
$dst_h = $this->_old_height;
$src_w = $this->_old_width;
$src_h = $this->_old_height;
break;
}
// Set news size vars because these are used for the
// cache name generation
$this->_new_width = $width;
$this->_new_height = $height;
$this->_old_width = $width;
$this->_old_height = $height;
// Lazy load for the directurl cache to work
$this->lazyLoad();
if($this->_cache_skip) return true;
// Create canvas for the new image
$new_image = imagecreatetruecolor($width, $height);
// Check if this image is PNG or GIF to preserve its transparency
if(($this->_image_type == 1) || ($this->_image_type == 3))
{
imagealphablending($new_image, false);
imagesavealpha($new_image,true);
$transparent = imagecolorallocatealpha($new_image, 255, 255, 255, 127);
imagefilledrectangle($new_image, 0, 0, $width, $height, $transparent);
}
imagecopyresampled($new_image, $this->_image_resource, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
// Apply transparency to resized gif images
if($this->_extension == "gif"){
$trnprt_indx = imagecolortransparent($resource);
if ($trnprt_indx >= 0) {
$trnprt_color = imagecolorsforindex($this->_image_resource, $trnprt_indx);
$trnprt_indx = imagecolorallocate($new_image, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
imagefill($new_image, 0, 0, $trnprt_indx);
imagecolortransparent($new_image, $trnprt_indx);
}
}
$this->_image_resource = $new_image;
}
/**
* Rotate an image
*
* @access public
* @param int $degrees
* @return void
*/
public function Rotate($degrees=180){
$this->lazyLoad();
if($this->_cache_skip) return true;
$this->_image_resource = imagerotate($this->_image_resource, $degrees, 0);
}
/**
* Add watermark
*
* To use the left right bottom top center parameters you must first d
*
* @access public
* @param string $image
* @param define $horizontal
* @param define $vertical
* @return void
*/
public function Watermark($image, $horizontal=POSITION_RIGHT, $vertical=POSITION_BOTTOM){
// Lazy load
$this->lazyLoad();
if($this->_cache_skip) return;
// Get extension
$extension = $this->getExtension($image);
// Image info
list($width, $height, $type) = getimagesize($image);
// Get image resource
$watermark = $this->GetImageResource($image, $extension);
// Resource width and height
$image_width = imagesx($this->_image_resource);
$image_height = imagesy($this->_image_resource);
// Calculate positions
$position_x = $horizontal;
$position_y = $vertical;
switch($position_x){
case "left":
$position_x = 0;
break;
case "center":
$position_x = ceil($image_width/2) - floor($width/2);
break;
case "right":
$position_x = $image_width - $width;
break;
}
switch($position_y){
case "top":
$position_y = 0;
break;
case "center":
$position_y = ceil($image_height/2) - floor($height/2);
break;
case "bottom":
$position_y = $image_height - $height;
break;
}
$extension = $this->getExtension($image);
if($extension == "png"){
$this->imagecopymergeAlpha($this->_image_resource, $watermark, $position_x, $position_y, 0, 0, $width, $height, 100);
}else{
imagecopymerge($this->_image_resource, $watermark, $position_x, $position_y, 0, 0, $width, $height, 100);
}
// Destroy watermark
imagedestroy($watermark);
}
/**
* Create image resource from path or url
*
* @access public
* @param string $location
* @param bool $lazy_load
* @return
*/
public function Load($image,$lazy_load=false){
// Cleanup image url
$image = $this->cleanUrl($image);
// Get mime type of the image
$extension = $this->getExtension($image);
$mimes = array(
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'gif' => 'image/gif',
'png' => 'image/png'
);
// Check if it is a valid image
if(isset($mimes[$extension]) && ((!strstr($image, "http://") && file_exists($image)) || strstr($image, "http://")) ){
// Urlencode if http
if(strstr($image, "http://")){
$image = str_replace(array('http%3A%2F%2F', '%2F'), array('http://', '/'), urlencode($image));
}
$this->_extension = $extension;
$this->_mime = $mimes[$extension];
$this->_image_path = $image;
$parts = explode("/", $image);
$this->_image_name = str_replace("." . $this->_extension, "", end($parts));
// Get image size
list($width, $height, $type) = getimagesize($image);
$this->_old_width = $width;
$this->_old_height = $height;
$this->_image_type = $type;
}else{
$this->showError("Wrong image type or file does not exists.");
}
if(!$lazy_load){
$resource = $this->GetImageResource($image, $extension);
$this->_image_resource = $resource;
}
}
/**
* Save image to computer
*
* @access public
* @param string $destination
* @return void
*/
public function Save($destination, $quality=80){
if($this->_extension == "png" || $this->_extension == "gif"){
imagesavealpha($this->_image_resource, true);
}
switch ($this->_extension) {
case "jpg": imagejpeg($this->_image_resource,$destination, $quality); break;
case "jpeg": imagejpeg($this->_image_resource,$destination, $quality); break;
case "gif": imagegif($this->_image_resource,$destination); break;
case "png": imagepng($this->_image_resource,$destination); break;
default: $this->showError('Failed to save image!'); break;
}
}
/**
* Print image to screen
*
* @access public
* @return void
*/
public function Parse($quality=80){
$name = $this->generateCacheName();
$content = "";
if(!$this->_cache || ($this->_cache && $this->cacheExpired())){
ob_start();
header ("Content-type: " . $this->_mime);
if($this->_extension == "png" || $this->_extension == "gif"){
imagesavealpha($this->_image_resource, true);
}
switch ($this->_extension) {
case "jpg": imagejpeg($this->_image_resource, "", $quality); break;
case "jpeg": imagejpeg($this->_image_resource, "", $quality); break;
case "gif": imagegif($this->_image_resource); break;
case "png": imagepng($this->_image_resource); break;
default: $this->showError('Failed to save image!'); break;
}
$content = ob_get_contents();
ob_end_clean();
}else{
header ("Content-type: " . $this->_mime);
echo $this->cachedImage($name);
exit();
}
// Save image content
if(!empty($content) && $this->_cache){
$this->cacheImage($name, $content);
}
// Destroy image
$this->Destroy();
echo $content;
exit();
}
/**
* Destroy resources
*
* @access public
* @return void
*/
public function Destroy(){
imagedestroy($this->_image_resource);
}
/**
* Filter: Negative effect
*
* @access public
* @return void
*/
public function FilterNegative(){
if(isset($this->_image_resource)){
imagefilter($this->_image_resource, IMG_FILTER_NEGATE);
}else{
$this->showError("Load an image first");
}
}
/**
* Filter: Grayscale effect
*
* @access public
* @return void
*/
public function FilterGray(){
$this->lazyLoad();
if($this->_cache_skip) return;
if(isset($this->_image_resource)){
imagefilter($this->_image_resource, IMG_FILTER_GRAYSCALE);
}
//}else{
// $this->showError("Load an image first");
//}
}
/**
* Get image resources
*
* @access public
* @return resource
*/
public function GetResource(){
return $this->_image_resource;
}
/**
* Set image resources
*
* @access public
* @param resource $image
* @return resource
*/
public function SetResource($image){
$this->_image_resource = $image;
}
/**
* Enable caching
*
* @access public
* @param string $folder
* @param int $ttl
* @return void
*/
public function EnableCache($folder="cache/", $ttl=60){
if(!is_dir($folder)){
$this->showError("Directory '" . $folder . "' does'nt exist");
}else{
$this->_cache = true;
$this->_cache_folder = $folder;
$this->_cache_ttl = $ttl;
}
return false;
}
}
?>Bir sunucuda çalışan cache diğer sunucuda çalışmıyor. Kullanılan cache dosyası bundan ibaret. Hangi modülü aktif etmemiz gerekiyor? Ya da ne yapmam gerekiyor sunucuda? Yardımcı olursanız memnun olurum.
Bilinmeyen PHP image cache modülü???
4
●435
- 06-02-2017, 14:05:03Üyeliği durduruldu
- 06-02-2017, 16:08:09Üyeliği durdurulduYazma izni var. Resim üretip görüntülemiyor. Modüller ekli...Alexis adlı üyeden alıntı: mesajı görüntüle
- 06-02-2017, 17:56:33Merhaba,
Aldığınız hata yazısını paylaşırsanız, Hangi modüllerin çalışıp çalışmadığını veya hatanın neyden kaynaklandığını söyleyebiliriz.
Eğer hatayı göremiyorsanız aşağıdaki kodu sayfanın başına ( PHP açılış kodlarının altına ) yapıştırın ve tekrar çalıştırın. Dizin durumuna göre bir log dosyası oluşturacaktır ve içerisinde hata kodları gözükecektir. Bunu iletmenizi rica ederim.
error_reporting(~E_NOTICE); ini_set("error_log", "php-error.log"); - 07-02-2017, 13:24:09Üyeliği durduruldu[07-Feb-2017 10:14:12 UTC] PHP Warning: imagejpeg(): Filename cannot be empty in /home/deneyelim/web/deneyelim.com/public_html/fotograf.php on line 671MesutEyrice adlı üyeden alıntı: mesajı görüntüle
[07-Feb-2017 10:14:13 UTC] PHP Warning: imagejpeg(): Filename cannot be empty in /home/deneyelim/web/deneyelim.com/public_html/fotograf.php on line 671
[07-Feb-2017 10:14:13 UTC] PHP Warning: imagejpeg(): Filename cannot be empty in /home/deneyelim/web/deneyelim.com/public_html/fotograf.php on line 671
[07-Feb-2017 10:14:13 UTC] PHP Warning: imagejpeg(): Filename cannot be empty in /home/deneyelim/web/deneyelim.com/public_html/fotograf.php on line 671
[07-Feb-2017 10:14:13 UTC] PHP Warning: imagejpeg(): Filename cannot be empty in /home/deneyelim/web/deneyelim.com/public_html/fotograf.php on line 671
[07-Feb-2017 10:14:13 UTC] PHP Warning: imagejpeg(): Filename cannot be empty in /home/deneyelim/web/deneyelim.com/public_html/fotograf.php on line 671
[07-Feb-2017 10:14:13 UTC] PHP Warning: imagejpeg(): Filename cannot be empty in /home/deneyelim/web/deneyelim.com/public_html/fotograf.php on line 671
[07-Feb-2017 10:14:13 UTC] PHP Warning: imagejpeg(): Filename cannot be empty in /home/deneyelim/web/deneyelim.com/public_html/fotograf.php on line 671
--R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 13:24:09 -->-> Daha önceki mesaj 12:24:46 --
Arkadaşlar sorunu çözdük. Sorun PHP sürümünden kaynaklı oluşmaktadır.
PHP 5.3 de;
case "jpg": imagejpeg($this->_image_resource, "", $quality); break;
olarak yazdığımız kodu*
PHP 5.4'de*
case "jpg": imagejpeg($this->_image_resource, NULL, $quality); break;
olarak düzenlememiz yani " " (çift tırnak alanını NULL olarak değiştirmemiz gerekmektedir.
Örnek kod aşağıdadır.
PHP 5.3
public function Parse($quality=80){
$name = $this->generateCacheName();
$content = "";
if(!$this->_cache || ($this->_cache && $this->cacheExpired())){
ob_start();
header ("Content-type: " . $this->_mime);
if($this->_extension == "png" || $this->_extension == "gif"){
imagesavealpha($this->_image_resource, true);
}
switch ($this->_extension) {
case "jpg": imagejpeg($this->_image_resource, NULL, $quality); break;
case "jpeg": imagejpeg($this->_image_resource, NULL, $quality); break;
case "gif": imagegif($this->_image_resource); break;
case "png": imagepng($this->_image_resource); break;
default: $this->showError('Failed to save image!'); break;
}
PHP 5.4
public function Parse($quality=80){
$name = $this->generateCacheName();
$content = "";
if(!$this->_cache || ($this->_cache && $this->cacheExpired())){
ob_start();
header ("Content-type: " . $this->_mime);
if($this->_extension == "png" || $this->_extension == "gif"){
imagesavealpha($this->_image_resource, true);
}
switch ($this->_extension) {
case "jpg": imagejpeg($this->_image_resource, NULL, $quality); break;
case "jpeg": imagejpeg($this->_image_resource, NULL, $quality); break;
case "gif": imagegif($this->_image_resource); break;
case "png": imagepng($this->_image_resource); break;
default: $this->showError('Failed to save image!'); break;
}