@@ -104,9 +104,9 @@ |
||
104 | 104 | if ($result !== false) { |
105 | 105 | return $result; |
106 | 106 | } |
107 | - $this->currentNesting =& $context->get('CurrentNesting'); |
|
108 | - $this->currentToken =& $context->get('CurrentToken'); |
|
109 | - $this->inputZipper =& $context->get('InputZipper'); |
|
107 | + $this->currentNesting = & $context->get('CurrentNesting'); |
|
108 | + $this->currentToken = & $context->get('CurrentToken'); |
|
109 | + $this->inputZipper = & $context->get('InputZipper'); |
|
110 | 110 | return false; |
111 | 111 | } |
112 | 112 |
@@ -49,7 +49,7 @@ discard block |
||
49 | 49 | if ($valid === false) { |
50 | 50 | return false; |
51 | 51 | } |
52 | - return '[' . $valid . ']'; |
|
52 | + return '['.$valid.']'; |
|
53 | 53 | } |
54 | 54 | |
55 | 55 | // need to do checks on unusual encodings too |
@@ -79,8 +79,8 @@ discard block |
||
79 | 79 | // Based off of RFC 1738, but amended so that |
80 | 80 | // as per RFC 3696, the top label need only not be all numeric. |
81 | 81 | // The productions describing this are: |
82 | - $a = '[a-z]'; // alpha |
|
83 | - $an = '[a-z0-9]'; // alphanum |
|
82 | + $a = '[a-z]'; // alpha |
|
83 | + $an = '[a-z0-9]'; // alphanum |
|
84 | 84 | $and = "[a-z0-9-$underscore]"; // alphanum | "-" |
85 | 85 | // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum |
86 | 86 | $domainlabel = "$an(?:$and*$an)?"; |
@@ -73,7 +73,7 @@ discard block |
||
73 | 73 | restore_error_handler(); |
74 | 74 | |
75 | 75 | $body = $doc->getElementsByTagName('html')->item(0)-> // <html> |
76 | - getElementsByTagName('body')->item(0); // <body> |
|
76 | + getElementsByTagName('body')->item(0); // <body> |
|
77 | 77 | |
78 | 78 | $div = $body->getElementsByTagName('div')->item(0); // <div> |
79 | 79 | $tokens = array(); |
@@ -178,7 +178,7 @@ discard block |
||
178 | 178 | if ($node->nodeType === XML_TEXT_NODE) { |
179 | 179 | $data = $this->getData($node); // Handle variable data property |
180 | 180 | if ($data !== null) { |
181 | - $tokens[] = $this->factory->createText($data); |
|
181 | + $tokens[] = $this->factory->createText($data); |
|
182 | 182 | } |
183 | 183 | return false; |
184 | 184 | } elseif ($node->nodeType === XML_CDATA_SECTION_NODE) { |
@@ -73,7 +73,7 @@ discard block |
||
73 | 73 | restore_error_handler(); |
74 | 74 | |
75 | 75 | $body = $doc->getElementsByTagName('html')->item(0)-> // <html> |
76 | - getElementsByTagName('body')->item(0); // <body> |
|
76 | + getElementsByTagName('body')->item(0); // <body> |
|
77 | 77 | |
78 | 78 | $div = $body->getElementsByTagName('div')->item(0); // <div> |
79 | 79 | $tokens = array(); |
@@ -212,7 +212,7 @@ discard block |
||
212 | 212 | $attr = $node->hasAttributes() ? $this->transformAttrToAssoc($node->attributes) : array(); |
213 | 213 | $tag_name = $this->getTagName($node); // Handle variable tagName property |
214 | 214 | if (empty($tag_name)) { |
215 | - return (bool) $node->childNodes->length; |
|
215 | + return (bool)$node->childNodes->length; |
|
216 | 216 | } |
217 | 217 | // We still have to make sure that the element actually IS empty |
218 | 218 | if (!$node->childNodes->length) { |
@@ -276,7 +276,7 @@ discard block |
||
276 | 276 | */ |
277 | 277 | public function callbackUndoCommentSubst($matches) |
278 | 278 | { |
279 | - return '<!--' . strtr($matches[1], array('&' => '&', '<' => '<')) . $matches[2]; |
|
279 | + return '<!--'.strtr($matches[1], array('&' => '&', '<' => '<')).$matches[2]; |
|
280 | 280 | } |
281 | 281 | |
282 | 282 | /** |
@@ -287,7 +287,7 @@ discard block |
||
287 | 287 | */ |
288 | 288 | public function callbackArmorCommentEntities($matches) |
289 | 289 | { |
290 | - return '<!--' . str_replace('&', '&', $matches[1]) . $matches[2]; |
|
290 | + return '<!--'.str_replace('&', '&', $matches[1]).$matches[2]; |
|
291 | 291 | } |
292 | 292 | |
293 | 293 | /** |
@@ -305,10 +305,10 @@ discard block |
||
305 | 305 | if (!empty($def->doctype->dtdPublic) || !empty($def->doctype->dtdSystem)) { |
306 | 306 | $ret .= '<!DOCTYPE html '; |
307 | 307 | if (!empty($def->doctype->dtdPublic)) { |
308 | - $ret .= 'PUBLIC "' . $def->doctype->dtdPublic . '" '; |
|
308 | + $ret .= 'PUBLIC "'.$def->doctype->dtdPublic.'" '; |
|
309 | 309 | } |
310 | 310 | if (!empty($def->doctype->dtdSystem)) { |
311 | - $ret .= '"' . $def->doctype->dtdSystem . '" '; |
|
311 | + $ret .= '"'.$def->doctype->dtdSystem.'" '; |
|
312 | 312 | } |
313 | 313 | $ret .= '>'; |
314 | 314 | } |
@@ -317,9 +317,13 @@ |
||
317 | 317 | $ret .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'; |
318 | 318 | // No protection if $html contains a stray </div>! |
319 | 319 | $ret .= '</head><body>'; |
320 | - if ($use_div) $ret .= '<div>'; |
|
320 | + if ($use_div) { |
|
321 | + $ret .= '<div>'; |
|
322 | + } |
|
321 | 323 | $ret .= $html; |
322 | - if ($use_div) $ret .= '</div>'; |
|
324 | + if ($use_div) { |
|
325 | + $ret .= '</div>'; |
|
326 | + } |
|
323 | 327 | $ret .= '</body></html>'; |
324 | 328 | return $ret; |
325 | 329 | } |
@@ -34,7 +34,7 @@ |
||
34 | 34 | $tokens = array(); |
35 | 35 | $this->tokenizeDOM( |
36 | 36 | $doc->getElementsByTagName('html')->item(0)-> // <html> |
37 | - getElementsByTagName('body')->item(0) // <body> |
|
37 | + getElementsByTagName('body')->item(0) // <body> |
|
38 | 38 | , |
39 | 39 | $tokens, $config |
40 | 40 | ); |
@@ -469,7 +469,7 @@ discard block |
||
469 | 469 | $this->state = 'data'; |
470 | 470 | |
471 | 471 | while ($this->state !== null) { |
472 | - $this->{$this->state . 'State'}(); |
|
472 | + $this->{$this->state.'State'}(); |
|
473 | 473 | } |
474 | 474 | } |
475 | 475 | |
@@ -498,7 +498,7 @@ discard block |
||
498 | 498 | |
499 | 499 | private function characters($char_class, $start) |
500 | 500 | { |
501 | - return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start)); |
|
501 | + return preg_replace('#^(['.$char_class.']+).*#s', '\\1', substr($this->data, $start)); |
|
502 | 502 | } |
503 | 503 | |
504 | 504 | private function dataState() |
@@ -1289,7 +1289,7 @@ discard block |
||
1289 | 1289 | } else { |
1290 | 1290 | /* Append a U+002D HYPHEN-MINUS (-) character and the input |
1291 | 1291 | character to the comment token's data. Switch to the comment state. */ |
1292 | - $this->token['data'] .= '-' . $char; |
|
1292 | + $this->token['data'] .= '-'.$char; |
|
1293 | 1293 | $this->state = 'comment'; |
1294 | 1294 | } |
1295 | 1295 | } |
@@ -1313,7 +1313,7 @@ discard block |
||
1313 | 1313 | $this->state = 'data'; |
1314 | 1314 | |
1315 | 1315 | } else { |
1316 | - $this->token['data'] .= '--' . $char; |
|
1316 | + $this->token['data'] .= '--'.$char; |
|
1317 | 1317 | $this->state = 'comment'; |
1318 | 1318 | } |
1319 | 1319 | } |
@@ -1548,7 +1548,7 @@ discard block |
||
1548 | 1548 | |
1549 | 1549 | // Return a character token for the character corresponding to the |
1550 | 1550 | // entity name (as given by the second column of the entities table). |
1551 | - return html_entity_decode('&' . rtrim($entity, ';') . ';', ENT_QUOTES, 'UTF-8'); |
|
1551 | + return html_entity_decode('&'.rtrim($entity, ';').';', ENT_QUOTES, 'UTF-8'); |
|
1552 | 1552 | } |
1553 | 1553 | |
1554 | 1554 | private function emitToken($token) |
@@ -2657,7 +2657,7 @@ discard block |
||
2657 | 2657 | |
2658 | 2658 | /* Act as if a stream of character tokens had been seen. */ |
2659 | 2659 | $this->insertText( |
2660 | - 'This is a searchable index. ' . |
|
2660 | + 'This is a searchable index. '. |
|
2661 | 2661 | 'Insert your search keywords here: ' |
2662 | 2662 | ); |
2663 | 2663 | |
@@ -2679,7 +2679,7 @@ discard block |
||
2679 | 2679 | /* Act as if a stream of character tokens had been seen |
2680 | 2680 | (see below for what they should say). */ |
2681 | 2681 | $this->insertText( |
2682 | - 'This is a searchable index. ' . |
|
2682 | + 'This is a searchable index. '. |
|
2683 | 2683 | 'Insert your search keywords here: ' |
2684 | 2684 | ); |
2685 | 2685 |
@@ -111,7 +111,7 @@ |
||
111 | 111 | foreach ($var as $key => $value) { |
112 | 112 | if ($value !== true) { |
113 | 113 | trigger_error( |
114 | - "Lookup array has non-true value at key '$key'; " . |
|
114 | + "Lookup array has non-true value at key '$key'; ". |
|
115 | 115 | "maybe your input array was not indexed numerically", |
116 | 116 | E_USER_WARNING |
117 | 117 | ); |
@@ -112,12 +112,12 @@ discard block |
||
112 | 112 | $PHPTHUMB_CONFIG['prefer_imagemagick'] = true; // If true, use ImageMagick to resize thumbnails if possible, since it is usually faster than GD functions; if false only use ImageMagick if PHP memory limit is too low. |
113 | 113 | $PHPTHUMB_CONFIG['imagemagick_use_thumbnail'] = true; // If true, use ImageMagick's "-thumbnail" resizing parameter (if available) which removes extra non-image metadata (profiles, EXIF info, etc) resulting in much smaller filesize; if false, use "-resize" paramter which retains this info |
114 | 114 | if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { |
115 | - // Windows: set absolute pathname |
|
116 | - $PHPTHUMB_CONFIG['imagemagick_path'] = 'C:/ImageMagick/convert.exe'; |
|
115 | + // Windows: set absolute pathname |
|
116 | + $PHPTHUMB_CONFIG['imagemagick_path'] = 'C:/ImageMagick/convert.exe'; |
|
117 | 117 | } else { |
118 | - // *nix: set absolute pathname to "convert", or leave as null if "convert" is in the path (location detected with `which`) |
|
119 | - //$PHPTHUMB_CONFIG['imagemagick_path'] = '/usr/local/bin/convert'; |
|
120 | - $PHPTHUMB_CONFIG['imagemagick_path'] = null; |
|
118 | + // *nix: set absolute pathname to "convert", or leave as null if "convert" is in the path (location detected with `which`) |
|
119 | + //$PHPTHUMB_CONFIG['imagemagick_path'] = '/usr/local/bin/convert'; |
|
120 | + $PHPTHUMB_CONFIG['imagemagick_path'] = null; |
|
121 | 121 | } |
122 | 122 | |
123 | 123 | |
@@ -248,22 +248,22 @@ discard block |
||
248 | 248 | $GLOBALS['PHPTHUMB_CONFIG'] = $PHPTHUMB_CONFIG; |
249 | 249 | function phpThumbURL($ParameterString, $path_to_phpThumb='phpThumb.php') { |
250 | 250 | global $PHPTHUMB_CONFIG; |
251 | - if (is_array($ParameterString)) { |
|
252 | - $ParameterStringArray = $ParameterString; |
|
253 | - } else { |
|
254 | - parse_str($ParameterString, $ParameterStringArray); |
|
255 | - } |
|
256 | - $ParamterStringEncodedArray = array(); |
|
257 | - foreach ($ParameterStringArray as $key => $value) { |
|
258 | - if (is_array($value)) { |
|
259 | - // e.g. fltr[] is passed as an array |
|
260 | - foreach ($value as $subvalue) { |
|
261 | - $ParamterStringEncodedArray[] = $key.'[]='.rawurlencode($subvalue); |
|
262 | - } |
|
263 | - } else { |
|
264 | - $ParamterStringEncodedArray[] = $key.'='.rawurlencode($value); |
|
265 | - } |
|
266 | - } |
|
267 | - $ParameterString = implode($PHPTHUMB_CONFIG['high_security_url_separator'], $ParamterStringEncodedArray); |
|
268 | - return $path_to_phpThumb.'?'.$ParameterString.$PHPTHUMB_CONFIG['high_security_url_separator'].'hash='.md5($ParameterString.$PHPTHUMB_CONFIG['high_security_password']); |
|
251 | + if (is_array($ParameterString)) { |
|
252 | + $ParameterStringArray = $ParameterString; |
|
253 | + } else { |
|
254 | + parse_str($ParameterString, $ParameterStringArray); |
|
255 | + } |
|
256 | + $ParamterStringEncodedArray = array(); |
|
257 | + foreach ($ParameterStringArray as $key => $value) { |
|
258 | + if (is_array($value)) { |
|
259 | + // e.g. fltr[] is passed as an array |
|
260 | + foreach ($value as $subvalue) { |
|
261 | + $ParamterStringEncodedArray[] = $key.'[]='.rawurlencode($subvalue); |
|
262 | + } |
|
263 | + } else { |
|
264 | + $ParamterStringEncodedArray[] = $key.'='.rawurlencode($value); |
|
265 | + } |
|
266 | + } |
|
267 | + $ParameterString = implode($PHPTHUMB_CONFIG['high_security_url_separator'], $ParamterStringEncodedArray); |
|
268 | + return $path_to_phpThumb.'?'.$ParameterString.$PHPTHUMB_CONFIG['high_security_url_separator'].'hash='.md5($ParameterString.$PHPTHUMB_CONFIG['high_security_password']); |
|
269 | 269 | } |
@@ -10,13 +10,13 @@ discard block |
||
10 | 10 | // THIS CONFIG FILE ONLY APPLIES TO phpThumb.php // |
11 | 11 | // /// |
12 | 12 | ////////////////////////////////////////////////////////////// |
13 | -require dirname(dirname(__DIR__)) . '/header.php'; |
|
13 | +require dirname(dirname(__DIR__)).'/header.php'; |
|
14 | 14 | define('phpThumbConfigFileVersion', '1.7.15'); |
15 | 15 | ob_start(); |
16 | 16 | if (!class_exists('phpthumb_functions')) { // normally include_once should take care of this, but see https://github.com/JamesHeinrich/phpThumb/issues/94 |
17 | -if (!file_exists(__DIR__ . '/phpthumb.functions.php') || !include_once(__DIR__ . '/phpthumb.functions.php')) { |
|
17 | +if (!file_exists(__DIR__.'/phpthumb.functions.php') || !include_once(__DIR__.'/phpthumb.functions.php')) { |
|
18 | 18 | ob_end_flush(); |
19 | - die('failed to include_once(phpthumb.functions.php) - realpath="' . realpath(__DIR__ . '/phpthumb.functions.php') . '"'); |
|
19 | + die('failed to include_once(phpthumb.functions.php) - realpath="'.realpath(__DIR__.'/phpthumb.functions.php').'"'); |
|
20 | 20 | } |
21 | 21 | } |
22 | 22 | ob_end_clean(); |
@@ -25,7 +25,7 @@ discard block |
||
25 | 25 | |
26 | 26 | /****************************************************************************************/ |
27 | 27 | /* START USER CONFIGURATION SECTION: */ |
28 | -global $PHPTHUMB_CONFIG; // declare as global to prevent scope issues (when including phpThumb.config.php inside functions inside included files, etc) |
|
28 | +global $PHPTHUMB_CONFIG; // declare as global to prevent scope issues (when including phpThumb.config.php inside functions inside included files, etc) |
|
29 | 29 | $PHPTHUMB_CONFIG = array(); |
30 | 30 | |
31 | 31 | // * DocumentRoot configuration |
@@ -40,20 +40,20 @@ discard block |
||
40 | 40 | |
41 | 41 | |
42 | 42 | // * Security configuration |
43 | -$PHPTHUMB_CONFIG['disable_debug'] = true; // DO NOT DISABLE THIS ON ANY PUBLIC-ACCESSIBLE SERVER. Prevents phpThumb from displaying any information about your system. If true, phpThumbDebug and error messages will be disabled. If set to false (debug messages enabled) then debug mode will be FORCED -- ONLY debug output will be presented, no actual thumbnail (to avoid accidentally leaving debug mode enabled on a production server) |
|
44 | -$PHPTHUMB_CONFIG['high_security_enabled'] = true; // DO NOT DISABLE THIS ON ANY PUBLIC-ACCESSIBLE SERVER. If disabled, your server is more vulnerable to hacking attempts, both on your server and via your server to other servers. When enabled, requires 'high_security_password' set to be set and requires the use of phpThumbURL() function (at the bottom of phpThumb.config.php) to generate hashed URLs |
|
45 | -$PHPTHUMB_CONFIG['high_security_password'] = ''; // required if 'high_security_enabled' is true, and must be at complex (uppercase, lowercase, numbers, punctuation, etc -- punctuation is strongest, lowercase is weakest; see PasswordStrength() in phpthumb.functions.php). You can use a password generator like http://silisoftware.com/tools/password-random.php to generate a strong password |
|
46 | - |
|
47 | -$PHPTHUMB_CONFIG['high_security_url_separator'] = '&'; // should almost always be left as '&'. Must be a single character. Do not change to '&' -- htmlspecialchars wrapped around phpThumbURL() takes care of this without breaking the hash |
|
48 | -$PHPTHUMB_CONFIG['allow_src_above_docroot'] = false; // if false (default) only allow src within document_root; if true, allow src to be anywhere in filesystem |
|
49 | -$PHPTHUMB_CONFIG['allow_src_above_phpthumb'] = true; // if true (default), allow src to be anywhere in filesystem; if false only allow src within sub-directory of phpThumb installation |
|
50 | -$PHPTHUMB_CONFIG['auto_allow_symlinks'] = true; // if true (default), allow symlink target directories without explicitly whitelisting them |
|
43 | +$PHPTHUMB_CONFIG['disable_debug'] = true; // DO NOT DISABLE THIS ON ANY PUBLIC-ACCESSIBLE SERVER. Prevents phpThumb from displaying any information about your system. If true, phpThumbDebug and error messages will be disabled. If set to false (debug messages enabled) then debug mode will be FORCED -- ONLY debug output will be presented, no actual thumbnail (to avoid accidentally leaving debug mode enabled on a production server) |
|
44 | +$PHPTHUMB_CONFIG['high_security_enabled'] = true; // DO NOT DISABLE THIS ON ANY PUBLIC-ACCESSIBLE SERVER. If disabled, your server is more vulnerable to hacking attempts, both on your server and via your server to other servers. When enabled, requires 'high_security_password' set to be set and requires the use of phpThumbURL() function (at the bottom of phpThumb.config.php) to generate hashed URLs |
|
45 | +$PHPTHUMB_CONFIG['high_security_password'] = ''; // required if 'high_security_enabled' is true, and must be at complex (uppercase, lowercase, numbers, punctuation, etc -- punctuation is strongest, lowercase is weakest; see PasswordStrength() in phpthumb.functions.php). You can use a password generator like http://silisoftware.com/tools/password-random.php to generate a strong password |
|
46 | + |
|
47 | +$PHPTHUMB_CONFIG['high_security_url_separator'] = '&'; // should almost always be left as '&'. Must be a single character. Do not change to '&' -- htmlspecialchars wrapped around phpThumbURL() takes care of this without breaking the hash |
|
48 | +$PHPTHUMB_CONFIG['allow_src_above_docroot'] = false; // if false (default) only allow src within document_root; if true, allow src to be anywhere in filesystem |
|
49 | +$PHPTHUMB_CONFIG['allow_src_above_phpthumb'] = true; // if true (default), allow src to be anywhere in filesystem; if false only allow src within sub-directory of phpThumb installation |
|
50 | +$PHPTHUMB_CONFIG['auto_allow_symlinks'] = true; // if true (default), allow symlink target directories without explicitly whitelisting them |
|
51 | 51 | $PHPTHUMB_CONFIG['additional_allowed_dirs'] = array(); // array of additional directories to allow source images to be read from |
52 | 52 | |
53 | 53 | // * Cache directory configuration (choose only one of these - leave the other lines commented-out): |
54 | 54 | // Note: this directory must be writable (usually chmod 777 is neccesary) for caching to work. |
55 | 55 | // If the directory is not writable no error will be generated but caching will be disabled. |
56 | -$PHPTHUMB_CONFIG['cache_directory'] = XOOPS_CACHE_PATH; // set the cache directory relative to the phpThumb() installation |
|
56 | +$PHPTHUMB_CONFIG['cache_directory'] = XOOPS_CACHE_PATH; // set the cache directory relative to the phpThumb() installation |
|
57 | 57 | //$PHPTHUMB_CONFIG['cache_directory'] = $PHPTHUMB_CONFIG['document_root'].'/phpthumb/cache/'; // set the cache directory to an absolute directory for all source images |
58 | 58 | //$PHPTHUMB_CONFIG['cache_directory'] = './cache/'; // set the cache directory relative to the source image - must start with '.' (will not work to cache URL- or database-sourced images, please use an absolute directory name) |
59 | 59 | //$PHPTHUMB_CONFIG['cache_directory'] = null; // disable thumbnail caching (not recommended) |
@@ -69,35 +69,35 @@ discard block |
||
69 | 69 | // based on last-access date and/or number of files and/or total filesize. |
70 | 70 | |
71 | 71 | //$PHPTHUMB_CONFIG['cache_maxage'] = null; // never delete cached thumbnails based on last-access time |
72 | -$PHPTHUMB_CONFIG['cache_maxage'] = 86400 * 30; // delete cached thumbnails that haven't been accessed in more than [30 days] (value is maximum time since last access in seconds to avoid deletion) |
|
72 | +$PHPTHUMB_CONFIG['cache_maxage'] = 86400 * 30; // delete cached thumbnails that haven't been accessed in more than [30 days] (value is maximum time since last access in seconds to avoid deletion) |
|
73 | 73 | |
74 | 74 | //$PHPTHUMB_CONFIG['cache_maxsize'] = null; // never delete cached thumbnails based on byte size of cache directory |
75 | 75 | $PHPTHUMB_CONFIG['cache_maxsize'] = 10 * 1024 * 1024; // delete least-recently-accessed cached thumbnails when more than [10MB] of cached files are present (value is maximum bytesize of all cached files). Note: this only counts file size, does not count space "wasted" by directory entries in the cache structure -- see notes under $PHPTHUMB_CONFIG['cache_directory_depth'] |
76 | 76 | |
77 | 77 | //$PHPTHUMB_CONFIG['cache_maxfiles'] = null; // never delete cached thumbnails based on number of cached files |
78 | -$PHPTHUMB_CONFIG['cache_maxfiles'] = 200; // delete least-recently-accessed cached thumbnails when more than [200] cached files are present (value is maximum number of cached files to keep) |
|
78 | +$PHPTHUMB_CONFIG['cache_maxfiles'] = 200; // delete least-recently-accessed cached thumbnails when more than [200] cached files are present (value is maximum number of cached files to keep) |
|
79 | 79 | |
80 | 80 | // * Source image cache configuration |
81 | -$PHPTHUMB_CONFIG['cache_source_enabled'] = true; // if true, source images obtained via HTTP are cached to $PHPTHUMB_CONFIG['cache_source_directory'] |
|
82 | -$PHPTHUMB_CONFIG['cache_source_directory'] = XOOPS_CACHE_PATH; // set the cache directory for unprocessed source images |
|
81 | +$PHPTHUMB_CONFIG['cache_source_enabled'] = true; // if true, source images obtained via HTTP are cached to $PHPTHUMB_CONFIG['cache_source_directory'] |
|
82 | +$PHPTHUMB_CONFIG['cache_source_directory'] = XOOPS_CACHE_PATH; // set the cache directory for unprocessed source images |
|
83 | 83 | |
84 | 84 | // * cache source modification date configuration |
85 | 85 | $PHPTHUMB_CONFIG['cache_source_filemtime_ignore_local'] = false; // if true, local source images will not be checked for modification date and cached image will be used if available, even if source image is changed or removed |
86 | -$PHPTHUMB_CONFIG['cache_source_filemtime_ignore_remote'] = true; // if true, remote source images will not be checked for modification date and cached image will be used if available, even if source image is changed or removed. WARNING: cached performance MUCH slower if this is set to false. |
|
86 | +$PHPTHUMB_CONFIG['cache_source_filemtime_ignore_remote'] = true; // if true, remote source images will not be checked for modification date and cached image will be used if available, even if source image is changed or removed. WARNING: cached performance MUCH slower if this is set to false. |
|
87 | 87 | |
88 | 88 | // * Simplified cache filename configuration |
89 | 89 | // Instead of creating unique cache filenames for all parameter combinations, create "simple" cache files (eg: "pic_thumb.jpg") |
90 | 90 | // If cache_default_only_suffix is non-empty, GETstring parameters (except 'src') are ignored and only $PHPTHUMB_DEFAULTS |
91 | 91 | // parameters (set at the bottom of phpThumb.config.php) are used for processing. |
92 | 92 | // The '*' character MUST be used to represent the source image name |
93 | -$PHPTHUMB_CONFIG['cache_default_only_suffix'] = ''; // cached in normal phpThumb manner |
|
93 | +$PHPTHUMB_CONFIG['cache_default_only_suffix'] = ''; // cached in normal phpThumb manner |
|
94 | 94 | //$PHPTHUMB_CONFIG['cache_default_only_suffix'] = '*_thumb'; // cache 'pic.jpg' becomes 'pic_thumb.jpg' (or 'pic_thumb.png' if PNG output is selected, etc) |
95 | 95 | //$PHPTHUMB_CONFIG['cache_default_only_suffix'] = 'small-*'; // cache 'pic.jpg' becomes 'small-pic.jpg' (or 'small-pic.png' if PNG output is selected, etc) |
96 | 96 | |
97 | -$PHPTHUMB_CONFIG['cache_prefix'] = 'phpThumb_cache_' . (isset($_SERVER['SERVER_NAME']) ? str_replace('www.', '', $_SERVER['SERVER_NAME']) . '_' : ''); // keep cache file separate by domain |
|
97 | +$PHPTHUMB_CONFIG['cache_prefix'] = 'phpThumb_cache_'.(isset($_SERVER['SERVER_NAME']) ? str_replace('www.', '', $_SERVER['SERVER_NAME']).'_' : ''); // keep cache file separate by domain |
|
98 | 98 | //$PHPTHUMB_CONFIG['cache_prefix'] = 'phpThumb_cache'; // allow phpThumb to share 1 set of cached files even if accessed under different servername/domains on same server |
99 | 99 | |
100 | -$PHPTHUMB_CONFIG['cache_force_passthru'] = true; // if true, cached image data will always be passed to browser; if false, HTTP redirect will be used instead |
|
100 | +$PHPTHUMB_CONFIG['cache_force_passthru'] = true; // if true, cached image data will always be passed to browser; if false, HTTP redirect will be used instead |
|
101 | 101 | |
102 | 102 | // * Temp directory configuration |
103 | 103 | // phpThumb() may need to create temp files. Usually the system temp dir is writable and can be used. |
@@ -105,12 +105,12 @@ discard block |
||
105 | 105 | // you should change this to a full pathname to a directory you do have write access to. |
106 | 106 | //$PHPTHUMB_CONFIG['temp_directory'] = null; // attempt to auto-detect |
107 | 107 | //$PHPTHUMB_CONFIG['temp_directory'] = '/tmp/persistent/phpthumb/cache/'; // set to absolute path |
108 | -$PHPTHUMB_CONFIG['temp_directory'] = $PHPTHUMB_CONFIG['cache_directory']; // set to same as cache directory |
|
108 | +$PHPTHUMB_CONFIG['temp_directory'] = $PHPTHUMB_CONFIG['cache_directory']; // set to same as cache directory |
|
109 | 109 | |
110 | 110 | |
111 | 111 | // ImageMagick configuration |
112 | -$PHPTHUMB_CONFIG['prefer_imagemagick'] = true; // If true, use ImageMagick to resize thumbnails if possible, since it is usually faster than GD functions; if false only use ImageMagick if PHP memory limit is too low. |
|
113 | -$PHPTHUMB_CONFIG['imagemagick_use_thumbnail'] = true; // If true, use ImageMagick's "-thumbnail" resizing parameter (if available) which removes extra non-image metadata (profiles, EXIF info, etc) resulting in much smaller filesize; if false, use "-resize" paramter which retains this info |
|
112 | +$PHPTHUMB_CONFIG['prefer_imagemagick'] = true; // If true, use ImageMagick to resize thumbnails if possible, since it is usually faster than GD functions; if false only use ImageMagick if PHP memory limit is too low. |
|
113 | +$PHPTHUMB_CONFIG['imagemagick_use_thumbnail'] = true; // If true, use ImageMagick's "-thumbnail" resizing parameter (if available) which removes extra non-image metadata (profiles, EXIF info, etc) resulting in much smaller filesize; if false, use "-resize" paramter which retains this info |
|
114 | 114 | if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { |
115 | 115 | // Windows: set absolute pathname |
116 | 116 | $PHPTHUMB_CONFIG['imagemagick_path'] = 'C:/ImageMagick/convert.exe'; |
@@ -131,7 +131,7 @@ discard block |
||
131 | 131 | // As a general guideline, this number will be about 20% of your PHP memory configuration, so 8M = 1,677,722; 16M = 3,355,443; 32M = 6,710,886; etc. |
132 | 132 | if (phpthumb_functions::version_compare_replacement(phpversion(), '4.3.2', '>=') && !defined('memory_get_usage') && !@ini_get('memory_limit')) { |
133 | 133 | // memory_get_usage() will only be defined if your PHP is compiled with the --enable-memory-limit configuration option. |
134 | - $PHPTHUMB_CONFIG['max_source_pixels'] = 0; // no memory limit |
|
134 | + $PHPTHUMB_CONFIG['max_source_pixels'] = 0; // no memory limit |
|
135 | 135 | } else { |
136 | 136 | // calculate default max_source_pixels as 1/6 of memory limit configuration |
137 | 137 | $PHPTHUMB_CONFIG['max_source_pixels'] = round(max((int)(ini_get('memory_limit')), (int)(get_cfg_var('memory_limit'))) * 1048576 / 6); |
@@ -144,41 +144,41 @@ discard block |
||
144 | 144 | |
145 | 145 | // * Default output configuration: |
146 | 146 | $PHPTHUMB_CONFIG['output_format'] = 'png'; // default output format ('jpeg', 'png' or 'gif') - thumbnail will be output in this format (if available in your version of GD or ImageMagick). This is only used if the "f" parameter is not specified, and if the thumbnail can't be output in the input format. |
147 | -$PHPTHUMB_CONFIG['output_maxwidth'] = 0; // default maximum thumbnail width. If this is zero then default width is the width of the source image. This is always overridden by ?w=___ GETstring parameter |
|
148 | -$PHPTHUMB_CONFIG['output_maxheight'] = 0; // default maximum thumbnail height. If this is zero then default height is the height of the source image. This is always overridden by ?h=___ GETstring parameter |
|
149 | -$PHPTHUMB_CONFIG['output_interlace'] = true; // if true: interlaced output for GIF/PNG, progressive output for JPEG; if false: non-interlaced for GIF/PNG, baseline for JPEG. |
|
147 | +$PHPTHUMB_CONFIG['output_maxwidth'] = 0; // default maximum thumbnail width. If this is zero then default width is the width of the source image. This is always overridden by ?w=___ GETstring parameter |
|
148 | +$PHPTHUMB_CONFIG['output_maxheight'] = 0; // default maximum thumbnail height. If this is zero then default height is the height of the source image. This is always overridden by ?h=___ GETstring parameter |
|
149 | +$PHPTHUMB_CONFIG['output_interlace'] = true; // if true: interlaced output for GIF/PNG, progressive output for JPEG; if false: non-interlaced for GIF/PNG, baseline for JPEG. |
|
150 | 150 | |
151 | 151 | // * Error message configuration |
152 | -$PHPTHUMB_CONFIG['error_image_width'] = 300; // default width for error images |
|
153 | -$PHPTHUMB_CONFIG['error_image_height'] = 100; // default height for error images |
|
154 | -$PHPTHUMB_CONFIG['error_message_image_default'] = ''; // Set this to the name of a generic error image (e.g. '/images/error.png') that you want displayed in place of any error message that may occur. This setting is overridden by the 'err' parameter, which does the same thing. |
|
152 | +$PHPTHUMB_CONFIG['error_image_width'] = 300; // default width for error images |
|
153 | +$PHPTHUMB_CONFIG['error_image_height'] = 100; // default height for error images |
|
154 | +$PHPTHUMB_CONFIG['error_message_image_default'] = ''; // Set this to the name of a generic error image (e.g. '/images/error.png') that you want displayed in place of any error message that may occur. This setting is overridden by the 'err' parameter, which does the same thing. |
|
155 | 155 | $PHPTHUMB_CONFIG['error_bgcolor'] = 'CCCCFF'; // background color of error message images |
156 | 156 | $PHPTHUMB_CONFIG['error_textcolor'] = 'FF0000'; // color of text in error messages |
157 | -$PHPTHUMB_CONFIG['error_fontsize'] = 1; // size of text in error messages, from 1 (smallest) to 5 (largest) |
|
158 | -$PHPTHUMB_CONFIG['error_die_on_error'] = true; // die with error message on any fatal error (recommended with standalone phpThumb.php) |
|
159 | -$PHPTHUMB_CONFIG['error_silent_die_on_error'] = false; // simply die with no output of any kind on fatal errors (not recommended) |
|
160 | -$PHPTHUMB_CONFIG['error_die_on_source_failure'] = true; // die with error message if source image cannot be processed by phpThumb() (usually because source image is corrupt in some way). If false the source image will be passed through unprocessed, if true (default) an error message will be displayed. |
|
157 | +$PHPTHUMB_CONFIG['error_fontsize'] = 1; // size of text in error messages, from 1 (smallest) to 5 (largest) |
|
158 | +$PHPTHUMB_CONFIG['error_die_on_error'] = true; // die with error message on any fatal error (recommended with standalone phpThumb.php) |
|
159 | +$PHPTHUMB_CONFIG['error_silent_die_on_error'] = false; // simply die with no output of any kind on fatal errors (not recommended) |
|
160 | +$PHPTHUMB_CONFIG['error_die_on_source_failure'] = true; // die with error message if source image cannot be processed by phpThumb() (usually because source image is corrupt in some way). If false the source image will be passed through unprocessed, if true (default) an error message will be displayed. |
|
161 | 161 | |
162 | 162 | // * Off-server Thumbnailing Configuration: |
163 | -$PHPTHUMB_CONFIG['nohotlink_enabled'] = false; // If false will allow thumbnailing from any source domain, if true then only domains in 'nohotlink_valid_domains' will be accepted |
|
164 | -$PHPTHUMB_CONFIG['nohotlink_valid_domains'] = array(@$_SERVER['HTTP_HOST']); // This is the list of domains for which thumbnails are allowed to be created. Note: domain only, do not include port numbers. The default value of the current domain should be fine in most cases, but if neccesary you can add more domains in here, in the format "www.example.com" |
|
165 | -$PHPTHUMB_CONFIG['nohotlink_erase_image'] = true; // if true thumbnail is covered up with $PHPTHUMB_CONFIG['nohotlink_fill_color'] before text is applied, if false text is written over top of thumbnail |
|
163 | +$PHPTHUMB_CONFIG['nohotlink_enabled'] = false; // If false will allow thumbnailing from any source domain, if true then only domains in 'nohotlink_valid_domains' will be accepted |
|
164 | +$PHPTHUMB_CONFIG['nohotlink_valid_domains'] = array(@$_SERVER['HTTP_HOST']); // This is the list of domains for which thumbnails are allowed to be created. Note: domain only, do not include port numbers. The default value of the current domain should be fine in most cases, but if neccesary you can add more domains in here, in the format "www.example.com" |
|
165 | +$PHPTHUMB_CONFIG['nohotlink_erase_image'] = true; // if true thumbnail is covered up with $PHPTHUMB_CONFIG['nohotlink_fill_color'] before text is applied, if false text is written over top of thumbnail |
|
166 | 166 | $PHPTHUMB_CONFIG['nohotlink_text_message'] = 'Off-server thumbnailing is not allowed'; // text of error message |
167 | 167 | |
168 | 168 | // * Off-server Linking Configuration: |
169 | -$PHPTHUMB_CONFIG['nooffsitelink_enabled'] = false; // If false will allow thumbnails to be linked to from any domain, if true only domains listed below in 'nooffsitelink_valid_domains' will be allowed. |
|
170 | -$PHPTHUMB_CONFIG['nooffsitelink_valid_domains'] = array(@$_SERVER['HTTP_HOST']); // This is the list of domains for which thumbnails are allowed to be created. The default value of the current domain should be fine in most cases, but if neccesary you can add more domains in here, in the format 'www.example.com' |
|
171 | -$PHPTHUMB_CONFIG['nooffsitelink_require_refer'] = false; // If false will allow standalone calls to phpThumb(). If true then only requests with a $_SERVER['HTTP_REFERER'] value in 'nooffsitelink_valid_domains' are allowed. |
|
172 | -$PHPTHUMB_CONFIG['nooffsitelink_erase_image'] = false; // if true thumbnail is covered up with $PHPTHUMB_CONFIG['nohotlink_fill_color'] before text is applied, if false text is written over top of thumbnail |
|
173 | -$PHPTHUMB_CONFIG['nooffsitelink_watermark_src'] = '/demo/images/watermark.png'; // webroot-relative image to overlay on hotlinked images |
|
174 | -$PHPTHUMB_CONFIG['nooffsitelink_text_message'] = 'Image taken from ' . @$_SERVER['HTTP_HOST']; // text of error message (used if [nooffsitelink_watermark_src] is not a valid image) |
|
169 | +$PHPTHUMB_CONFIG['nooffsitelink_enabled'] = false; // If false will allow thumbnails to be linked to from any domain, if true only domains listed below in 'nooffsitelink_valid_domains' will be allowed. |
|
170 | +$PHPTHUMB_CONFIG['nooffsitelink_valid_domains'] = array(@$_SERVER['HTTP_HOST']); // This is the list of domains for which thumbnails are allowed to be created. The default value of the current domain should be fine in most cases, but if neccesary you can add more domains in here, in the format 'www.example.com' |
|
171 | +$PHPTHUMB_CONFIG['nooffsitelink_require_refer'] = false; // If false will allow standalone calls to phpThumb(). If true then only requests with a $_SERVER['HTTP_REFERER'] value in 'nooffsitelink_valid_domains' are allowed. |
|
172 | +$PHPTHUMB_CONFIG['nooffsitelink_erase_image'] = false; // if true thumbnail is covered up with $PHPTHUMB_CONFIG['nohotlink_fill_color'] before text is applied, if false text is written over top of thumbnail |
|
173 | +$PHPTHUMB_CONFIG['nooffsitelink_watermark_src'] = '/demo/images/watermark.png'; // webroot-relative image to overlay on hotlinked images |
|
174 | +$PHPTHUMB_CONFIG['nooffsitelink_text_message'] = 'Image taken from '.@$_SERVER['HTTP_HOST']; // text of error message (used if [nooffsitelink_watermark_src] is not a valid image) |
|
175 | 175 | |
176 | 176 | // * Border & Background default colors |
177 | 177 | $PHPTHUMB_CONFIG['border_hexcolor'] = '000000'; // Default border color - usual HTML-style hex color notation (overidden with 'bc' parameter) |
178 | 178 | $PHPTHUMB_CONFIG['background_hexcolor'] = 'FFFFFF'; // Default background color when thumbnail aspect ratio does not match fixed-dimension box - usual HTML-style hex color notation (overridden with 'bg' parameter) |
179 | 179 | |
180 | 180 | // * Watermark configuration |
181 | -$PHPTHUMB_CONFIG['ttf_directory'] = __DIR__ . '/fonts'; // Base directory for TTF font files |
|
181 | +$PHPTHUMB_CONFIG['ttf_directory'] = __DIR__.'/fonts'; // Base directory for TTF font files |
|
182 | 182 | //$PHPTHUMB_CONFIG['ttf_directory'] = 'c:/windows/fonts'; |
183 | 183 | |
184 | 184 | // * MySQL configuration |
@@ -201,18 +201,18 @@ discard block |
||
201 | 201 | //$PHPTHUMB_CONFIG['http_user_agent'] = ''; // PHP default: none |
202 | 202 | //$PHPTHUMB_CONFIG['http_user_agent'] = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'; // Windows XP, Internet Explorer |
203 | 203 | //$PHPTHUMB_CONFIG['http_user_agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7'; // Windows XP, Firefox |
204 | -$PHPTHUMB_CONFIG['http_user_agent'] = @$_SERVER['HTTP_USER_AGENT']; // use client user-agent |
|
204 | +$PHPTHUMB_CONFIG['http_user_agent'] = @$_SERVER['HTTP_USER_AGENT']; // use client user-agent |
|
205 | 205 | |
206 | 206 | |
207 | 207 | // * Compatability settings |
208 | -$PHPTHUMB_CONFIG['disable_pathinfo_parsing'] = false; // if true, $_SERVER[PATH_INFO] is not parsed. May be needed on some server configurations to allow normal behavior. |
|
209 | -$PHPTHUMB_CONFIG['disable_imagecopyresampled'] = false; // if true, imagecopyresampled is replaced with ImageCopyResampleBicubic. May be needed for buggy versions of PHP-GD. |
|
210 | -$PHPTHUMB_CONFIG['disable_onlycreateable_passthru'] = true; // if true, any image that can be parsed by getimagesize() can be passed through; if false, only images that can be converted to GD by ImageCreateFrom(JPEG|GIF|PNG) functions are allowed |
|
211 | -$PHPTHUMB_CONFIG['disable_realpath'] = false; // PHP realpath() function requires that "the running script must have executable permissions on all directories in the hierarchy, otherwise realpath() will return FALSE". Set config_disable_realpath=false to enable alternate filename-parsing that does not use realpath() function (but also does not resolve symbolic links) |
|
208 | +$PHPTHUMB_CONFIG['disable_pathinfo_parsing'] = false; // if true, $_SERVER[PATH_INFO] is not parsed. May be needed on some server configurations to allow normal behavior. |
|
209 | +$PHPTHUMB_CONFIG['disable_imagecopyresampled'] = false; // if true, imagecopyresampled is replaced with ImageCopyResampleBicubic. May be needed for buggy versions of PHP-GD. |
|
210 | +$PHPTHUMB_CONFIG['disable_onlycreateable_passthru'] = true; // if true, any image that can be parsed by getimagesize() can be passed through; if false, only images that can be converted to GD by ImageCreateFrom(JPEG|GIF|PNG) functions are allowed |
|
211 | +$PHPTHUMB_CONFIG['disable_realpath'] = false; // PHP realpath() function requires that "the running script must have executable permissions on all directories in the hierarchy, otherwise realpath() will return FALSE". Set config_disable_realpath=false to enable alternate filename-parsing that does not use realpath() function (but also does not resolve symbolic links) |
|
212 | 212 | |
213 | 213 | |
214 | 214 | // * HTTP remote file opening settings |
215 | -$PHPTHUMB_CONFIG['http_fopen_timeout'] = 10; // timeout (in seconds) for fopen / curl / fsockopen |
|
215 | +$PHPTHUMB_CONFIG['http_fopen_timeout'] = 10; // timeout (in seconds) for fopen / curl / fsockopen |
|
216 | 216 | $PHPTHUMB_CONFIG['http_follow_redirect'] = true; // if true (default), follow "302 Found" redirects to new URL; if false, return error message |
217 | 217 | |
218 | 218 | // * Speed optimizations configuration |
@@ -227,7 +227,7 @@ discard block |
||
227 | 227 | /* START DEFAULT PARAMETERS SECTION */ |
228 | 228 | // If any parameters are constant across ALL images, you can set them here |
229 | 229 | |
230 | -$PHPTHUMB_DEFAULTS_GETSTRINGOVERRIDE = true; // if true, any parameters in the URL will override the defaults set here; if false, any parameters set here cannot be overridden in the URL |
|
230 | +$PHPTHUMB_DEFAULTS_GETSTRINGOVERRIDE = true; // if true, any parameters in the URL will override the defaults set here; if false, any parameters set here cannot be overridden in the URL |
|
231 | 231 | $PHPTHUMB_DEFAULTS_DISABLEGETPARAMS = false; // if true, GETstring parameters will be ignored (except for 'src') and only below default parameters will be used; if false, both default and GETstring parameters will be used (depending on $PHPTHUMB_DEFAULTS_GETSTRINGOVERRIDE). Will be auto-set true if !empty($PHPTHUMB_CONFIG['cache_default_only_suffix']) |
232 | 232 | |
233 | 233 | //$PHPTHUMB_DEFAULTS['w'] = 200; |
@@ -246,7 +246,7 @@ discard block |
||
246 | 246 | // echo '<img src="'.htmlspecialchars(phpThumbURL('src=/images/pic.jpg&w=50', '/phpThumb/phpThumb.php')).'">'; |
247 | 247 | |
248 | 248 | $GLOBALS['PHPTHUMB_CONFIG'] = $PHPTHUMB_CONFIG; |
249 | -function phpThumbURL($ParameterString, $path_to_phpThumb='phpThumb.php') { |
|
249 | +function phpThumbURL($ParameterString, $path_to_phpThumb = 'phpThumb.php') { |
|
250 | 250 | global $PHPTHUMB_CONFIG; |
251 | 251 | if (is_array($ParameterString)) { |
252 | 252 | $ParameterStringArray = $ParameterString; |
@@ -43,107 +43,107 @@ |
||
43 | 43 | |
44 | 44 | class phpUnsharpMask { |
45 | 45 | |
46 | - public static function applyUnsharpMask(&$img, $amount, $radius, $threshold) { |
|
47 | - |
|
48 | - // $img is an image that is already created within php using |
|
49 | - // imgcreatetruecolor. No url! $img must be a truecolor image. |
|
50 | - |
|
51 | - // Attempt to calibrate the parameters to Photoshop: |
|
52 | - $amount = min($amount, 500) * 0.016; |
|
53 | - $radius = abs(round(min(50, $radius) * 2)); // Only integers make sense. |
|
54 | - $threshold = min(255, $threshold); |
|
55 | - if ($radius == 0) { |
|
56 | - return true; |
|
57 | - } |
|
58 | - $w = imagesx($img); |
|
59 | - $h = imagesy($img); |
|
60 | - $imgCanvas = imagecreatetruecolor($w, $h); |
|
61 | - $imgBlur = imagecreatetruecolor($w, $h); |
|
62 | - |
|
63 | - // Gaussian blur matrix: |
|
64 | - // |
|
65 | - // 1 2 1 |
|
66 | - // 2 4 2 |
|
67 | - // 1 2 1 |
|
68 | - // |
|
69 | - ////////////////////////////////////////////////// |
|
70 | - |
|
71 | - if (function_exists('imageconvolution')) { // PHP >= 5.1 |
|
72 | - $matrix = array( |
|
73 | - array(1, 2, 1), |
|
74 | - array(2, 4, 2), |
|
75 | - array(1, 2, 1) |
|
76 | - ); |
|
77 | - imagecopy($imgBlur, $img, 0, 0, 0, 0, $w, $h); |
|
78 | - imageconvolution($imgBlur, $matrix, 16, 0); |
|
79 | - |
|
80 | - } else { |
|
81 | - |
|
82 | - // Move copies of the image around one pixel at the time and merge them with weight |
|
83 | - // according to the matrix. The same matrix is simply repeated for higher radii. |
|
84 | - for ($i = 0; $i < $radius; $i++) { |
|
85 | - imagecopy( $imgBlur, $img, 0, 0, 1, 0, $w - 1, $h); // left |
|
86 | - imagecopymerge($imgBlur, $img, 1, 0, 0, 0, $w , $h, 50); // right |
|
87 | - imagecopymerge($imgBlur, $img, 0, 0, 0, 0, $w , $h, 50); // center |
|
88 | - imagecopy( $imgCanvas, $imgBlur, 0, 0, 0, 0, $w , $h); |
|
89 | - imagecopymerge($imgBlur, $imgCanvas, 0, 0, 0, 1, $w , $h - 1, 33.33333); // up |
|
90 | - imagecopymerge($imgBlur, $imgCanvas, 0, 1, 0, 0, $w , $h, 25); // down |
|
91 | - } |
|
92 | - } |
|
93 | - |
|
94 | - if ($threshold > 0){ |
|
95 | - // Calculate the difference between the blurred pixels and the original |
|
96 | - // and set the pixels |
|
97 | - for ($x = 0; $x < $w-1; $x++) { // each row |
|
98 | - for ($y = 0; $y < $h; $y++) { // each pixel |
|
99 | - |
|
100 | - $rgbOrig = imagecolorat($img, $x, $y); |
|
101 | - $rOrig = (($rgbOrig >> 16) & 0xFF); |
|
102 | - $gOrig = (($rgbOrig >> 8) & 0xFF); |
|
103 | - $bOrig = ($rgbOrig & 0xFF); |
|
104 | - |
|
105 | - $rgbBlur = imagecolorat($imgBlur, $x, $y); |
|
106 | - |
|
107 | - $rBlur = (($rgbBlur >> 16) & 0xFF); |
|
108 | - $gBlur = (($rgbBlur >> 8) & 0xFF); |
|
109 | - $bBlur = ($rgbBlur & 0xFF); |
|
110 | - |
|
111 | - // When the masked pixels differ less from the original |
|
112 | - // than the threshold specifies, they are set to their original value. |
|
113 | - $rNew = ((abs($rOrig - $rBlur) >= $threshold) ? max(0, min(255, ($amount * ($rOrig - $rBlur)) + $rOrig)) : $rOrig); |
|
114 | - $gNew = ((abs($gOrig - $gBlur) >= $threshold) ? max(0, min(255, ($amount * ($gOrig - $gBlur)) + $gOrig)) : $gOrig); |
|
115 | - $bNew = ((abs($bOrig - $bBlur) >= $threshold) ? max(0, min(255, ($amount * ($bOrig - $bBlur)) + $bOrig)) : $bOrig); |
|
116 | - |
|
117 | - if (($rOrig != $rNew) || ($gOrig != $gNew) || ($bOrig != $bNew)) { |
|
118 | - $pixCol = imagecolorallocate($img, $rNew, $gNew, $bNew); |
|
119 | - imagesetpixel($img, $x, $y, $pixCol); |
|
120 | - } |
|
121 | - } |
|
122 | - } |
|
123 | - } else { |
|
124 | - for ($x = 0; $x < $w; $x++) { // each row |
|
125 | - for ($y = 0; $y < $h; $y++) { // each pixel |
|
126 | - $rgbOrig = imagecolorat($img, $x, $y); |
|
127 | - $rOrig = (($rgbOrig >> 16) & 0xFF); |
|
128 | - $gOrig = (($rgbOrig >> 8) & 0xFF); |
|
129 | - $bOrig = ($rgbOrig & 0xFF); |
|
130 | - |
|
131 | - $rgbBlur = imagecolorat($imgBlur, $x, $y); |
|
132 | - |
|
133 | - $rBlur = (($rgbBlur >> 16) & 0xFF); |
|
134 | - $gBlur = (($rgbBlur >> 8) & 0xFF); |
|
135 | - $bBlur = ($rgbBlur & 0xFF); |
|
136 | - |
|
137 | - $rNew = min(255, max(0, ($amount * ($rOrig - $rBlur)) + $rOrig)); |
|
138 | - $gNew = min(255, max(0, ($amount * ($gOrig - $gBlur)) + $gOrig)); |
|
139 | - $bNew = min(255, max(0, ($amount * ($bOrig - $bBlur)) + $bOrig)); |
|
140 | - $rgbNew = ($rNew << 16) + ($gNew <<8) + $bNew; |
|
141 | - imagesetpixel($img, $x, $y, $rgbNew); |
|
142 | - } |
|
143 | - } |
|
144 | - } |
|
145 | - imagedestroy($imgCanvas); |
|
146 | - imagedestroy($imgBlur); |
|
147 | - return true; |
|
148 | - } |
|
46 | + public static function applyUnsharpMask(&$img, $amount, $radius, $threshold) { |
|
47 | + |
|
48 | + // $img is an image that is already created within php using |
|
49 | + // imgcreatetruecolor. No url! $img must be a truecolor image. |
|
50 | + |
|
51 | + // Attempt to calibrate the parameters to Photoshop: |
|
52 | + $amount = min($amount, 500) * 0.016; |
|
53 | + $radius = abs(round(min(50, $radius) * 2)); // Only integers make sense. |
|
54 | + $threshold = min(255, $threshold); |
|
55 | + if ($radius == 0) { |
|
56 | + return true; |
|
57 | + } |
|
58 | + $w = imagesx($img); |
|
59 | + $h = imagesy($img); |
|
60 | + $imgCanvas = imagecreatetruecolor($w, $h); |
|
61 | + $imgBlur = imagecreatetruecolor($w, $h); |
|
62 | + |
|
63 | + // Gaussian blur matrix: |
|
64 | + // |
|
65 | + // 1 2 1 |
|
66 | + // 2 4 2 |
|
67 | + // 1 2 1 |
|
68 | + // |
|
69 | + ////////////////////////////////////////////////// |
|
70 | + |
|
71 | + if (function_exists('imageconvolution')) { // PHP >= 5.1 |
|
72 | + $matrix = array( |
|
73 | + array(1, 2, 1), |
|
74 | + array(2, 4, 2), |
|
75 | + array(1, 2, 1) |
|
76 | + ); |
|
77 | + imagecopy($imgBlur, $img, 0, 0, 0, 0, $w, $h); |
|
78 | + imageconvolution($imgBlur, $matrix, 16, 0); |
|
79 | + |
|
80 | + } else { |
|
81 | + |
|
82 | + // Move copies of the image around one pixel at the time and merge them with weight |
|
83 | + // according to the matrix. The same matrix is simply repeated for higher radii. |
|
84 | + for ($i = 0; $i < $radius; $i++) { |
|
85 | + imagecopy( $imgBlur, $img, 0, 0, 1, 0, $w - 1, $h); // left |
|
86 | + imagecopymerge($imgBlur, $img, 1, 0, 0, 0, $w , $h, 50); // right |
|
87 | + imagecopymerge($imgBlur, $img, 0, 0, 0, 0, $w , $h, 50); // center |
|
88 | + imagecopy( $imgCanvas, $imgBlur, 0, 0, 0, 0, $w , $h); |
|
89 | + imagecopymerge($imgBlur, $imgCanvas, 0, 0, 0, 1, $w , $h - 1, 33.33333); // up |
|
90 | + imagecopymerge($imgBlur, $imgCanvas, 0, 1, 0, 0, $w , $h, 25); // down |
|
91 | + } |
|
92 | + } |
|
93 | + |
|
94 | + if ($threshold > 0){ |
|
95 | + // Calculate the difference between the blurred pixels and the original |
|
96 | + // and set the pixels |
|
97 | + for ($x = 0; $x < $w-1; $x++) { // each row |
|
98 | + for ($y = 0; $y < $h; $y++) { // each pixel |
|
99 | + |
|
100 | + $rgbOrig = imagecolorat($img, $x, $y); |
|
101 | + $rOrig = (($rgbOrig >> 16) & 0xFF); |
|
102 | + $gOrig = (($rgbOrig >> 8) & 0xFF); |
|
103 | + $bOrig = ($rgbOrig & 0xFF); |
|
104 | + |
|
105 | + $rgbBlur = imagecolorat($imgBlur, $x, $y); |
|
106 | + |
|
107 | + $rBlur = (($rgbBlur >> 16) & 0xFF); |
|
108 | + $gBlur = (($rgbBlur >> 8) & 0xFF); |
|
109 | + $bBlur = ($rgbBlur & 0xFF); |
|
110 | + |
|
111 | + // When the masked pixels differ less from the original |
|
112 | + // than the threshold specifies, they are set to their original value. |
|
113 | + $rNew = ((abs($rOrig - $rBlur) >= $threshold) ? max(0, min(255, ($amount * ($rOrig - $rBlur)) + $rOrig)) : $rOrig); |
|
114 | + $gNew = ((abs($gOrig - $gBlur) >= $threshold) ? max(0, min(255, ($amount * ($gOrig - $gBlur)) + $gOrig)) : $gOrig); |
|
115 | + $bNew = ((abs($bOrig - $bBlur) >= $threshold) ? max(0, min(255, ($amount * ($bOrig - $bBlur)) + $bOrig)) : $bOrig); |
|
116 | + |
|
117 | + if (($rOrig != $rNew) || ($gOrig != $gNew) || ($bOrig != $bNew)) { |
|
118 | + $pixCol = imagecolorallocate($img, $rNew, $gNew, $bNew); |
|
119 | + imagesetpixel($img, $x, $y, $pixCol); |
|
120 | + } |
|
121 | + } |
|
122 | + } |
|
123 | + } else { |
|
124 | + for ($x = 0; $x < $w; $x++) { // each row |
|
125 | + for ($y = 0; $y < $h; $y++) { // each pixel |
|
126 | + $rgbOrig = imagecolorat($img, $x, $y); |
|
127 | + $rOrig = (($rgbOrig >> 16) & 0xFF); |
|
128 | + $gOrig = (($rgbOrig >> 8) & 0xFF); |
|
129 | + $bOrig = ($rgbOrig & 0xFF); |
|
130 | + |
|
131 | + $rgbBlur = imagecolorat($imgBlur, $x, $y); |
|
132 | + |
|
133 | + $rBlur = (($rgbBlur >> 16) & 0xFF); |
|
134 | + $gBlur = (($rgbBlur >> 8) & 0xFF); |
|
135 | + $bBlur = ($rgbBlur & 0xFF); |
|
136 | + |
|
137 | + $rNew = min(255, max(0, ($amount * ($rOrig - $rBlur)) + $rOrig)); |
|
138 | + $gNew = min(255, max(0, ($amount * ($gOrig - $gBlur)) + $gOrig)); |
|
139 | + $bNew = min(255, max(0, ($amount * ($bOrig - $bBlur)) + $bOrig)); |
|
140 | + $rgbNew = ($rNew << 16) + ($gNew <<8) + $bNew; |
|
141 | + imagesetpixel($img, $x, $y, $rgbNew); |
|
142 | + } |
|
143 | + } |
|
144 | + } |
|
145 | + imagedestroy($imgCanvas); |
|
146 | + imagedestroy($imgBlur); |
|
147 | + return true; |
|
148 | + } |
|
149 | 149 | } |
@@ -81,32 +81,32 @@ discard block |
||
81 | 81 | |
82 | 82 | // Move copies of the image around one pixel at the time and merge them with weight |
83 | 83 | // according to the matrix. The same matrix is simply repeated for higher radii. |
84 | - for ($i = 0; $i < $radius; $i++) { |
|
85 | - imagecopy( $imgBlur, $img, 0, 0, 1, 0, $w - 1, $h); // left |
|
86 | - imagecopymerge($imgBlur, $img, 1, 0, 0, 0, $w , $h, 50); // right |
|
87 | - imagecopymerge($imgBlur, $img, 0, 0, 0, 0, $w , $h, 50); // center |
|
88 | - imagecopy( $imgCanvas, $imgBlur, 0, 0, 0, 0, $w , $h); |
|
89 | - imagecopymerge($imgBlur, $imgCanvas, 0, 0, 0, 1, $w , $h - 1, 33.33333); // up |
|
90 | - imagecopymerge($imgBlur, $imgCanvas, 0, 1, 0, 0, $w , $h, 25); // down |
|
84 | + for ($i = 0; $i < $radius; $i++) { |
|
85 | + imagecopy($imgBlur, $img, 0, 0, 1, 0, $w - 1, $h); // left |
|
86 | + imagecopymerge($imgBlur, $img, 1, 0, 0, 0, $w, $h, 50); // right |
|
87 | + imagecopymerge($imgBlur, $img, 0, 0, 0, 0, $w, $h, 50); // center |
|
88 | + imagecopy($imgCanvas, $imgBlur, 0, 0, 0, 0, $w, $h); |
|
89 | + imagecopymerge($imgBlur, $imgCanvas, 0, 0, 0, 1, $w, $h - 1, 33.33333); // up |
|
90 | + imagecopymerge($imgBlur, $imgCanvas, 0, 1, 0, 0, $w, $h, 25); // down |
|
91 | 91 | } |
92 | 92 | } |
93 | 93 | |
94 | - if ($threshold > 0){ |
|
94 | + if ($threshold > 0) { |
|
95 | 95 | // Calculate the difference between the blurred pixels and the original |
96 | 96 | // and set the pixels |
97 | - for ($x = 0; $x < $w-1; $x++) { // each row |
|
98 | - for ($y = 0; $y < $h; $y++) { // each pixel |
|
97 | + for ($x = 0; $x < $w - 1; $x++) { // each row |
|
98 | + for ($y = 0; $y < $h; $y++) { // each pixel |
|
99 | 99 | |
100 | 100 | $rgbOrig = imagecolorat($img, $x, $y); |
101 | 101 | $rOrig = (($rgbOrig >> 16) & 0xFF); |
102 | - $gOrig = (($rgbOrig >> 8) & 0xFF); |
|
103 | - $bOrig = ($rgbOrig & 0xFF); |
|
102 | + $gOrig = (($rgbOrig >> 8) & 0xFF); |
|
103 | + $bOrig = ($rgbOrig & 0xFF); |
|
104 | 104 | |
105 | 105 | $rgbBlur = imagecolorat($imgBlur, $x, $y); |
106 | 106 | |
107 | 107 | $rBlur = (($rgbBlur >> 16) & 0xFF); |
108 | - $gBlur = (($rgbBlur >> 8) & 0xFF); |
|
109 | - $bBlur = ($rgbBlur & 0xFF); |
|
108 | + $gBlur = (($rgbBlur >> 8) & 0xFF); |
|
109 | + $bBlur = ($rgbBlur & 0xFF); |
|
110 | 110 | |
111 | 111 | // When the masked pixels differ less from the original |
112 | 112 | // than the threshold specifies, they are set to their original value. |
@@ -121,23 +121,23 @@ discard block |
||
121 | 121 | } |
122 | 122 | } |
123 | 123 | } else { |
124 | - for ($x = 0; $x < $w; $x++) { // each row |
|
125 | - for ($y = 0; $y < $h; $y++) { // each pixel |
|
124 | + for ($x = 0; $x < $w; $x++) { // each row |
|
125 | + for ($y = 0; $y < $h; $y++) { // each pixel |
|
126 | 126 | $rgbOrig = imagecolorat($img, $x, $y); |
127 | 127 | $rOrig = (($rgbOrig >> 16) & 0xFF); |
128 | - $gOrig = (($rgbOrig >> 8) & 0xFF); |
|
129 | - $bOrig = ($rgbOrig & 0xFF); |
|
128 | + $gOrig = (($rgbOrig >> 8) & 0xFF); |
|
129 | + $bOrig = ($rgbOrig & 0xFF); |
|
130 | 130 | |
131 | 131 | $rgbBlur = imagecolorat($imgBlur, $x, $y); |
132 | 132 | |
133 | 133 | $rBlur = (($rgbBlur >> 16) & 0xFF); |
134 | - $gBlur = (($rgbBlur >> 8) & 0xFF); |
|
135 | - $bBlur = ($rgbBlur & 0xFF); |
|
134 | + $gBlur = (($rgbBlur >> 8) & 0xFF); |
|
135 | + $bBlur = ($rgbBlur & 0xFF); |
|
136 | 136 | |
137 | 137 | $rNew = min(255, max(0, ($amount * ($rOrig - $rBlur)) + $rOrig)); |
138 | 138 | $gNew = min(255, max(0, ($amount * ($gOrig - $gBlur)) + $gOrig)); |
139 | 139 | $bNew = min(255, max(0, ($amount * ($bOrig - $bBlur)) + $bOrig)); |
140 | - $rgbNew = ($rNew << 16) + ($gNew <<8) + $bNew; |
|
140 | + $rgbNew = ($rNew << 16) + ($gNew << 8) + $bNew; |
|
141 | 141 | imagesetpixel($img, $x, $y, $rgbNew); |
142 | 142 | } |
143 | 143 | } |
@@ -1,10 +1,10 @@ |
||
1 | 1 | <?php |
2 | 2 | if (!file_exists('phpThumb.config.php')) { |
3 | - if (file_exists('phpThumb.config.php.default')) { |
|
4 | - echo 'WARNING! "phpThumb.config.php.default" MUST be renamed to "phpThumb.config.php"'; |
|
5 | - } else { |
|
6 | - echo 'WARNING! "phpThumb.config.php" should exist but does not'; |
|
7 | - } |
|
8 | - exit; |
|
3 | + if (file_exists('phpThumb.config.php.default')) { |
|
4 | + echo 'WARNING! "phpThumb.config.php.default" MUST be renamed to "phpThumb.config.php"'; |
|
5 | + } else { |
|
6 | + echo 'WARNING! "phpThumb.config.php" should exist but does not'; |
|
7 | + } |
|
8 | + exit; |
|
9 | 9 | } |
10 | 10 | header('Location: ./demo/'); |
@@ -11,390 +11,390 @@ discard block |
||
11 | 11 | |
12 | 12 | ob_start(); |
13 | 13 | if (!include_once( __DIR__ .'/phpthumb.functions.php')) { |
14 | - ob_end_flush(); |
|
15 | - die('failed to include_once("'. __DIR__ .'/phpthumb.functions.php")'); |
|
14 | + ob_end_flush(); |
|
15 | + die('failed to include_once("'. __DIR__ .'/phpthumb.functions.php")'); |
|
16 | 16 | } |
17 | 17 | ob_end_clean(); |
18 | 18 | |
19 | 19 | class phpthumb { |
20 | 20 | |
21 | - // public: |
|
22 | - // START PARAMETERS (for object mode and phpThumb.php) |
|
23 | - // See phpthumb.readme.txt for descriptions of what each of these values are |
|
24 | - public $src = null; // SouRCe filename |
|
25 | - public $new = null; // NEW image (phpThumb.php only) |
|
26 | - public $w = null; // Width |
|
27 | - public $h = null; // Height |
|
28 | - public $wp = null; // Width (Portrait Images Only) |
|
29 | - public $hp = null; // Height (Portrait Images Only) |
|
30 | - public $wl = null; // Width (Landscape Images Only) |
|
31 | - public $hl = null; // Height (Landscape Images Only) |
|
32 | - public $ws = null; // Width (Square Images Only) |
|
33 | - public $hs = null; // Height (Square Images Only) |
|
34 | - public $f = null; // output image Format |
|
35 | - public $q = 75; // jpeg output Quality |
|
36 | - public $sx = null; // Source crop top-left X position |
|
37 | - public $sy = null; // Source crop top-left Y position |
|
38 | - public $sw = null; // Source crop Width |
|
39 | - public $sh = null; // Source crop Height |
|
40 | - public $zc = null; // Zoom Crop |
|
41 | - public $bc = null; // Border Color |
|
42 | - public $bg = null; // BackGround color |
|
43 | - public $fltr = array(); // FiLTeRs |
|
44 | - public $goto = null; // GO TO url after processing |
|
45 | - public $err = null; // default ERRor image filename |
|
46 | - public $xto = null; // extract eXif Thumbnail Only |
|
47 | - public $ra = null; // Rotate by Angle |
|
48 | - public $ar = null; // Auto Rotate |
|
49 | - public $aoe = null; // Allow Output Enlargement |
|
50 | - public $far = null; // Fixed Aspect Ratio |
|
51 | - public $iar = null; // Ignore Aspect Ratio |
|
52 | - public $maxb = null; // MAXimum Bytes |
|
53 | - public $down = null; // DOWNload thumbnail filename |
|
54 | - public $md5s = null; // MD5 hash of Source image |
|
55 | - public $sfn = 0; // Source Frame Number |
|
56 | - public $dpi = 150; // Dots Per Inch for vector source formats |
|
57 | - public $sia = null; // Save Image As filename |
|
58 | - |
|
59 | - public $file = null; // >>>deprecated, DO NOT USE, will be removed in future versions<<< |
|
60 | - |
|
61 | - public $phpThumbDebug = null; |
|
62 | - // END PARAMETERS |
|
63 | - |
|
64 | - |
|
65 | - // public: |
|
66 | - // START CONFIGURATION OPTIONS (for object mode only) |
|
67 | - // See phpThumb.config.php for descriptions of what each of these settings do |
|
68 | - |
|
69 | - // * Directory Configuration |
|
70 | - public $config_cache_directory = null; |
|
71 | - public $config_cache_directory_depth = 0; |
|
72 | - public $config_cache_disable_warning = true; |
|
73 | - public $config_cache_source_enabled = false; |
|
74 | - public $config_cache_source_directory = null; |
|
75 | - public $config_temp_directory = null; |
|
76 | - public $config_document_root = null; |
|
77 | - |
|
78 | - // * Default output configuration: |
|
79 | - public $config_output_format = 'jpeg'; |
|
80 | - public $config_output_maxwidth = 0; |
|
81 | - public $config_output_maxheight = 0; |
|
82 | - public $config_output_interlace = true; |
|
83 | - |
|
84 | - // * Error message configuration |
|
85 | - public $config_error_image_width = 400; |
|
86 | - public $config_error_image_height = 100; |
|
87 | - public $config_error_message_image_default = ''; |
|
88 | - public $config_error_bgcolor = 'CCCCFF'; |
|
89 | - public $config_error_textcolor = 'FF0000'; |
|
90 | - public $config_error_fontsize = 1; |
|
91 | - public $config_error_die_on_error = false; |
|
92 | - public $config_error_silent_die_on_error = false; |
|
93 | - public $config_error_die_on_source_failure = true; |
|
94 | - |
|
95 | - // * Anti-Hotlink Configuration: |
|
96 | - public $config_nohotlink_enabled = true; |
|
97 | - public $config_nohotlink_valid_domains = array(); |
|
98 | - public $config_nohotlink_erase_image = true; |
|
99 | - public $config_nohotlink_text_message = 'Off-server thumbnailing is not allowed'; |
|
100 | - // * Off-server Linking Configuration: |
|
101 | - public $config_nooffsitelink_enabled = false; |
|
102 | - public $config_nooffsitelink_valid_domains = array(); |
|
103 | - public $config_nooffsitelink_require_refer = false; |
|
104 | - public $config_nooffsitelink_erase_image = true; |
|
105 | - public $config_nooffsitelink_watermark_src = ''; |
|
106 | - public $config_nooffsitelink_text_message = 'Off-server linking is not allowed'; |
|
107 | - |
|
108 | - // * Border & Background default colors |
|
109 | - public $config_border_hexcolor = '000000'; |
|
110 | - public $config_background_hexcolor = 'FFFFFF'; |
|
111 | - |
|
112 | - // * TrueType Fonts |
|
113 | - public $config_ttf_directory = './fonts'; |
|
114 | - |
|
115 | - public $config_max_source_pixels = null; |
|
116 | - public $config_use_exif_thumbnail_for_speed = false; |
|
117 | - public $config_allow_local_http_src = false; |
|
118 | - |
|
119 | - public $config_imagemagick_path = null; |
|
120 | - public $config_prefer_imagemagick = true; |
|
121 | - public $config_imagemagick_use_thumbnail = true; |
|
122 | - |
|
123 | - public $config_cache_maxage = null; |
|
124 | - public $config_cache_maxsize = null; |
|
125 | - public $config_cache_maxfiles = null; |
|
126 | - public $config_cache_source_filemtime_ignore_local = false; |
|
127 | - public $config_cache_source_filemtime_ignore_remote = true; |
|
128 | - public $config_cache_default_only_suffix = false; |
|
129 | - public $config_cache_force_passthru = true; |
|
130 | - public $config_cache_prefix = ''; // default value set in the constructor below |
|
131 | - |
|
132 | - // * MySQL |
|
133 | - public $config_mysql_extension = null; |
|
134 | - public $config_mysql_query = null; |
|
135 | - public $config_mysql_hostname = null; |
|
136 | - public $config_mysql_username = null; |
|
137 | - public $config_mysql_password = null; |
|
138 | - public $config_mysql_database = null; |
|
139 | - |
|
140 | - // * Security |
|
141 | - public $config_high_security_enabled = true; |
|
142 | - public $config_high_security_password = null; |
|
143 | - public $config_high_security_url_separator = '&'; |
|
144 | - public $config_disable_debug = true; |
|
145 | - public $config_allow_src_above_docroot = false; |
|
146 | - public $config_allow_src_above_phpthumb = true; |
|
147 | - public $config_auto_allow_symlinks = true; // allow symlink target directories without explicitly whitelisting them |
|
148 | - public $config_additional_allowed_dirs = array(); // additional directories to allow source images to be read from |
|
149 | - public $config_file_create_mask = 0755; |
|
150 | - public $config_dir_create_mask = 0755; |
|
151 | - |
|
152 | - // * HTTP fopen |
|
153 | - public $config_http_fopen_timeout = 10; |
|
154 | - public $config_http_follow_redirect = true; |
|
155 | - |
|
156 | - // * Compatability |
|
157 | - public $config_disable_pathinfo_parsing = false; |
|
158 | - public $config_disable_imagecopyresampled = false; |
|
159 | - public $config_disable_onlycreateable_passthru = false; |
|
160 | - public $config_disable_realpath = false; |
|
161 | - |
|
162 | - public $config_http_user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7'; |
|
163 | - |
|
164 | - // END CONFIGURATION OPTIONS |
|
165 | - |
|
166 | - |
|
167 | - // public: error messages (read-only; persistant) |
|
168 | - public $debugmessages = array(); |
|
169 | - public $debugtiming = array(); |
|
170 | - public $fatalerror = null; |
|
171 | - |
|
172 | - |
|
173 | - // private: (should not be modified directly) |
|
174 | - public $thumbnailQuality = 75; |
|
175 | - public $thumbnailFormat = null; |
|
176 | - |
|
177 | - public $sourceFilename = null; |
|
178 | - public $rawImageData = null; |
|
179 | - public $IMresizedData = null; |
|
180 | - public $outputImageData = null; |
|
181 | - |
|
182 | - public $useRawIMoutput = false; |
|
183 | - |
|
184 | - public $gdimg_output = null; |
|
185 | - public $gdimg_source = null; |
|
186 | - |
|
187 | - public $getimagesizeinfo = null; |
|
188 | - |
|
189 | - public $source_width = null; |
|
190 | - public $source_height = null; |
|
191 | - |
|
192 | - public $thumbnailCropX = null; |
|
193 | - public $thumbnailCropY = null; |
|
194 | - public $thumbnailCropW = null; |
|
195 | - public $thumbnailCropH = null; |
|
196 | - |
|
197 | - public $exif_thumbnail_width = null; |
|
198 | - public $exif_thumbnail_height = null; |
|
199 | - public $exif_thumbnail_type = null; |
|
200 | - public $exif_thumbnail_data = null; |
|
201 | - public $exif_raw_data = null; |
|
202 | - |
|
203 | - public $thumbnail_width = null; |
|
204 | - public $thumbnail_height = null; |
|
205 | - public $thumbnail_image_width = null; |
|
206 | - public $thumbnail_image_height = null; |
|
207 | - |
|
208 | - public $tempFilesToDelete = array(); |
|
209 | - public $cache_filename = null; |
|
210 | - |
|
211 | - public $AlphaCapableFormats = array( 'png', 'ico', 'gif'); |
|
212 | - public $is_alpha = false; |
|
213 | - |
|
214 | - public $iswindows = null; |
|
215 | - public $issafemode = null; |
|
216 | - public $php_memory_limit = null; |
|
217 | - |
|
218 | - public $phpthumb_version = '1.7.15-201802181529'; |
|
219 | - |
|
220 | - ////////////////////////////////////////////////////////////////////// |
|
221 | - |
|
222 | - // public: constructor |
|
223 | - public function __construct() { |
|
224 | - $this->phpThumb(); |
|
225 | - } |
|
226 | - |
|
227 | - public function phpThumb() { |
|
228 | - $this->DebugTimingMessage('phpThumb() constructor', __FILE__, __LINE__); |
|
229 | - $this->DebugMessage('phpThumb() v'.$this->phpthumb_version, __FILE__, __LINE__); |
|
230 | - |
|
231 | - foreach (array(ini_get('memory_limit'), get_cfg_var('memory_limit')) as $php_config_memory_limit) { |
|
232 | - if ('' !== $php_config_memory_limit) { |
|
233 | - if (strtoupper($php_config_memory_limit[ strlen($php_config_memory_limit) - 1 ]) == 'G') { // PHP memory limit expressed in Gigabytes |
|
234 | - $php_config_memory_limit = (int) substr($php_config_memory_limit, 0, -1) * 1073741824; |
|
235 | - } elseif (strtoupper($php_config_memory_limit[ strlen($php_config_memory_limit) - 1 ]) == 'M') { // PHP memory limit expressed in Megabytes |
|
236 | - $php_config_memory_limit = (int) substr($php_config_memory_limit, 0, -1) * 1048576; |
|
237 | - } |
|
238 | - $this->php_memory_limit = max($this->php_memory_limit, $php_config_memory_limit); |
|
239 | - } |
|
240 | - } |
|
241 | - if ($this->php_memory_limit > 0) { // could be "-1" for "no limit" |
|
242 | - $this->config_max_source_pixels = round($this->php_memory_limit * 0.20); // 20% of memory_limit |
|
243 | - } |
|
244 | - |
|
245 | - $this->iswindows = (bool) (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'); |
|
246 | - $this->issafemode = (bool) preg_match('#(1|ON)#i', ini_get('safe_mode')); |
|
247 | - $this->config_document_root = (!empty($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $this->config_document_root); |
|
248 | - $this->config_cache_prefix = ( isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'].'_' : ''); |
|
249 | - |
|
250 | - $this->purgeTempFiles(); // purge existing temp files if re-initializing object |
|
251 | - |
|
252 | - $php_sapi_name = strtolower(function_exists('php_sapi_name') ? PHP_SAPI : ''); |
|
253 | - if ($php_sapi_name == 'cli') { |
|
254 | - $this->config_allow_src_above_docroot = true; |
|
255 | - } |
|
256 | - |
|
257 | - if (!$this->config_disable_debug) { |
|
258 | - // if debug mode is enabled, force phpThumbDebug output, do not allow normal thumbnails to be generated |
|
259 | - $this->phpThumbDebug = (null === $this->phpThumbDebug ? 9 : max(1, (int) $this->phpThumbDebug)); |
|
260 | - } |
|
261 | - } |
|
262 | - |
|
263 | - public function __destruct() { |
|
264 | - $this->purgeTempFiles(); |
|
265 | - } |
|
266 | - |
|
267 | - // public: |
|
268 | - public function purgeTempFiles() { |
|
269 | - foreach ($this->tempFilesToDelete as $tempFileToDelete) { |
|
270 | - if (file_exists($tempFileToDelete)) { |
|
271 | - $this->DebugMessage('Deleting temp file "'.$tempFileToDelete.'"', __FILE__, __LINE__); |
|
272 | - @unlink($tempFileToDelete); |
|
273 | - } |
|
274 | - } |
|
275 | - $this->tempFilesToDelete = array(); |
|
276 | - return true; |
|
277 | - } |
|
278 | - |
|
279 | - // public: |
|
280 | - public function setSourceFilename($sourceFilename) { |
|
281 | - //$this->resetObject(); |
|
282 | - //$this->rawImageData = null; |
|
283 | - $this->sourceFilename = $sourceFilename; |
|
284 | - $this->src = $sourceFilename; |
|
285 | - if (null === $this->config_output_format) { |
|
286 | - $sourceFileExtension = strtolower(substr(strrchr($sourceFilename, '.'), 1)); |
|
287 | - if (preg_match('#^[a-z]{3,4}$#', $sourceFileExtension)) { |
|
288 | - $this->config_output_format = $sourceFileExtension; |
|
289 | - $this->DebugMessage('setSourceFilename('.$sourceFilename.') set $this->config_output_format to "'.$sourceFileExtension.'"', __FILE__, __LINE__); |
|
290 | - } else { |
|
291 | - $this->DebugMessage('setSourceFilename('.$sourceFilename.') did NOT set $this->config_output_format to "'.$sourceFileExtension.'" because it did not seem like an appropriate image format', __FILE__, __LINE__); |
|
292 | - } |
|
293 | - } |
|
294 | - $this->DebugMessage('setSourceFilename('.$sourceFilename.') set $this->sourceFilename to "'.$this->sourceFilename.'"', __FILE__, __LINE__); |
|
295 | - return true; |
|
296 | - } |
|
297 | - |
|
298 | - // public: |
|
299 | - public function setSourceData($rawImageData, $sourceFilename='') { |
|
300 | - //$this->resetObject(); |
|
301 | - //$this->sourceFilename = null; |
|
302 | - $this->rawImageData = $rawImageData; |
|
303 | - $this->DebugMessage('setSourceData() setting $this->rawImageData ('.strlen($this->rawImageData).' bytes; magic="'.substr($this->rawImageData, 0, 4).'" ('.phpthumb_functions::HexCharDisplay(substr($this->rawImageData, 0, 4)).'))', __FILE__, __LINE__); |
|
304 | - if ($this->config_cache_source_enabled) { |
|
305 | - $sourceFilename = ($sourceFilename ? $sourceFilename : md5($rawImageData)); |
|
306 | - if (!is_dir($this->config_cache_source_directory)) { |
|
307 | - $this->ErrorImage('$this->config_cache_source_directory ('.$this->config_cache_source_directory.') is not a directory'); |
|
308 | - } elseif (!@is_writable($this->config_cache_source_directory)) { |
|
309 | - $this->ErrorImage('$this->config_cache_source_directory ('.$this->config_cache_source_directory.') is not writable'); |
|
310 | - } |
|
311 | - $this->DebugMessage('setSourceData() attempting to save source image to "'.$this->config_cache_source_directory.DIRECTORY_SEPARATOR.urlencode($sourceFilename).'"', __FILE__, __LINE__); |
|
312 | - if ($fp = @fopen($this->config_cache_source_directory.DIRECTORY_SEPARATOR.urlencode($sourceFilename), 'wb')) { |
|
313 | - fwrite($fp, $rawImageData); |
|
314 | - fclose($fp); |
|
315 | - } elseif (!$this->phpThumbDebug) { |
|
316 | - $this->ErrorImage('setSourceData() failed to write to source cache ('.$this->config_cache_source_directory.DIRECTORY_SEPARATOR.urlencode($sourceFilename).')'); |
|
317 | - } |
|
318 | - } |
|
319 | - return true; |
|
320 | - } |
|
321 | - |
|
322 | - // public: |
|
323 | - public function setSourceImageResource($gdimg) { |
|
324 | - //$this->resetObject(); |
|
325 | - $this->gdimg_source = $gdimg; |
|
326 | - return true; |
|
327 | - } |
|
328 | - |
|
329 | - // public: |
|
330 | - public function setParameter($param, $value) { |
|
331 | - if ($param == 'src') { |
|
332 | - $this->setSourceFilename($this->ResolveFilenameToAbsolute($value)); |
|
333 | - } elseif (@is_array($this->$param)) { |
|
334 | - if (is_array($value)) { |
|
335 | - foreach ($value as $arraykey => $arrayvalue) { |
|
336 | - array_push($this->$param, $arrayvalue); |
|
337 | - } |
|
338 | - } else { |
|
339 | - array_push($this->$param, $value); |
|
340 | - } |
|
341 | - } else { |
|
342 | - $this->$param = $value; |
|
343 | - } |
|
344 | - return true; |
|
345 | - } |
|
346 | - |
|
347 | - // public: |
|
348 | - public function getParameter($param) { |
|
349 | - //if (property_exists('phpThumb', $param)) { |
|
350 | - return $this->$param; |
|
351 | - //} |
|
352 | - //$this->DebugMessage('setParameter() attempting to get non-existant parameter "'.$param.'"', __FILE__, __LINE__); |
|
353 | - //return false; |
|
354 | - } |
|
355 | - |
|
356 | - |
|
357 | - // public: |
|
358 | - public function GenerateThumbnail() { |
|
359 | - |
|
360 | - $this->setOutputFormat(); |
|
361 | - $this->phpThumbDebug('8a'); |
|
362 | - $this->ResolveSource(); |
|
363 | - $this->phpThumbDebug('8b'); |
|
364 | - $this->SetCacheFilename(); |
|
365 | - $this->phpThumbDebug('8c'); |
|
366 | - $this->ExtractEXIFgetImageSize(); |
|
367 | - $this->phpThumbDebug('8d'); |
|
368 | - if ($this->useRawIMoutput) { |
|
369 | - $this->DebugMessage('Skipping rest of GenerateThumbnail() because ($this->useRawIMoutput == true)', __FILE__, __LINE__); |
|
370 | - return true; |
|
371 | - } |
|
372 | - $this->phpThumbDebug('8e'); |
|
373 | - if (!$this->SourceImageToGD()) { |
|
374 | - $this->DebugMessage('SourceImageToGD() failed', __FILE__, __LINE__); |
|
375 | - return false; |
|
376 | - } |
|
377 | - $this->phpThumbDebug('8f'); |
|
378 | - $this->Rotate(); |
|
379 | - $this->phpThumbDebug('8g'); |
|
380 | - $this->CreateGDoutput(); |
|
381 | - $this->phpThumbDebug('8h'); |
|
382 | - |
|
383 | - // default values, also applicable for far="C" |
|
384 | - $destination_offset_x = round(($this->thumbnail_width - $this->thumbnail_image_width) / 2); |
|
385 | - $destination_offset_y = round(($this->thumbnail_height - $this->thumbnail_image_height) / 2); |
|
386 | - if (($this->far == 'L') || ($this->far == 'TL') || ($this->far == 'BL')) { |
|
387 | - $destination_offset_x = 0; |
|
388 | - } |
|
389 | - if (($this->far == 'R') || ($this->far == 'TR') || ($this->far == 'BR')) { |
|
390 | - $destination_offset_x = round($this->thumbnail_width - $this->thumbnail_image_width); |
|
391 | - } |
|
392 | - if (($this->far == 'T') || ($this->far == 'TL') || ($this->far == 'TR')) { |
|
393 | - $destination_offset_y = 0; |
|
394 | - } |
|
395 | - if (($this->far == 'B') || ($this->far == 'BL') || ($this->far == 'BR')) { |
|
396 | - $destination_offset_y = round($this->thumbnail_height - $this->thumbnail_image_height); |
|
397 | - } |
|
21 | + // public: |
|
22 | + // START PARAMETERS (for object mode and phpThumb.php) |
|
23 | + // See phpthumb.readme.txt for descriptions of what each of these values are |
|
24 | + public $src = null; // SouRCe filename |
|
25 | + public $new = null; // NEW image (phpThumb.php only) |
|
26 | + public $w = null; // Width |
|
27 | + public $h = null; // Height |
|
28 | + public $wp = null; // Width (Portrait Images Only) |
|
29 | + public $hp = null; // Height (Portrait Images Only) |
|
30 | + public $wl = null; // Width (Landscape Images Only) |
|
31 | + public $hl = null; // Height (Landscape Images Only) |
|
32 | + public $ws = null; // Width (Square Images Only) |
|
33 | + public $hs = null; // Height (Square Images Only) |
|
34 | + public $f = null; // output image Format |
|
35 | + public $q = 75; // jpeg output Quality |
|
36 | + public $sx = null; // Source crop top-left X position |
|
37 | + public $sy = null; // Source crop top-left Y position |
|
38 | + public $sw = null; // Source crop Width |
|
39 | + public $sh = null; // Source crop Height |
|
40 | + public $zc = null; // Zoom Crop |
|
41 | + public $bc = null; // Border Color |
|
42 | + public $bg = null; // BackGround color |
|
43 | + public $fltr = array(); // FiLTeRs |
|
44 | + public $goto = null; // GO TO url after processing |
|
45 | + public $err = null; // default ERRor image filename |
|
46 | + public $xto = null; // extract eXif Thumbnail Only |
|
47 | + public $ra = null; // Rotate by Angle |
|
48 | + public $ar = null; // Auto Rotate |
|
49 | + public $aoe = null; // Allow Output Enlargement |
|
50 | + public $far = null; // Fixed Aspect Ratio |
|
51 | + public $iar = null; // Ignore Aspect Ratio |
|
52 | + public $maxb = null; // MAXimum Bytes |
|
53 | + public $down = null; // DOWNload thumbnail filename |
|
54 | + public $md5s = null; // MD5 hash of Source image |
|
55 | + public $sfn = 0; // Source Frame Number |
|
56 | + public $dpi = 150; // Dots Per Inch for vector source formats |
|
57 | + public $sia = null; // Save Image As filename |
|
58 | + |
|
59 | + public $file = null; // >>>deprecated, DO NOT USE, will be removed in future versions<<< |
|
60 | + |
|
61 | + public $phpThumbDebug = null; |
|
62 | + // END PARAMETERS |
|
63 | + |
|
64 | + |
|
65 | + // public: |
|
66 | + // START CONFIGURATION OPTIONS (for object mode only) |
|
67 | + // See phpThumb.config.php for descriptions of what each of these settings do |
|
68 | + |
|
69 | + // * Directory Configuration |
|
70 | + public $config_cache_directory = null; |
|
71 | + public $config_cache_directory_depth = 0; |
|
72 | + public $config_cache_disable_warning = true; |
|
73 | + public $config_cache_source_enabled = false; |
|
74 | + public $config_cache_source_directory = null; |
|
75 | + public $config_temp_directory = null; |
|
76 | + public $config_document_root = null; |
|
77 | + |
|
78 | + // * Default output configuration: |
|
79 | + public $config_output_format = 'jpeg'; |
|
80 | + public $config_output_maxwidth = 0; |
|
81 | + public $config_output_maxheight = 0; |
|
82 | + public $config_output_interlace = true; |
|
83 | + |
|
84 | + // * Error message configuration |
|
85 | + public $config_error_image_width = 400; |
|
86 | + public $config_error_image_height = 100; |
|
87 | + public $config_error_message_image_default = ''; |
|
88 | + public $config_error_bgcolor = 'CCCCFF'; |
|
89 | + public $config_error_textcolor = 'FF0000'; |
|
90 | + public $config_error_fontsize = 1; |
|
91 | + public $config_error_die_on_error = false; |
|
92 | + public $config_error_silent_die_on_error = false; |
|
93 | + public $config_error_die_on_source_failure = true; |
|
94 | + |
|
95 | + // * Anti-Hotlink Configuration: |
|
96 | + public $config_nohotlink_enabled = true; |
|
97 | + public $config_nohotlink_valid_domains = array(); |
|
98 | + public $config_nohotlink_erase_image = true; |
|
99 | + public $config_nohotlink_text_message = 'Off-server thumbnailing is not allowed'; |
|
100 | + // * Off-server Linking Configuration: |
|
101 | + public $config_nooffsitelink_enabled = false; |
|
102 | + public $config_nooffsitelink_valid_domains = array(); |
|
103 | + public $config_nooffsitelink_require_refer = false; |
|
104 | + public $config_nooffsitelink_erase_image = true; |
|
105 | + public $config_nooffsitelink_watermark_src = ''; |
|
106 | + public $config_nooffsitelink_text_message = 'Off-server linking is not allowed'; |
|
107 | + |
|
108 | + // * Border & Background default colors |
|
109 | + public $config_border_hexcolor = '000000'; |
|
110 | + public $config_background_hexcolor = 'FFFFFF'; |
|
111 | + |
|
112 | + // * TrueType Fonts |
|
113 | + public $config_ttf_directory = './fonts'; |
|
114 | + |
|
115 | + public $config_max_source_pixels = null; |
|
116 | + public $config_use_exif_thumbnail_for_speed = false; |
|
117 | + public $config_allow_local_http_src = false; |
|
118 | + |
|
119 | + public $config_imagemagick_path = null; |
|
120 | + public $config_prefer_imagemagick = true; |
|
121 | + public $config_imagemagick_use_thumbnail = true; |
|
122 | + |
|
123 | + public $config_cache_maxage = null; |
|
124 | + public $config_cache_maxsize = null; |
|
125 | + public $config_cache_maxfiles = null; |
|
126 | + public $config_cache_source_filemtime_ignore_local = false; |
|
127 | + public $config_cache_source_filemtime_ignore_remote = true; |
|
128 | + public $config_cache_default_only_suffix = false; |
|
129 | + public $config_cache_force_passthru = true; |
|
130 | + public $config_cache_prefix = ''; // default value set in the constructor below |
|
131 | + |
|
132 | + // * MySQL |
|
133 | + public $config_mysql_extension = null; |
|
134 | + public $config_mysql_query = null; |
|
135 | + public $config_mysql_hostname = null; |
|
136 | + public $config_mysql_username = null; |
|
137 | + public $config_mysql_password = null; |
|
138 | + public $config_mysql_database = null; |
|
139 | + |
|
140 | + // * Security |
|
141 | + public $config_high_security_enabled = true; |
|
142 | + public $config_high_security_password = null; |
|
143 | + public $config_high_security_url_separator = '&'; |
|
144 | + public $config_disable_debug = true; |
|
145 | + public $config_allow_src_above_docroot = false; |
|
146 | + public $config_allow_src_above_phpthumb = true; |
|
147 | + public $config_auto_allow_symlinks = true; // allow symlink target directories without explicitly whitelisting them |
|
148 | + public $config_additional_allowed_dirs = array(); // additional directories to allow source images to be read from |
|
149 | + public $config_file_create_mask = 0755; |
|
150 | + public $config_dir_create_mask = 0755; |
|
151 | + |
|
152 | + // * HTTP fopen |
|
153 | + public $config_http_fopen_timeout = 10; |
|
154 | + public $config_http_follow_redirect = true; |
|
155 | + |
|
156 | + // * Compatability |
|
157 | + public $config_disable_pathinfo_parsing = false; |
|
158 | + public $config_disable_imagecopyresampled = false; |
|
159 | + public $config_disable_onlycreateable_passthru = false; |
|
160 | + public $config_disable_realpath = false; |
|
161 | + |
|
162 | + public $config_http_user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7'; |
|
163 | + |
|
164 | + // END CONFIGURATION OPTIONS |
|
165 | + |
|
166 | + |
|
167 | + // public: error messages (read-only; persistant) |
|
168 | + public $debugmessages = array(); |
|
169 | + public $debugtiming = array(); |
|
170 | + public $fatalerror = null; |
|
171 | + |
|
172 | + |
|
173 | + // private: (should not be modified directly) |
|
174 | + public $thumbnailQuality = 75; |
|
175 | + public $thumbnailFormat = null; |
|
176 | + |
|
177 | + public $sourceFilename = null; |
|
178 | + public $rawImageData = null; |
|
179 | + public $IMresizedData = null; |
|
180 | + public $outputImageData = null; |
|
181 | + |
|
182 | + public $useRawIMoutput = false; |
|
183 | + |
|
184 | + public $gdimg_output = null; |
|
185 | + public $gdimg_source = null; |
|
186 | + |
|
187 | + public $getimagesizeinfo = null; |
|
188 | + |
|
189 | + public $source_width = null; |
|
190 | + public $source_height = null; |
|
191 | + |
|
192 | + public $thumbnailCropX = null; |
|
193 | + public $thumbnailCropY = null; |
|
194 | + public $thumbnailCropW = null; |
|
195 | + public $thumbnailCropH = null; |
|
196 | + |
|
197 | + public $exif_thumbnail_width = null; |
|
198 | + public $exif_thumbnail_height = null; |
|
199 | + public $exif_thumbnail_type = null; |
|
200 | + public $exif_thumbnail_data = null; |
|
201 | + public $exif_raw_data = null; |
|
202 | + |
|
203 | + public $thumbnail_width = null; |
|
204 | + public $thumbnail_height = null; |
|
205 | + public $thumbnail_image_width = null; |
|
206 | + public $thumbnail_image_height = null; |
|
207 | + |
|
208 | + public $tempFilesToDelete = array(); |
|
209 | + public $cache_filename = null; |
|
210 | + |
|
211 | + public $AlphaCapableFormats = array( 'png', 'ico', 'gif'); |
|
212 | + public $is_alpha = false; |
|
213 | + |
|
214 | + public $iswindows = null; |
|
215 | + public $issafemode = null; |
|
216 | + public $php_memory_limit = null; |
|
217 | + |
|
218 | + public $phpthumb_version = '1.7.15-201802181529'; |
|
219 | + |
|
220 | + ////////////////////////////////////////////////////////////////////// |
|
221 | + |
|
222 | + // public: constructor |
|
223 | + public function __construct() { |
|
224 | + $this->phpThumb(); |
|
225 | + } |
|
226 | + |
|
227 | + public function phpThumb() { |
|
228 | + $this->DebugTimingMessage('phpThumb() constructor', __FILE__, __LINE__); |
|
229 | + $this->DebugMessage('phpThumb() v'.$this->phpthumb_version, __FILE__, __LINE__); |
|
230 | + |
|
231 | + foreach (array(ini_get('memory_limit'), get_cfg_var('memory_limit')) as $php_config_memory_limit) { |
|
232 | + if ('' !== $php_config_memory_limit) { |
|
233 | + if (strtoupper($php_config_memory_limit[ strlen($php_config_memory_limit) - 1 ]) == 'G') { // PHP memory limit expressed in Gigabytes |
|
234 | + $php_config_memory_limit = (int) substr($php_config_memory_limit, 0, -1) * 1073741824; |
|
235 | + } elseif (strtoupper($php_config_memory_limit[ strlen($php_config_memory_limit) - 1 ]) == 'M') { // PHP memory limit expressed in Megabytes |
|
236 | + $php_config_memory_limit = (int) substr($php_config_memory_limit, 0, -1) * 1048576; |
|
237 | + } |
|
238 | + $this->php_memory_limit = max($this->php_memory_limit, $php_config_memory_limit); |
|
239 | + } |
|
240 | + } |
|
241 | + if ($this->php_memory_limit > 0) { // could be "-1" for "no limit" |
|
242 | + $this->config_max_source_pixels = round($this->php_memory_limit * 0.20); // 20% of memory_limit |
|
243 | + } |
|
244 | + |
|
245 | + $this->iswindows = (bool) (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'); |
|
246 | + $this->issafemode = (bool) preg_match('#(1|ON)#i', ini_get('safe_mode')); |
|
247 | + $this->config_document_root = (!empty($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $this->config_document_root); |
|
248 | + $this->config_cache_prefix = ( isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'].'_' : ''); |
|
249 | + |
|
250 | + $this->purgeTempFiles(); // purge existing temp files if re-initializing object |
|
251 | + |
|
252 | + $php_sapi_name = strtolower(function_exists('php_sapi_name') ? PHP_SAPI : ''); |
|
253 | + if ($php_sapi_name == 'cli') { |
|
254 | + $this->config_allow_src_above_docroot = true; |
|
255 | + } |
|
256 | + |
|
257 | + if (!$this->config_disable_debug) { |
|
258 | + // if debug mode is enabled, force phpThumbDebug output, do not allow normal thumbnails to be generated |
|
259 | + $this->phpThumbDebug = (null === $this->phpThumbDebug ? 9 : max(1, (int) $this->phpThumbDebug)); |
|
260 | + } |
|
261 | + } |
|
262 | + |
|
263 | + public function __destruct() { |
|
264 | + $this->purgeTempFiles(); |
|
265 | + } |
|
266 | + |
|
267 | + // public: |
|
268 | + public function purgeTempFiles() { |
|
269 | + foreach ($this->tempFilesToDelete as $tempFileToDelete) { |
|
270 | + if (file_exists($tempFileToDelete)) { |
|
271 | + $this->DebugMessage('Deleting temp file "'.$tempFileToDelete.'"', __FILE__, __LINE__); |
|
272 | + @unlink($tempFileToDelete); |
|
273 | + } |
|
274 | + } |
|
275 | + $this->tempFilesToDelete = array(); |
|
276 | + return true; |
|
277 | + } |
|
278 | + |
|
279 | + // public: |
|
280 | + public function setSourceFilename($sourceFilename) { |
|
281 | + //$this->resetObject(); |
|
282 | + //$this->rawImageData = null; |
|
283 | + $this->sourceFilename = $sourceFilename; |
|
284 | + $this->src = $sourceFilename; |
|
285 | + if (null === $this->config_output_format) { |
|
286 | + $sourceFileExtension = strtolower(substr(strrchr($sourceFilename, '.'), 1)); |
|
287 | + if (preg_match('#^[a-z]{3,4}$#', $sourceFileExtension)) { |
|
288 | + $this->config_output_format = $sourceFileExtension; |
|
289 | + $this->DebugMessage('setSourceFilename('.$sourceFilename.') set $this->config_output_format to "'.$sourceFileExtension.'"', __FILE__, __LINE__); |
|
290 | + } else { |
|
291 | + $this->DebugMessage('setSourceFilename('.$sourceFilename.') did NOT set $this->config_output_format to "'.$sourceFileExtension.'" because it did not seem like an appropriate image format', __FILE__, __LINE__); |
|
292 | + } |
|
293 | + } |
|
294 | + $this->DebugMessage('setSourceFilename('.$sourceFilename.') set $this->sourceFilename to "'.$this->sourceFilename.'"', __FILE__, __LINE__); |
|
295 | + return true; |
|
296 | + } |
|
297 | + |
|
298 | + // public: |
|
299 | + public function setSourceData($rawImageData, $sourceFilename='') { |
|
300 | + //$this->resetObject(); |
|
301 | + //$this->sourceFilename = null; |
|
302 | + $this->rawImageData = $rawImageData; |
|
303 | + $this->DebugMessage('setSourceData() setting $this->rawImageData ('.strlen($this->rawImageData).' bytes; magic="'.substr($this->rawImageData, 0, 4).'" ('.phpthumb_functions::HexCharDisplay(substr($this->rawImageData, 0, 4)).'))', __FILE__, __LINE__); |
|
304 | + if ($this->config_cache_source_enabled) { |
|
305 | + $sourceFilename = ($sourceFilename ? $sourceFilename : md5($rawImageData)); |
|
306 | + if (!is_dir($this->config_cache_source_directory)) { |
|
307 | + $this->ErrorImage('$this->config_cache_source_directory ('.$this->config_cache_source_directory.') is not a directory'); |
|
308 | + } elseif (!@is_writable($this->config_cache_source_directory)) { |
|
309 | + $this->ErrorImage('$this->config_cache_source_directory ('.$this->config_cache_source_directory.') is not writable'); |
|
310 | + } |
|
311 | + $this->DebugMessage('setSourceData() attempting to save source image to "'.$this->config_cache_source_directory.DIRECTORY_SEPARATOR.urlencode($sourceFilename).'"', __FILE__, __LINE__); |
|
312 | + if ($fp = @fopen($this->config_cache_source_directory.DIRECTORY_SEPARATOR.urlencode($sourceFilename), 'wb')) { |
|
313 | + fwrite($fp, $rawImageData); |
|
314 | + fclose($fp); |
|
315 | + } elseif (!$this->phpThumbDebug) { |
|
316 | + $this->ErrorImage('setSourceData() failed to write to source cache ('.$this->config_cache_source_directory.DIRECTORY_SEPARATOR.urlencode($sourceFilename).')'); |
|
317 | + } |
|
318 | + } |
|
319 | + return true; |
|
320 | + } |
|
321 | + |
|
322 | + // public: |
|
323 | + public function setSourceImageResource($gdimg) { |
|
324 | + //$this->resetObject(); |
|
325 | + $this->gdimg_source = $gdimg; |
|
326 | + return true; |
|
327 | + } |
|
328 | + |
|
329 | + // public: |
|
330 | + public function setParameter($param, $value) { |
|
331 | + if ($param == 'src') { |
|
332 | + $this->setSourceFilename($this->ResolveFilenameToAbsolute($value)); |
|
333 | + } elseif (@is_array($this->$param)) { |
|
334 | + if (is_array($value)) { |
|
335 | + foreach ($value as $arraykey => $arrayvalue) { |
|
336 | + array_push($this->$param, $arrayvalue); |
|
337 | + } |
|
338 | + } else { |
|
339 | + array_push($this->$param, $value); |
|
340 | + } |
|
341 | + } else { |
|
342 | + $this->$param = $value; |
|
343 | + } |
|
344 | + return true; |
|
345 | + } |
|
346 | + |
|
347 | + // public: |
|
348 | + public function getParameter($param) { |
|
349 | + //if (property_exists('phpThumb', $param)) { |
|
350 | + return $this->$param; |
|
351 | + //} |
|
352 | + //$this->DebugMessage('setParameter() attempting to get non-existant parameter "'.$param.'"', __FILE__, __LINE__); |
|
353 | + //return false; |
|
354 | + } |
|
355 | + |
|
356 | + |
|
357 | + // public: |
|
358 | + public function GenerateThumbnail() { |
|
359 | + |
|
360 | + $this->setOutputFormat(); |
|
361 | + $this->phpThumbDebug('8a'); |
|
362 | + $this->ResolveSource(); |
|
363 | + $this->phpThumbDebug('8b'); |
|
364 | + $this->SetCacheFilename(); |
|
365 | + $this->phpThumbDebug('8c'); |
|
366 | + $this->ExtractEXIFgetImageSize(); |
|
367 | + $this->phpThumbDebug('8d'); |
|
368 | + if ($this->useRawIMoutput) { |
|
369 | + $this->DebugMessage('Skipping rest of GenerateThumbnail() because ($this->useRawIMoutput == true)', __FILE__, __LINE__); |
|
370 | + return true; |
|
371 | + } |
|
372 | + $this->phpThumbDebug('8e'); |
|
373 | + if (!$this->SourceImageToGD()) { |
|
374 | + $this->DebugMessage('SourceImageToGD() failed', __FILE__, __LINE__); |
|
375 | + return false; |
|
376 | + } |
|
377 | + $this->phpThumbDebug('8f'); |
|
378 | + $this->Rotate(); |
|
379 | + $this->phpThumbDebug('8g'); |
|
380 | + $this->CreateGDoutput(); |
|
381 | + $this->phpThumbDebug('8h'); |
|
382 | + |
|
383 | + // default values, also applicable for far="C" |
|
384 | + $destination_offset_x = round(($this->thumbnail_width - $this->thumbnail_image_width) / 2); |
|
385 | + $destination_offset_y = round(($this->thumbnail_height - $this->thumbnail_image_height) / 2); |
|
386 | + if (($this->far == 'L') || ($this->far == 'TL') || ($this->far == 'BL')) { |
|
387 | + $destination_offset_x = 0; |
|
388 | + } |
|
389 | + if (($this->far == 'R') || ($this->far == 'TR') || ($this->far == 'BR')) { |
|
390 | + $destination_offset_x = round($this->thumbnail_width - $this->thumbnail_image_width); |
|
391 | + } |
|
392 | + if (($this->far == 'T') || ($this->far == 'TL') || ($this->far == 'TR')) { |
|
393 | + $destination_offset_y = 0; |
|
394 | + } |
|
395 | + if (($this->far == 'B') || ($this->far == 'BL') || ($this->far == 'BR')) { |
|
396 | + $destination_offset_y = round($this->thumbnail_height - $this->thumbnail_image_height); |
|
397 | + } |
|
398 | 398 | |
399 | 399 | // // copy/resize image to appropriate dimensions |
400 | 400 | // $borderThickness = 0; |
@@ -410,100 +410,100 @@ discard block |
||
410 | 410 | // //$this->DebugMessage('Skipping ImageResizeFunction() because BorderThickness="'.$borderThickness.'"', __FILE__, __LINE__); |
411 | 411 | // $this->thumbnail_image_height /= 2; |
412 | 412 | // } |
413 | - $this->ImageResizeFunction( |
|
414 | - $this->gdimg_output, |
|
415 | - $this->gdimg_source, |
|
416 | - $destination_offset_x, |
|
417 | - $destination_offset_y, |
|
418 | - $this->thumbnailCropX, |
|
419 | - $this->thumbnailCropY, |
|
420 | - $this->thumbnail_image_width, |
|
421 | - $this->thumbnail_image_height, |
|
422 | - $this->thumbnailCropW, |
|
423 | - $this->thumbnailCropH |
|
424 | - ); |
|
425 | - |
|
426 | - $this->DebugMessage('memory_get_usage() after copy-resize = '.(function_exists('memory_get_usage') ? @memory_get_usage() : 'n/a'), __FILE__, __LINE__); |
|
427 | - imagedestroy($this->gdimg_source); |
|
428 | - $this->DebugMessage('memory_get_usage() after imagedestroy = '.(function_exists('memory_get_usage') ? @memory_get_usage() : 'n/a'), __FILE__, __LINE__); |
|
429 | - |
|
430 | - $this->phpThumbDebug('8i'); |
|
431 | - $this->AntiOffsiteLinking(); |
|
432 | - $this->phpThumbDebug('8j'); |
|
433 | - $this->ApplyFilters(); |
|
434 | - $this->phpThumbDebug('8k'); |
|
435 | - $this->AlphaChannelFlatten(); |
|
436 | - $this->phpThumbDebug('8l'); |
|
437 | - $this->MaxFileSize(); |
|
438 | - $this->phpThumbDebug('8m'); |
|
439 | - |
|
440 | - $this->DebugMessage('GenerateThumbnail() completed successfully', __FILE__, __LINE__); |
|
441 | - return true; |
|
442 | - } |
|
443 | - |
|
444 | - |
|
445 | - // public: |
|
446 | - public function RenderOutput() { |
|
447 | - if (!$this->useRawIMoutput && !is_resource($this->gdimg_output)) { |
|
448 | - $this->DebugMessage('RenderOutput() failed because !is_resource($this->gdimg_output)', __FILE__, __LINE__); |
|
449 | - return false; |
|
450 | - } |
|
451 | - if (!$this->thumbnailFormat) { |
|
452 | - $this->DebugMessage('RenderOutput() failed because $this->thumbnailFormat is empty', __FILE__, __LINE__); |
|
453 | - return false; |
|
454 | - } |
|
455 | - if ($this->useRawIMoutput) { |
|
456 | - $this->DebugMessage('RenderOutput copying $this->IMresizedData ('.strlen($this->IMresizedData).' bytes) to $this->outputImage', __FILE__, __LINE__); |
|
457 | - $this->outputImageData = $this->IMresizedData; |
|
458 | - return true; |
|
459 | - } |
|
460 | - |
|
461 | - $builtin_formats = array(); |
|
462 | - if (function_exists('imagetypes')) { |
|
463 | - $imagetypes = imagetypes(); |
|
464 | - $builtin_formats['wbmp'] = (bool) ($imagetypes & IMG_WBMP); |
|
465 | - $builtin_formats['jpg'] = (bool) ($imagetypes & IMG_JPG); |
|
466 | - $builtin_formats['gif'] = (bool) ($imagetypes & IMG_GIF); |
|
467 | - $builtin_formats['png'] = (bool) ($imagetypes & IMG_PNG); |
|
468 | - } |
|
469 | - |
|
470 | - $this->DebugMessage('imageinterlace($this->gdimg_output, '. (int) $this->config_output_interlace .')', __FILE__, __LINE__); |
|
471 | - imageinterlace($this->gdimg_output, (int) $this->config_output_interlace); |
|
472 | - |
|
473 | - $this->DebugMessage('RenderOutput() attempting image'.strtolower(@$this->thumbnailFormat).'($this->gdimg_output)', __FILE__, __LINE__); |
|
474 | - ob_start(); |
|
475 | - switch ($this->thumbnailFormat) { |
|
476 | - case 'wbmp': |
|
477 | - if (empty($builtin_formats['wbmp'])) { |
|
478 | - $this->DebugMessage('GD does not have required built-in support for WBMP output', __FILE__, __LINE__); |
|
479 | - ob_end_clean(); |
|
480 | - return false; |
|
481 | - } |
|
482 | - imagejpeg($this->gdimg_output, null, $this->thumbnailQuality); |
|
483 | - $this->outputImageData = ob_get_contents(); |
|
484 | - break; |
|
485 | - |
|
486 | - case 'jpeg': |
|
487 | - case 'jpg': // should be "jpeg" not "jpg" but just in case... |
|
488 | - if (empty($builtin_formats['jpg'])) { |
|
489 | - $this->DebugMessage('GD does not have required built-in support for JPEG output', __FILE__, __LINE__); |
|
490 | - ob_end_clean(); |
|
491 | - return false; |
|
492 | - } |
|
493 | - imagejpeg($this->gdimg_output, null, $this->thumbnailQuality); |
|
494 | - $this->outputImageData = ob_get_contents(); |
|
495 | - break; |
|
496 | - |
|
497 | - case 'png': |
|
498 | - if (empty($builtin_formats['png'])) { |
|
499 | - $this->DebugMessage('GD does not have required built-in support for PNG output', __FILE__, __LINE__); |
|
500 | - ob_end_clean(); |
|
501 | - return false; |
|
502 | - } |
|
503 | - if (phpthumb_functions::version_compare_replacement(PHP_VERSION, '5.1.2', '>=')) { |
|
504 | - // https://github.com/JamesHeinrich/phpThumb/issues/24 |
|
505 | - |
|
506 | - /* http://php.net/manual/en/function.imagepng.php: |
|
413 | + $this->ImageResizeFunction( |
|
414 | + $this->gdimg_output, |
|
415 | + $this->gdimg_source, |
|
416 | + $destination_offset_x, |
|
417 | + $destination_offset_y, |
|
418 | + $this->thumbnailCropX, |
|
419 | + $this->thumbnailCropY, |
|
420 | + $this->thumbnail_image_width, |
|
421 | + $this->thumbnail_image_height, |
|
422 | + $this->thumbnailCropW, |
|
423 | + $this->thumbnailCropH |
|
424 | + ); |
|
425 | + |
|
426 | + $this->DebugMessage('memory_get_usage() after copy-resize = '.(function_exists('memory_get_usage') ? @memory_get_usage() : 'n/a'), __FILE__, __LINE__); |
|
427 | + imagedestroy($this->gdimg_source); |
|
428 | + $this->DebugMessage('memory_get_usage() after imagedestroy = '.(function_exists('memory_get_usage') ? @memory_get_usage() : 'n/a'), __FILE__, __LINE__); |
|
429 | + |
|
430 | + $this->phpThumbDebug('8i'); |
|
431 | + $this->AntiOffsiteLinking(); |
|
432 | + $this->phpThumbDebug('8j'); |
|
433 | + $this->ApplyFilters(); |
|
434 | + $this->phpThumbDebug('8k'); |
|
435 | + $this->AlphaChannelFlatten(); |
|
436 | + $this->phpThumbDebug('8l'); |
|
437 | + $this->MaxFileSize(); |
|
438 | + $this->phpThumbDebug('8m'); |
|
439 | + |
|
440 | + $this->DebugMessage('GenerateThumbnail() completed successfully', __FILE__, __LINE__); |
|
441 | + return true; |
|
442 | + } |
|
443 | + |
|
444 | + |
|
445 | + // public: |
|
446 | + public function RenderOutput() { |
|
447 | + if (!$this->useRawIMoutput && !is_resource($this->gdimg_output)) { |
|
448 | + $this->DebugMessage('RenderOutput() failed because !is_resource($this->gdimg_output)', __FILE__, __LINE__); |
|
449 | + return false; |
|
450 | + } |
|
451 | + if (!$this->thumbnailFormat) { |
|
452 | + $this->DebugMessage('RenderOutput() failed because $this->thumbnailFormat is empty', __FILE__, __LINE__); |
|
453 | + return false; |
|
454 | + } |
|
455 | + if ($this->useRawIMoutput) { |
|
456 | + $this->DebugMessage('RenderOutput copying $this->IMresizedData ('.strlen($this->IMresizedData).' bytes) to $this->outputImage', __FILE__, __LINE__); |
|
457 | + $this->outputImageData = $this->IMresizedData; |
|
458 | + return true; |
|
459 | + } |
|
460 | + |
|
461 | + $builtin_formats = array(); |
|
462 | + if (function_exists('imagetypes')) { |
|
463 | + $imagetypes = imagetypes(); |
|
464 | + $builtin_formats['wbmp'] = (bool) ($imagetypes & IMG_WBMP); |
|
465 | + $builtin_formats['jpg'] = (bool) ($imagetypes & IMG_JPG); |
|
466 | + $builtin_formats['gif'] = (bool) ($imagetypes & IMG_GIF); |
|
467 | + $builtin_formats['png'] = (bool) ($imagetypes & IMG_PNG); |
|
468 | + } |
|
469 | + |
|
470 | + $this->DebugMessage('imageinterlace($this->gdimg_output, '. (int) $this->config_output_interlace .')', __FILE__, __LINE__); |
|
471 | + imageinterlace($this->gdimg_output, (int) $this->config_output_interlace); |
|
472 | + |
|
473 | + $this->DebugMessage('RenderOutput() attempting image'.strtolower(@$this->thumbnailFormat).'($this->gdimg_output)', __FILE__, __LINE__); |
|
474 | + ob_start(); |
|
475 | + switch ($this->thumbnailFormat) { |
|
476 | + case 'wbmp': |
|
477 | + if (empty($builtin_formats['wbmp'])) { |
|
478 | + $this->DebugMessage('GD does not have required built-in support for WBMP output', __FILE__, __LINE__); |
|
479 | + ob_end_clean(); |
|
480 | + return false; |
|
481 | + } |
|
482 | + imagejpeg($this->gdimg_output, null, $this->thumbnailQuality); |
|
483 | + $this->outputImageData = ob_get_contents(); |
|
484 | + break; |
|
485 | + |
|
486 | + case 'jpeg': |
|
487 | + case 'jpg': // should be "jpeg" not "jpg" but just in case... |
|
488 | + if (empty($builtin_formats['jpg'])) { |
|
489 | + $this->DebugMessage('GD does not have required built-in support for JPEG output', __FILE__, __LINE__); |
|
490 | + ob_end_clean(); |
|
491 | + return false; |
|
492 | + } |
|
493 | + imagejpeg($this->gdimg_output, null, $this->thumbnailQuality); |
|
494 | + $this->outputImageData = ob_get_contents(); |
|
495 | + break; |
|
496 | + |
|
497 | + case 'png': |
|
498 | + if (empty($builtin_formats['png'])) { |
|
499 | + $this->DebugMessage('GD does not have required built-in support for PNG output', __FILE__, __LINE__); |
|
500 | + ob_end_clean(); |
|
501 | + return false; |
|
502 | + } |
|
503 | + if (phpthumb_functions::version_compare_replacement(PHP_VERSION, '5.1.2', '>=')) { |
|
504 | + // https://github.com/JamesHeinrich/phpThumb/issues/24 |
|
505 | + |
|
506 | + /* http://php.net/manual/en/function.imagepng.php: |
|
507 | 507 | from php source (gd.h): |
508 | 508 | 2.0.12: Compression level: 0-9 or -1, where 0 is NO COMPRESSION at all, |
509 | 509 | :: 1 is FASTEST but produces larger files, 9 provides the best |
@@ -511,684 +511,684 @@ discard block |
||
511 | 511 | :: -1 selects the default compiled into the zlib library. |
512 | 512 | Conclusion: Based on the Zlib manual (http://www.zlib.net/manual.html) the default compression level is set to 6. |
513 | 513 | */ |
514 | - if (($this->thumbnailQuality >= -1) && ($this->thumbnailQuality <= 9)) { |
|
515 | - $PNGquality = $this->thumbnailQuality; |
|
516 | - } else { |
|
517 | - $this->DebugMessage('Specified thumbnailQuality "'.$this->thumbnailQuality.'" is outside the accepted range (0-9, or -1). Using 6 as default value.', __FILE__, __LINE__); |
|
518 | - $PNGquality = 6; |
|
519 | - } |
|
520 | - imagepng($this->gdimg_output, null, $PNGquality); |
|
521 | - } else { |
|
522 | - imagepng($this->gdimg_output); |
|
523 | - } |
|
524 | - $this->outputImageData = ob_get_contents(); |
|
525 | - break; |
|
526 | - |
|
527 | - case 'gif': |
|
528 | - if (empty($builtin_formats['gif'])) { |
|
529 | - $this->DebugMessage('GD does not have required built-in support for GIF output', __FILE__, __LINE__); |
|
530 | - ob_end_clean(); |
|
531 | - return false; |
|
532 | - } |
|
533 | - imagegif($this->gdimg_output); |
|
534 | - $this->outputImageData = ob_get_contents(); |
|
535 | - break; |
|
536 | - |
|
537 | - case 'bmp': |
|
538 | - if (!@include_once( __DIR__ .'/phpthumb.bmp.php')) { |
|
539 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.bmp.php" which is required for BMP format output', __FILE__, __LINE__); |
|
540 | - ob_end_clean(); |
|
541 | - return false; |
|
542 | - } |
|
543 | - $phpthumb_bmp = new phpthumb_bmp(); |
|
544 | - $this->outputImageData = $phpthumb_bmp->GD2BMPstring($this->gdimg_output); |
|
545 | - unset($phpthumb_bmp); |
|
546 | - break; |
|
547 | - |
|
548 | - case 'ico': |
|
549 | - if (!@include_once( __DIR__ .'/phpthumb.ico.php')) { |
|
550 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.ico.php" which is required for ICO format output', __FILE__, __LINE__); |
|
551 | - ob_end_clean(); |
|
552 | - return false; |
|
553 | - } |
|
554 | - $phpthumb_ico = new phpthumb_ico(); |
|
555 | - $arrayOfOutputImages = array($this->gdimg_output); |
|
556 | - $this->outputImageData = $phpthumb_ico->GD2ICOstring($arrayOfOutputImages); |
|
557 | - unset($phpthumb_ico); |
|
558 | - break; |
|
559 | - |
|
560 | - default: |
|
561 | - $this->DebugMessage('RenderOutput failed because $this->thumbnailFormat "'.$this->thumbnailFormat.'" is not valid', __FILE__, __LINE__); |
|
562 | - ob_end_clean(); |
|
563 | - return false; |
|
564 | - } |
|
565 | - ob_end_clean(); |
|
566 | - if (!$this->outputImageData) { |
|
567 | - $this->DebugMessage('RenderOutput() for "'.$this->thumbnailFormat.'" failed', __FILE__, __LINE__); |
|
568 | - ob_end_clean(); |
|
569 | - return false; |
|
570 | - } |
|
571 | - $this->DebugMessage('RenderOutput() completing with $this->outputImageData = '.strlen($this->outputImageData).' bytes', __FILE__, __LINE__); |
|
572 | - return true; |
|
573 | - } |
|
574 | - |
|
575 | - |
|
576 | - // public: |
|
577 | - public function RenderToFile($filename) { |
|
578 | - if (preg_match('#^[a-z0-9]+://#i', $filename)) { |
|
579 | - $this->DebugMessage('RenderToFile() failed because $filename ('.$filename.') is a URL', __FILE__, __LINE__); |
|
580 | - return false; |
|
581 | - } |
|
582 | - // render thumbnail to this file only, do not cache, do not output to browser |
|
583 | - //$renderfilename = $this->ResolveFilenameToAbsolute(dirname($filename)).DIRECTORY_SEPARATOR.basename($filename); |
|
584 | - $renderfilename = $filename; |
|
585 | - if (($filename{0} != '/') && ($filename{0} != '\\') && ($filename{1} != ':')) { |
|
586 | - $renderfilename = $this->ResolveFilenameToAbsolute($renderfilename); |
|
587 | - } |
|
588 | - if (!@is_writable(dirname($renderfilename))) { |
|
589 | - $this->DebugMessage('RenderToFile() failed because "'.dirname($renderfilename).'/" is not writable', __FILE__, __LINE__); |
|
590 | - return false; |
|
591 | - } |
|
592 | - if (@is_file($renderfilename) && !@is_writable($renderfilename)) { |
|
593 | - $this->DebugMessage('RenderToFile() failed because "'.$renderfilename.'" is not writable', __FILE__, __LINE__); |
|
594 | - return false; |
|
595 | - } |
|
596 | - |
|
597 | - if ($this->RenderOutput()) { |
|
598 | - if (file_put_contents($renderfilename, $this->outputImageData)) { |
|
599 | - @chmod($renderfilename, $this->getParameter('config_file_create_mask')); |
|
600 | - $this->DebugMessage('RenderToFile('.$renderfilename.') succeeded', __FILE__, __LINE__); |
|
601 | - return true; |
|
602 | - } |
|
603 | - if (!@file_exists($renderfilename)) { |
|
604 | - $this->DebugMessage('RenderOutput ['.$this->thumbnailFormat.'('.$renderfilename.')] did not appear to fail, but the output image does not exist either...', __FILE__, __LINE__); |
|
605 | - } |
|
606 | - } else { |
|
607 | - $this->DebugMessage('RenderOutput ['.$this->thumbnailFormat.'('.$renderfilename.')] failed', __FILE__, __LINE__); |
|
608 | - } |
|
609 | - return false; |
|
610 | - } |
|
611 | - |
|
612 | - |
|
613 | - // public: |
|
614 | - public function OutputThumbnail() { |
|
615 | - $this->purgeTempFiles(); |
|
616 | - |
|
617 | - if (!$this->useRawIMoutput && !is_resource($this->gdimg_output)) { |
|
618 | - $this->DebugMessage('OutputThumbnail() failed because !is_resource($this->gdimg_output)', __FILE__, __LINE__); |
|
619 | - return false; |
|
620 | - } |
|
621 | - if (headers_sent()) { |
|
622 | - return $this->ErrorImage('OutputThumbnail() failed - headers already sent'); |
|
623 | - } |
|
624 | - |
|
625 | - $downloadfilename = phpthumb_functions::SanitizeFilename(is_string($this->sia) ? $this->sia : ($this->down ? $this->down : 'phpThumb_generated_thumbnail'.'.'.$this->thumbnailFormat)); |
|
626 | - $this->DebugMessage('Content-Disposition header filename set to "'.$downloadfilename.'"', __FILE__, __LINE__); |
|
627 | - if ($downloadfilename) { |
|
628 | - header('Content-Disposition: '.($this->down ? 'attachment' : 'inline').'; filename="'.$downloadfilename.'"'); |
|
629 | - } else { |
|
630 | - $this->DebugMessage('failed to send Content-Disposition header because $downloadfilename is empty', __FILE__, __LINE__); |
|
631 | - } |
|
632 | - |
|
633 | - if ($this->useRawIMoutput) { |
|
634 | - |
|
635 | - header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
|
636 | - echo $this->IMresizedData; |
|
637 | - |
|
638 | - } else { |
|
639 | - |
|
640 | - $this->DebugMessage('imageinterlace($this->gdimg_output, '. (int) $this->config_output_interlace .')', __FILE__, __LINE__); |
|
641 | - imageinterlace($this->gdimg_output, (int) $this->config_output_interlace); |
|
642 | - switch ($this->thumbnailFormat) { |
|
643 | - case 'jpeg': |
|
644 | - header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
|
645 | - $ImageOutFunction = 'image'.$this->thumbnailFormat; |
|
646 | - @$ImageOutFunction($this->gdimg_output, null, $this->thumbnailQuality); |
|
647 | - break; |
|
648 | - |
|
649 | - case 'png': |
|
650 | - case 'gif': |
|
651 | - header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
|
652 | - $ImageOutFunction = 'image'.$this->thumbnailFormat; |
|
653 | - @$ImageOutFunction($this->gdimg_output); |
|
654 | - break; |
|
655 | - |
|
656 | - case 'bmp': |
|
657 | - if (!@include_once( __DIR__ .'/phpthumb.bmp.php')) { |
|
658 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.bmp.php" which is required for BMP format output', __FILE__, __LINE__); |
|
659 | - return false; |
|
660 | - } |
|
661 | - $phpthumb_bmp = new phpthumb_bmp(); |
|
662 | - if (is_object($phpthumb_bmp)) { |
|
663 | - $bmp_data = $phpthumb_bmp->GD2BMPstring($this->gdimg_output); |
|
664 | - unset($phpthumb_bmp); |
|
665 | - if (!$bmp_data) { |
|
666 | - $this->DebugMessage('$phpthumb_bmp->GD2BMPstring() failed', __FILE__, __LINE__); |
|
667 | - return false; |
|
668 | - } |
|
669 | - header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
|
670 | - echo $bmp_data; |
|
671 | - } else { |
|
672 | - $this->DebugMessage('new phpthumb_bmp() failed', __FILE__, __LINE__); |
|
673 | - return false; |
|
674 | - } |
|
675 | - break; |
|
676 | - |
|
677 | - case 'ico': |
|
678 | - if (!@include_once( __DIR__ .'/phpthumb.ico.php')) { |
|
679 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.ico.php" which is required for ICO format output', __FILE__, __LINE__); |
|
680 | - return false; |
|
681 | - } |
|
682 | - $phpthumb_ico = new phpthumb_ico(); |
|
683 | - if (is_object($phpthumb_ico)) { |
|
684 | - $arrayOfOutputImages = array($this->gdimg_output); |
|
685 | - $ico_data = $phpthumb_ico->GD2ICOstring($arrayOfOutputImages); |
|
686 | - unset($phpthumb_ico); |
|
687 | - if (!$ico_data) { |
|
688 | - $this->DebugMessage('$phpthumb_ico->GD2ICOstring() failed', __FILE__, __LINE__); |
|
689 | - return false; |
|
690 | - } |
|
691 | - header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
|
692 | - echo $ico_data; |
|
693 | - } else { |
|
694 | - $this->DebugMessage('new phpthumb_ico() failed', __FILE__, __LINE__); |
|
695 | - return false; |
|
696 | - } |
|
697 | - break; |
|
698 | - |
|
699 | - default: |
|
700 | - $this->DebugMessage('OutputThumbnail failed because $this->thumbnailFormat "'.$this->thumbnailFormat.'" is not valid', __FILE__, __LINE__); |
|
701 | - return false; |
|
702 | - break; |
|
703 | - } |
|
704 | - |
|
705 | - } |
|
706 | - return true; |
|
707 | - } |
|
708 | - |
|
709 | - |
|
710 | - // public: |
|
711 | - public function CleanUpCacheDirectory() { |
|
712 | - $this->DebugMessage('CleanUpCacheDirectory() set to purge ('.(null === $this->config_cache_maxage ? 'NULL' : number_format($this->config_cache_maxage / 86400, 1)).' days; '.(null === $this->config_cache_maxsize ? 'NULL' : number_format($this->config_cache_maxsize / 1048576, 2)).' MB; '.(null === $this->config_cache_maxfiles ? 'NULL' : number_format($this->config_cache_maxfiles)).' files)', __FILE__, __LINE__); |
|
713 | - |
|
714 | - if (!is_writable($this->config_cache_directory)) { |
|
715 | - $this->DebugMessage('CleanUpCacheDirectory() skipped because "'.$this->config_cache_directory.'" is not writable', __FILE__, __LINE__); |
|
716 | - return true; |
|
717 | - } |
|
718 | - |
|
719 | - // cache status of cache directory for 1 hour to avoid hammering the filesystem functions |
|
720 | - $phpThumbCacheStats_filename = $this->config_cache_directory.DIRECTORY_SEPARATOR.'phpThumbCacheStats.txt'; |
|
721 | - if (file_exists($phpThumbCacheStats_filename) && is_readable($phpThumbCacheStats_filename) && (filemtime($phpThumbCacheStats_filename) >= (time() - 3600))) { |
|
722 | - $this->DebugMessage('CleanUpCacheDirectory() skipped because "'.$phpThumbCacheStats_filename.'" is recently modified', __FILE__, __LINE__); |
|
723 | - return true; |
|
724 | - } |
|
725 | - if (!@touch($phpThumbCacheStats_filename)) { |
|
726 | - $this->DebugMessage('touch('.$phpThumbCacheStats_filename.') failed', __FILE__, __LINE__); |
|
727 | - } |
|
728 | - |
|
729 | - $DeletedKeys = array(); |
|
730 | - $AllFilesInCacheDirectory = array(); |
|
731 | - if (($this->config_cache_maxage > 0) || ($this->config_cache_maxsize > 0) || ($this->config_cache_maxfiles > 0)) { |
|
732 | - $CacheDirOldFilesAge = array(); |
|
733 | - $CacheDirOldFilesSize = array(); |
|
734 | - $AllFilesInCacheDirectory = phpthumb_functions::GetAllFilesInSubfolders($this->config_cache_directory); |
|
735 | - foreach ($AllFilesInCacheDirectory as $fullfilename) { |
|
736 | - if (preg_match('#'.preg_quote($this->config_cache_prefix).'#i', $fullfilename) && file_exists($fullfilename)) { |
|
737 | - $CacheDirOldFilesAge[$fullfilename] = @fileatime($fullfilename); |
|
738 | - if ($CacheDirOldFilesAge[$fullfilename] == 0) { |
|
739 | - $CacheDirOldFilesAge[$fullfilename] = @filemtime($fullfilename); |
|
740 | - } |
|
741 | - $CacheDirOldFilesSize[$fullfilename] = @filesize($fullfilename); |
|
742 | - } |
|
743 | - } |
|
744 | - if (empty($CacheDirOldFilesSize)) { |
|
745 | - $this->DebugMessage('CleanUpCacheDirectory() skipped because $CacheDirOldFilesSize is empty (phpthumb_functions::GetAllFilesInSubfolders('.$this->config_cache_directory.') found no files)', __FILE__, __LINE__); |
|
746 | - return true; |
|
747 | - } |
|
748 | - $DeletedKeys['zerobyte'] = array(); |
|
749 | - foreach ($CacheDirOldFilesSize as $fullfilename => $filesize) { |
|
750 | - // purge all zero-size files more than an hour old (to prevent trying to delete just-created and/or in-use files) |
|
751 | - $cutofftime = time() - 3600; |
|
752 | - if (($filesize == 0) && ($CacheDirOldFilesAge[$fullfilename] < $cutofftime)) { |
|
753 | - $this->DebugMessage('deleting "'.$fullfilename.'"', __FILE__, __LINE__); |
|
754 | - if (@unlink($fullfilename)) { |
|
755 | - $DeletedKeys['zerobyte'][] = $fullfilename; |
|
756 | - unset($CacheDirOldFilesSize[$fullfilename]); |
|
757 | - unset($CacheDirOldFilesAge[$fullfilename]); |
|
758 | - } |
|
759 | - } |
|
760 | - } |
|
761 | - $this->DebugMessage('CleanUpCacheDirectory() purged '.count($DeletedKeys['zerobyte']).' zero-byte files', __FILE__, __LINE__); |
|
762 | - asort($CacheDirOldFilesAge); |
|
763 | - |
|
764 | - if ($this->config_cache_maxfiles > 0) { |
|
765 | - $TotalCachedFiles = count($CacheDirOldFilesAge); |
|
766 | - $DeletedKeys['maxfiles'] = array(); |
|
767 | - foreach ($CacheDirOldFilesAge as $fullfilename => $filedate) { |
|
768 | - if ($TotalCachedFiles > $this->config_cache_maxfiles) { |
|
769 | - $this->DebugMessage('deleting "'.$fullfilename.'"', __FILE__, __LINE__); |
|
770 | - if (@unlink($fullfilename)) { |
|
771 | - $TotalCachedFiles--; |
|
772 | - $DeletedKeys['maxfiles'][] = $fullfilename; |
|
773 | - } |
|
774 | - } else { |
|
775 | - // there are few enough files to keep the rest |
|
776 | - break; |
|
777 | - } |
|
778 | - } |
|
779 | - $this->DebugMessage('CleanUpCacheDirectory() purged '.count($DeletedKeys['maxfiles']).' files based on (config_cache_maxfiles='.$this->config_cache_maxfiles.')', __FILE__, __LINE__); |
|
780 | - foreach ($DeletedKeys['maxfiles'] as $fullfilename) { |
|
781 | - unset($CacheDirOldFilesAge[$fullfilename]); |
|
782 | - unset($CacheDirOldFilesSize[$fullfilename]); |
|
783 | - } |
|
784 | - } |
|
785 | - |
|
786 | - if ($this->config_cache_maxage > 0) { |
|
787 | - $mindate = time() - $this->config_cache_maxage; |
|
788 | - $DeletedKeys['maxage'] = array(); |
|
789 | - foreach ($CacheDirOldFilesAge as $fullfilename => $filedate) { |
|
790 | - if ($filedate > 0) { |
|
791 | - if ($filedate < $mindate) { |
|
792 | - $this->DebugMessage('deleting "'.$fullfilename.'"', __FILE__, __LINE__); |
|
793 | - if (@unlink($fullfilename)) { |
|
794 | - $DeletedKeys['maxage'][] = $fullfilename; |
|
795 | - } |
|
796 | - } else { |
|
797 | - // the rest of the files are new enough to keep |
|
798 | - break; |
|
799 | - } |
|
800 | - } |
|
801 | - } |
|
802 | - $this->DebugMessage('CleanUpCacheDirectory() purged '.count($DeletedKeys['maxage']).' files based on (config_cache_maxage='.$this->config_cache_maxage.')', __FILE__, __LINE__); |
|
803 | - foreach ($DeletedKeys['maxage'] as $fullfilename) { |
|
804 | - unset($CacheDirOldFilesAge[$fullfilename]); |
|
805 | - unset($CacheDirOldFilesSize[$fullfilename]); |
|
806 | - } |
|
807 | - } |
|
808 | - |
|
809 | - if ($this->config_cache_maxsize > 0) { |
|
810 | - $TotalCachedFileSize = array_sum($CacheDirOldFilesSize); |
|
811 | - $DeletedKeys['maxsize'] = array(); |
|
812 | - foreach ($CacheDirOldFilesAge as $fullfilename => $filedate) { |
|
813 | - if ($TotalCachedFileSize > $this->config_cache_maxsize) { |
|
814 | - $this->DebugMessage('deleting "'.$fullfilename.'"', __FILE__, __LINE__); |
|
815 | - if (@unlink($fullfilename)) { |
|
816 | - $TotalCachedFileSize -= $CacheDirOldFilesSize[$fullfilename]; |
|
817 | - $DeletedKeys['maxsize'][] = $fullfilename; |
|
818 | - } |
|
819 | - } else { |
|
820 | - // the total filesizes are small enough to keep the rest of the files |
|
821 | - break; |
|
822 | - } |
|
823 | - } |
|
824 | - $this->DebugMessage('CleanUpCacheDirectory() purged '.count($DeletedKeys['maxsize']).' files based on (config_cache_maxsize='.$this->config_cache_maxsize.')', __FILE__, __LINE__); |
|
825 | - foreach ($DeletedKeys['maxsize'] as $fullfilename) { |
|
826 | - unset($CacheDirOldFilesAge[$fullfilename]); |
|
827 | - unset($CacheDirOldFilesSize[$fullfilename]); |
|
828 | - } |
|
829 | - } |
|
830 | - |
|
831 | - } else { |
|
832 | - $this->DebugMessage('skipping CleanUpCacheDirectory() because config set to not use it', __FILE__, __LINE__); |
|
833 | - } |
|
834 | - $totalpurged = 0; |
|
835 | - foreach ($DeletedKeys as $key => $value) { |
|
836 | - $totalpurged += count($value); |
|
837 | - } |
|
838 | - $this->DebugMessage('CleanUpCacheDirectory() purged '.$totalpurged.' files (from '.count($AllFilesInCacheDirectory).') based on config settings', __FILE__, __LINE__); |
|
839 | - if ($totalpurged > 0) { |
|
840 | - $empty_dirs = array(); |
|
841 | - foreach ($AllFilesInCacheDirectory as $fullfilename) { |
|
842 | - if (is_dir($fullfilename)) { |
|
843 | - $empty_dirs[$this->realPathSafe($fullfilename)] = 1; |
|
844 | - } else { |
|
845 | - unset($empty_dirs[$this->realPathSafe(dirname($fullfilename))]); |
|
846 | - } |
|
847 | - } |
|
848 | - krsort($empty_dirs); |
|
849 | - $totalpurgeddirs = 0; |
|
850 | - foreach ($empty_dirs as $empty_dir => $dummy) { |
|
851 | - if ($empty_dir == $this->config_cache_directory) { |
|
852 | - // shouldn't happen, but just in case, don't let it delete actual cache directory |
|
853 | - continue; |
|
854 | - } elseif (@rmdir($empty_dir)) { |
|
855 | - $totalpurgeddirs++; |
|
856 | - } else { |
|
857 | - $this->DebugMessage('failed to rmdir('.$empty_dir.')', __FILE__, __LINE__); |
|
858 | - } |
|
859 | - } |
|
860 | - $this->DebugMessage('purged '.$totalpurgeddirs.' empty directories', __FILE__, __LINE__); |
|
861 | - } |
|
862 | - return true; |
|
863 | - } |
|
864 | - |
|
865 | - ////////////////////////////////////////////////////////////////////// |
|
866 | - |
|
867 | - // private: re-initializator (call between rendering multiple images with one object) |
|
868 | - public function resetObject() { |
|
869 | - $class_vars = get_class_vars(get_class($this)); |
|
870 | - foreach ($class_vars as $key => $value) { |
|
871 | - // do not clobber debug or config info |
|
872 | - if (!preg_match('#^(config_|debug|fatalerror)#i', $key)) { |
|
873 | - $this->$key = $value; |
|
874 | - } |
|
875 | - } |
|
876 | - $this->phpThumb(); // re-initialize some class variables |
|
877 | - return true; |
|
878 | - } |
|
879 | - |
|
880 | - ////////////////////////////////////////////////////////////////////// |
|
881 | - |
|
882 | - public function ResolveSource() { |
|
883 | - if (is_resource($this->gdimg_source)) { |
|
884 | - $this->DebugMessage('ResolveSource() exiting because is_resource($this->gdimg_source)', __FILE__, __LINE__); |
|
885 | - return true; |
|
886 | - } |
|
887 | - if ($this->rawImageData) { |
|
888 | - $this->sourceFilename = null; |
|
889 | - $this->DebugMessage('ResolveSource() exiting because $this->rawImageData is set ('.number_format(strlen($this->rawImageData)).' bytes)', __FILE__, __LINE__); |
|
890 | - return true; |
|
891 | - } |
|
892 | - if ($this->sourceFilename) { |
|
893 | - $this->sourceFilename = $this->ResolveFilenameToAbsolute($this->sourceFilename); |
|
894 | - $this->DebugMessage('$this->sourceFilename set to "'.$this->sourceFilename.'"', __FILE__, __LINE__); |
|
895 | - } elseif ($this->src) { |
|
896 | - $this->sourceFilename = $this->ResolveFilenameToAbsolute($this->src); |
|
897 | - $this->DebugMessage('$this->sourceFilename set to "'.$this->sourceFilename.'" from $this->src ('.$this->src.')', __FILE__, __LINE__); |
|
898 | - } else { |
|
899 | - return $this->ErrorImage('$this->sourceFilename and $this->src are both empty'); |
|
900 | - } |
|
901 | - if ($this->iswindows && ((substr($this->sourceFilename, 0, 2) == '//') || (substr($this->sourceFilename, 0, 2) == '\\\\'))) { |
|
902 | - // Windows \\share\filename.ext |
|
903 | - } elseif (preg_match('#^[a-z0-9]+://#i', $this->sourceFilename, $protocol_matches)) { |
|
904 | - if (preg_match('#^(f|ht)tps?\://#i', $this->sourceFilename)) { |
|
905 | - // URL |
|
906 | - if ($this->config_http_user_agent) { |
|
907 | - ini_set('user_agent', $this->config_http_user_agent); |
|
908 | - } |
|
909 | - } else { |
|
910 | - return $this->ErrorImage('only FTP and HTTP/HTTPS protocols are allowed, "'.$protocol_matches[1].'" is not'); |
|
911 | - } |
|
912 | - } elseif (!@file_exists($this->sourceFilename)) { |
|
913 | - return $this->ErrorImage('"'.$this->sourceFilename.'" does not exist'); |
|
914 | - } elseif (!@is_file($this->sourceFilename)) { |
|
915 | - return $this->ErrorImage('"'.$this->sourceFilename.'" is not a file'); |
|
916 | - } |
|
917 | - return true; |
|
918 | - } |
|
919 | - |
|
920 | - |
|
921 | - public function setOutputFormat() { |
|
922 | - static $alreadyCalled = false; |
|
923 | - if ($this->thumbnailFormat && $alreadyCalled) { |
|
924 | - return true; |
|
925 | - } |
|
926 | - $alreadyCalled = true; |
|
927 | - |
|
928 | - $AvailableImageOutputFormats = array(); |
|
929 | - $AvailableImageOutputFormats[] = 'text'; |
|
930 | - if (@is_readable( __DIR__ .'/phpthumb.ico.php')) { |
|
931 | - $AvailableImageOutputFormats[] = 'ico'; |
|
932 | - } |
|
933 | - if (@is_readable( __DIR__ .'/phpthumb.bmp.php')) { |
|
934 | - $AvailableImageOutputFormats[] = 'bmp'; |
|
935 | - } |
|
936 | - |
|
937 | - $this->thumbnailFormat = 'ico'; |
|
938 | - |
|
939 | - // Set default output format based on what image types are available |
|
940 | - if (function_exists('imagetypes')) { |
|
941 | - $imagetypes = imagetypes(); |
|
942 | - if ($imagetypes & IMG_WBMP) { |
|
943 | - $this->thumbnailFormat = 'wbmp'; |
|
944 | - $AvailableImageOutputFormats[] = 'wbmp'; |
|
945 | - } |
|
946 | - if ($imagetypes & IMG_GIF) { |
|
947 | - $this->thumbnailFormat = 'gif'; |
|
948 | - $AvailableImageOutputFormats[] = 'gif'; |
|
949 | - } |
|
950 | - if ($imagetypes & IMG_PNG) { |
|
951 | - $this->thumbnailFormat = 'png'; |
|
952 | - $AvailableImageOutputFormats[] = 'png'; |
|
953 | - } |
|
954 | - if ($imagetypes & IMG_JPG) { |
|
955 | - $this->thumbnailFormat = 'jpeg'; |
|
956 | - $AvailableImageOutputFormats[] = 'jpeg'; |
|
957 | - } |
|
958 | - } else { |
|
959 | - $this->DebugMessage('imagetypes() does not exist - GD support might not be enabled?', __FILE__, __LINE__); |
|
960 | - } |
|
961 | - if ($this->ImageMagickVersion()) { |
|
962 | - $IMformats = array('jpeg', 'png', 'gif', 'bmp', 'ico', 'wbmp'); |
|
963 | - $this->DebugMessage('Addding ImageMagick formats to $AvailableImageOutputFormats ('.implode(';', $AvailableImageOutputFormats).')', __FILE__, __LINE__); |
|
964 | - foreach ($IMformats as $key => $format) { |
|
965 | - $AvailableImageOutputFormats[] = $format; |
|
966 | - } |
|
967 | - } |
|
968 | - $AvailableImageOutputFormats = array_unique($AvailableImageOutputFormats); |
|
969 | - $this->DebugMessage('$AvailableImageOutputFormats = array('.implode(';', $AvailableImageOutputFormats).')', __FILE__, __LINE__); |
|
970 | - |
|
971 | - $this->f = preg_replace('#[^a-z]#', '', strtolower($this->f)); |
|
972 | - if (strtolower($this->config_output_format) == 'jpg') { |
|
973 | - $this->config_output_format = 'jpeg'; |
|
974 | - } |
|
975 | - if (strtolower($this->f) == 'jpg') { |
|
976 | - $this->f = 'jpeg'; |
|
977 | - } |
|
978 | - if (phpthumb_functions::CaseInsensitiveInArray($this->config_output_format, $AvailableImageOutputFormats)) { |
|
979 | - // set output format to config default if that format is available |
|
980 | - $this->DebugMessage('$this->thumbnailFormat set to $this->config_output_format "'.strtolower($this->config_output_format).'"', __FILE__, __LINE__); |
|
981 | - $this->thumbnailFormat = strtolower($this->config_output_format); |
|
982 | - } elseif ($this->config_output_format) { |
|
983 | - $this->DebugMessage('$this->thumbnailFormat staying as "'.$this->thumbnailFormat.'" because $this->config_output_format ('.strtolower($this->config_output_format).') is not in $AvailableImageOutputFormats', __FILE__, __LINE__); |
|
984 | - } |
|
985 | - if ($this->f && (phpthumb_functions::CaseInsensitiveInArray($this->f, $AvailableImageOutputFormats))) { |
|
986 | - // override output format if $this->f is set and that format is available |
|
987 | - $this->DebugMessage('$this->thumbnailFormat set to $this->f "'.strtolower($this->f).'"', __FILE__, __LINE__); |
|
988 | - $this->thumbnailFormat = strtolower($this->f); |
|
989 | - } elseif ($this->f) { |
|
990 | - $this->DebugMessage('$this->thumbnailFormat staying as "'.$this->thumbnailFormat.'" because $this->f ('.strtolower($this->f).') is not in $AvailableImageOutputFormats', __FILE__, __LINE__); |
|
991 | - } |
|
992 | - |
|
993 | - // for JPEG images, quality 1 (worst) to 99 (best) |
|
994 | - // quality < 25 is nasty, with not much size savings - not recommended |
|
995 | - // problems with 100 - invalid JPEG? |
|
996 | - $this->thumbnailQuality = max(1, min(99, ($this->q ? (int) $this->q : 75))); |
|
997 | - $this->DebugMessage('$this->thumbnailQuality set to "'.$this->thumbnailQuality.'"', __FILE__, __LINE__); |
|
998 | - |
|
999 | - return true; |
|
1000 | - } |
|
1001 | - |
|
1002 | - |
|
1003 | - public function setCacheDirectory() { |
|
1004 | - // resolve cache directory to absolute pathname |
|
1005 | - $this->DebugMessage('setCacheDirectory() starting with config_cache_directory = "'.$this->config_cache_directory.'"', __FILE__, __LINE__); |
|
1006 | - if ($this->config_cache_directory[ 0 ] == '.') { |
|
1007 | - if (preg_match('#^(f|ht)tps?\://#i', $this->src)) { |
|
1008 | - if (!$this->config_cache_disable_warning) { |
|
1009 | - $this->ErrorImage('$this->config_cache_directory ('.$this->config_cache_directory.') cannot be used for remote images. Adjust "cache_directory" or "cache_disable_warning" in phpThumb.config.php'); |
|
1010 | - } |
|
1011 | - } elseif ($this->src) { |
|
1012 | - // resolve relative cache directory to source image |
|
1013 | - $this->config_cache_directory = dirname($this->ResolveFilenameToAbsolute($this->src)).DIRECTORY_SEPARATOR.$this->config_cache_directory; |
|
1014 | - } else { |
|
1015 | - // $this->new is probably set |
|
1016 | - } |
|
1017 | - } |
|
1018 | - if (substr($this->config_cache_directory, -1) == '/') { |
|
1019 | - $this->config_cache_directory = substr($this->config_cache_directory, 0, -1); |
|
1020 | - } |
|
1021 | - if ($this->iswindows) { |
|
1022 | - $this->config_cache_directory = str_replace('/', DIRECTORY_SEPARATOR, $this->config_cache_directory); |
|
1023 | - } |
|
1024 | - if ($this->config_cache_directory) { |
|
1025 | - $real_cache_path = $this->realPathSafe($this->config_cache_directory); |
|
1026 | - if (!$real_cache_path) { |
|
1027 | - $this->DebugMessage('$this->realPathSafe($this->config_cache_directory) failed for "'.$this->config_cache_directory.'"', __FILE__, __LINE__); |
|
1028 | - if (!is_dir($this->config_cache_directory)) { |
|
1029 | - $this->DebugMessage('!is_dir('.$this->config_cache_directory.')', __FILE__, __LINE__); |
|
1030 | - } |
|
1031 | - } |
|
1032 | - if ($real_cache_path) { |
|
1033 | - $this->DebugMessage('setting config_cache_directory to $this->realPathSafe('.$this->config_cache_directory.') = "'.$real_cache_path.'"', __FILE__, __LINE__); |
|
1034 | - $this->config_cache_directory = $real_cache_path; |
|
1035 | - } |
|
1036 | - } |
|
1037 | - if (!is_dir($this->config_cache_directory)) { |
|
1038 | - if (!$this->config_cache_disable_warning) { |
|
1039 | - $this->ErrorImage('$this->config_cache_directory ('.$this->config_cache_directory.') does not exist. Adjust "cache_directory" or "cache_disable_warning" in phpThumb.config.php'); |
|
1040 | - } |
|
1041 | - $this->DebugMessage('$this->config_cache_directory ('.$this->config_cache_directory.') is not a directory', __FILE__, __LINE__); |
|
1042 | - $this->config_cache_directory = null; |
|
1043 | - } elseif (!@is_writable($this->config_cache_directory)) { |
|
1044 | - $this->DebugMessage('$this->config_cache_directory is not writable ('.$this->config_cache_directory.')', __FILE__, __LINE__); |
|
1045 | - } |
|
1046 | - |
|
1047 | - $this->InitializeTempDirSetting(); |
|
1048 | - if (!@is_dir($this->config_temp_directory) && !@is_writable($this->config_temp_directory) && @is_dir($this->config_cache_directory) && @is_writable($this->config_cache_directory)) { |
|
1049 | - $this->DebugMessage('setting $this->config_temp_directory = $this->config_cache_directory ('.$this->config_cache_directory.')', __FILE__, __LINE__); |
|
1050 | - $this->config_temp_directory = $this->config_cache_directory; |
|
1051 | - } |
|
1052 | - return true; |
|
1053 | - } |
|
1054 | - |
|
1055 | - /* Takes the array of path segments up to now, and the next segment (maybe a modifier: empty, . or ..) |
|
514 | + if (($this->thumbnailQuality >= -1) && ($this->thumbnailQuality <= 9)) { |
|
515 | + $PNGquality = $this->thumbnailQuality; |
|
516 | + } else { |
|
517 | + $this->DebugMessage('Specified thumbnailQuality "'.$this->thumbnailQuality.'" is outside the accepted range (0-9, or -1). Using 6 as default value.', __FILE__, __LINE__); |
|
518 | + $PNGquality = 6; |
|
519 | + } |
|
520 | + imagepng($this->gdimg_output, null, $PNGquality); |
|
521 | + } else { |
|
522 | + imagepng($this->gdimg_output); |
|
523 | + } |
|
524 | + $this->outputImageData = ob_get_contents(); |
|
525 | + break; |
|
526 | + |
|
527 | + case 'gif': |
|
528 | + if (empty($builtin_formats['gif'])) { |
|
529 | + $this->DebugMessage('GD does not have required built-in support for GIF output', __FILE__, __LINE__); |
|
530 | + ob_end_clean(); |
|
531 | + return false; |
|
532 | + } |
|
533 | + imagegif($this->gdimg_output); |
|
534 | + $this->outputImageData = ob_get_contents(); |
|
535 | + break; |
|
536 | + |
|
537 | + case 'bmp': |
|
538 | + if (!@include_once( __DIR__ .'/phpthumb.bmp.php')) { |
|
539 | + $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.bmp.php" which is required for BMP format output', __FILE__, __LINE__); |
|
540 | + ob_end_clean(); |
|
541 | + return false; |
|
542 | + } |
|
543 | + $phpthumb_bmp = new phpthumb_bmp(); |
|
544 | + $this->outputImageData = $phpthumb_bmp->GD2BMPstring($this->gdimg_output); |
|
545 | + unset($phpthumb_bmp); |
|
546 | + break; |
|
547 | + |
|
548 | + case 'ico': |
|
549 | + if (!@include_once( __DIR__ .'/phpthumb.ico.php')) { |
|
550 | + $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.ico.php" which is required for ICO format output', __FILE__, __LINE__); |
|
551 | + ob_end_clean(); |
|
552 | + return false; |
|
553 | + } |
|
554 | + $phpthumb_ico = new phpthumb_ico(); |
|
555 | + $arrayOfOutputImages = array($this->gdimg_output); |
|
556 | + $this->outputImageData = $phpthumb_ico->GD2ICOstring($arrayOfOutputImages); |
|
557 | + unset($phpthumb_ico); |
|
558 | + break; |
|
559 | + |
|
560 | + default: |
|
561 | + $this->DebugMessage('RenderOutput failed because $this->thumbnailFormat "'.$this->thumbnailFormat.'" is not valid', __FILE__, __LINE__); |
|
562 | + ob_end_clean(); |
|
563 | + return false; |
|
564 | + } |
|
565 | + ob_end_clean(); |
|
566 | + if (!$this->outputImageData) { |
|
567 | + $this->DebugMessage('RenderOutput() for "'.$this->thumbnailFormat.'" failed', __FILE__, __LINE__); |
|
568 | + ob_end_clean(); |
|
569 | + return false; |
|
570 | + } |
|
571 | + $this->DebugMessage('RenderOutput() completing with $this->outputImageData = '.strlen($this->outputImageData).' bytes', __FILE__, __LINE__); |
|
572 | + return true; |
|
573 | + } |
|
574 | + |
|
575 | + |
|
576 | + // public: |
|
577 | + public function RenderToFile($filename) { |
|
578 | + if (preg_match('#^[a-z0-9]+://#i', $filename)) { |
|
579 | + $this->DebugMessage('RenderToFile() failed because $filename ('.$filename.') is a URL', __FILE__, __LINE__); |
|
580 | + return false; |
|
581 | + } |
|
582 | + // render thumbnail to this file only, do not cache, do not output to browser |
|
583 | + //$renderfilename = $this->ResolveFilenameToAbsolute(dirname($filename)).DIRECTORY_SEPARATOR.basename($filename); |
|
584 | + $renderfilename = $filename; |
|
585 | + if (($filename{0} != '/') && ($filename{0} != '\\') && ($filename{1} != ':')) { |
|
586 | + $renderfilename = $this->ResolveFilenameToAbsolute($renderfilename); |
|
587 | + } |
|
588 | + if (!@is_writable(dirname($renderfilename))) { |
|
589 | + $this->DebugMessage('RenderToFile() failed because "'.dirname($renderfilename).'/" is not writable', __FILE__, __LINE__); |
|
590 | + return false; |
|
591 | + } |
|
592 | + if (@is_file($renderfilename) && !@is_writable($renderfilename)) { |
|
593 | + $this->DebugMessage('RenderToFile() failed because "'.$renderfilename.'" is not writable', __FILE__, __LINE__); |
|
594 | + return false; |
|
595 | + } |
|
596 | + |
|
597 | + if ($this->RenderOutput()) { |
|
598 | + if (file_put_contents($renderfilename, $this->outputImageData)) { |
|
599 | + @chmod($renderfilename, $this->getParameter('config_file_create_mask')); |
|
600 | + $this->DebugMessage('RenderToFile('.$renderfilename.') succeeded', __FILE__, __LINE__); |
|
601 | + return true; |
|
602 | + } |
|
603 | + if (!@file_exists($renderfilename)) { |
|
604 | + $this->DebugMessage('RenderOutput ['.$this->thumbnailFormat.'('.$renderfilename.')] did not appear to fail, but the output image does not exist either...', __FILE__, __LINE__); |
|
605 | + } |
|
606 | + } else { |
|
607 | + $this->DebugMessage('RenderOutput ['.$this->thumbnailFormat.'('.$renderfilename.')] failed', __FILE__, __LINE__); |
|
608 | + } |
|
609 | + return false; |
|
610 | + } |
|
611 | + |
|
612 | + |
|
613 | + // public: |
|
614 | + public function OutputThumbnail() { |
|
615 | + $this->purgeTempFiles(); |
|
616 | + |
|
617 | + if (!$this->useRawIMoutput && !is_resource($this->gdimg_output)) { |
|
618 | + $this->DebugMessage('OutputThumbnail() failed because !is_resource($this->gdimg_output)', __FILE__, __LINE__); |
|
619 | + return false; |
|
620 | + } |
|
621 | + if (headers_sent()) { |
|
622 | + return $this->ErrorImage('OutputThumbnail() failed - headers already sent'); |
|
623 | + } |
|
624 | + |
|
625 | + $downloadfilename = phpthumb_functions::SanitizeFilename(is_string($this->sia) ? $this->sia : ($this->down ? $this->down : 'phpThumb_generated_thumbnail'.'.'.$this->thumbnailFormat)); |
|
626 | + $this->DebugMessage('Content-Disposition header filename set to "'.$downloadfilename.'"', __FILE__, __LINE__); |
|
627 | + if ($downloadfilename) { |
|
628 | + header('Content-Disposition: '.($this->down ? 'attachment' : 'inline').'; filename="'.$downloadfilename.'"'); |
|
629 | + } else { |
|
630 | + $this->DebugMessage('failed to send Content-Disposition header because $downloadfilename is empty', __FILE__, __LINE__); |
|
631 | + } |
|
632 | + |
|
633 | + if ($this->useRawIMoutput) { |
|
634 | + |
|
635 | + header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
|
636 | + echo $this->IMresizedData; |
|
637 | + |
|
638 | + } else { |
|
639 | + |
|
640 | + $this->DebugMessage('imageinterlace($this->gdimg_output, '. (int) $this->config_output_interlace .')', __FILE__, __LINE__); |
|
641 | + imageinterlace($this->gdimg_output, (int) $this->config_output_interlace); |
|
642 | + switch ($this->thumbnailFormat) { |
|
643 | + case 'jpeg': |
|
644 | + header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
|
645 | + $ImageOutFunction = 'image'.$this->thumbnailFormat; |
|
646 | + @$ImageOutFunction($this->gdimg_output, null, $this->thumbnailQuality); |
|
647 | + break; |
|
648 | + |
|
649 | + case 'png': |
|
650 | + case 'gif': |
|
651 | + header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
|
652 | + $ImageOutFunction = 'image'.$this->thumbnailFormat; |
|
653 | + @$ImageOutFunction($this->gdimg_output); |
|
654 | + break; |
|
655 | + |
|
656 | + case 'bmp': |
|
657 | + if (!@include_once( __DIR__ .'/phpthumb.bmp.php')) { |
|
658 | + $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.bmp.php" which is required for BMP format output', __FILE__, __LINE__); |
|
659 | + return false; |
|
660 | + } |
|
661 | + $phpthumb_bmp = new phpthumb_bmp(); |
|
662 | + if (is_object($phpthumb_bmp)) { |
|
663 | + $bmp_data = $phpthumb_bmp->GD2BMPstring($this->gdimg_output); |
|
664 | + unset($phpthumb_bmp); |
|
665 | + if (!$bmp_data) { |
|
666 | + $this->DebugMessage('$phpthumb_bmp->GD2BMPstring() failed', __FILE__, __LINE__); |
|
667 | + return false; |
|
668 | + } |
|
669 | + header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
|
670 | + echo $bmp_data; |
|
671 | + } else { |
|
672 | + $this->DebugMessage('new phpthumb_bmp() failed', __FILE__, __LINE__); |
|
673 | + return false; |
|
674 | + } |
|
675 | + break; |
|
676 | + |
|
677 | + case 'ico': |
|
678 | + if (!@include_once( __DIR__ .'/phpthumb.ico.php')) { |
|
679 | + $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.ico.php" which is required for ICO format output', __FILE__, __LINE__); |
|
680 | + return false; |
|
681 | + } |
|
682 | + $phpthumb_ico = new phpthumb_ico(); |
|
683 | + if (is_object($phpthumb_ico)) { |
|
684 | + $arrayOfOutputImages = array($this->gdimg_output); |
|
685 | + $ico_data = $phpthumb_ico->GD2ICOstring($arrayOfOutputImages); |
|
686 | + unset($phpthumb_ico); |
|
687 | + if (!$ico_data) { |
|
688 | + $this->DebugMessage('$phpthumb_ico->GD2ICOstring() failed', __FILE__, __LINE__); |
|
689 | + return false; |
|
690 | + } |
|
691 | + header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
|
692 | + echo $ico_data; |
|
693 | + } else { |
|
694 | + $this->DebugMessage('new phpthumb_ico() failed', __FILE__, __LINE__); |
|
695 | + return false; |
|
696 | + } |
|
697 | + break; |
|
698 | + |
|
699 | + default: |
|
700 | + $this->DebugMessage('OutputThumbnail failed because $this->thumbnailFormat "'.$this->thumbnailFormat.'" is not valid', __FILE__, __LINE__); |
|
701 | + return false; |
|
702 | + break; |
|
703 | + } |
|
704 | + |
|
705 | + } |
|
706 | + return true; |
|
707 | + } |
|
708 | + |
|
709 | + |
|
710 | + // public: |
|
711 | + public function CleanUpCacheDirectory() { |
|
712 | + $this->DebugMessage('CleanUpCacheDirectory() set to purge ('.(null === $this->config_cache_maxage ? 'NULL' : number_format($this->config_cache_maxage / 86400, 1)).' days; '.(null === $this->config_cache_maxsize ? 'NULL' : number_format($this->config_cache_maxsize / 1048576, 2)).' MB; '.(null === $this->config_cache_maxfiles ? 'NULL' : number_format($this->config_cache_maxfiles)).' files)', __FILE__, __LINE__); |
|
713 | + |
|
714 | + if (!is_writable($this->config_cache_directory)) { |
|
715 | + $this->DebugMessage('CleanUpCacheDirectory() skipped because "'.$this->config_cache_directory.'" is not writable', __FILE__, __LINE__); |
|
716 | + return true; |
|
717 | + } |
|
718 | + |
|
719 | + // cache status of cache directory for 1 hour to avoid hammering the filesystem functions |
|
720 | + $phpThumbCacheStats_filename = $this->config_cache_directory.DIRECTORY_SEPARATOR.'phpThumbCacheStats.txt'; |
|
721 | + if (file_exists($phpThumbCacheStats_filename) && is_readable($phpThumbCacheStats_filename) && (filemtime($phpThumbCacheStats_filename) >= (time() - 3600))) { |
|
722 | + $this->DebugMessage('CleanUpCacheDirectory() skipped because "'.$phpThumbCacheStats_filename.'" is recently modified', __FILE__, __LINE__); |
|
723 | + return true; |
|
724 | + } |
|
725 | + if (!@touch($phpThumbCacheStats_filename)) { |
|
726 | + $this->DebugMessage('touch('.$phpThumbCacheStats_filename.') failed', __FILE__, __LINE__); |
|
727 | + } |
|
728 | + |
|
729 | + $DeletedKeys = array(); |
|
730 | + $AllFilesInCacheDirectory = array(); |
|
731 | + if (($this->config_cache_maxage > 0) || ($this->config_cache_maxsize > 0) || ($this->config_cache_maxfiles > 0)) { |
|
732 | + $CacheDirOldFilesAge = array(); |
|
733 | + $CacheDirOldFilesSize = array(); |
|
734 | + $AllFilesInCacheDirectory = phpthumb_functions::GetAllFilesInSubfolders($this->config_cache_directory); |
|
735 | + foreach ($AllFilesInCacheDirectory as $fullfilename) { |
|
736 | + if (preg_match('#'.preg_quote($this->config_cache_prefix).'#i', $fullfilename) && file_exists($fullfilename)) { |
|
737 | + $CacheDirOldFilesAge[$fullfilename] = @fileatime($fullfilename); |
|
738 | + if ($CacheDirOldFilesAge[$fullfilename] == 0) { |
|
739 | + $CacheDirOldFilesAge[$fullfilename] = @filemtime($fullfilename); |
|
740 | + } |
|
741 | + $CacheDirOldFilesSize[$fullfilename] = @filesize($fullfilename); |
|
742 | + } |
|
743 | + } |
|
744 | + if (empty($CacheDirOldFilesSize)) { |
|
745 | + $this->DebugMessage('CleanUpCacheDirectory() skipped because $CacheDirOldFilesSize is empty (phpthumb_functions::GetAllFilesInSubfolders('.$this->config_cache_directory.') found no files)', __FILE__, __LINE__); |
|
746 | + return true; |
|
747 | + } |
|
748 | + $DeletedKeys['zerobyte'] = array(); |
|
749 | + foreach ($CacheDirOldFilesSize as $fullfilename => $filesize) { |
|
750 | + // purge all zero-size files more than an hour old (to prevent trying to delete just-created and/or in-use files) |
|
751 | + $cutofftime = time() - 3600; |
|
752 | + if (($filesize == 0) && ($CacheDirOldFilesAge[$fullfilename] < $cutofftime)) { |
|
753 | + $this->DebugMessage('deleting "'.$fullfilename.'"', __FILE__, __LINE__); |
|
754 | + if (@unlink($fullfilename)) { |
|
755 | + $DeletedKeys['zerobyte'][] = $fullfilename; |
|
756 | + unset($CacheDirOldFilesSize[$fullfilename]); |
|
757 | + unset($CacheDirOldFilesAge[$fullfilename]); |
|
758 | + } |
|
759 | + } |
|
760 | + } |
|
761 | + $this->DebugMessage('CleanUpCacheDirectory() purged '.count($DeletedKeys['zerobyte']).' zero-byte files', __FILE__, __LINE__); |
|
762 | + asort($CacheDirOldFilesAge); |
|
763 | + |
|
764 | + if ($this->config_cache_maxfiles > 0) { |
|
765 | + $TotalCachedFiles = count($CacheDirOldFilesAge); |
|
766 | + $DeletedKeys['maxfiles'] = array(); |
|
767 | + foreach ($CacheDirOldFilesAge as $fullfilename => $filedate) { |
|
768 | + if ($TotalCachedFiles > $this->config_cache_maxfiles) { |
|
769 | + $this->DebugMessage('deleting "'.$fullfilename.'"', __FILE__, __LINE__); |
|
770 | + if (@unlink($fullfilename)) { |
|
771 | + $TotalCachedFiles--; |
|
772 | + $DeletedKeys['maxfiles'][] = $fullfilename; |
|
773 | + } |
|
774 | + } else { |
|
775 | + // there are few enough files to keep the rest |
|
776 | + break; |
|
777 | + } |
|
778 | + } |
|
779 | + $this->DebugMessage('CleanUpCacheDirectory() purged '.count($DeletedKeys['maxfiles']).' files based on (config_cache_maxfiles='.$this->config_cache_maxfiles.')', __FILE__, __LINE__); |
|
780 | + foreach ($DeletedKeys['maxfiles'] as $fullfilename) { |
|
781 | + unset($CacheDirOldFilesAge[$fullfilename]); |
|
782 | + unset($CacheDirOldFilesSize[$fullfilename]); |
|
783 | + } |
|
784 | + } |
|
785 | + |
|
786 | + if ($this->config_cache_maxage > 0) { |
|
787 | + $mindate = time() - $this->config_cache_maxage; |
|
788 | + $DeletedKeys['maxage'] = array(); |
|
789 | + foreach ($CacheDirOldFilesAge as $fullfilename => $filedate) { |
|
790 | + if ($filedate > 0) { |
|
791 | + if ($filedate < $mindate) { |
|
792 | + $this->DebugMessage('deleting "'.$fullfilename.'"', __FILE__, __LINE__); |
|
793 | + if (@unlink($fullfilename)) { |
|
794 | + $DeletedKeys['maxage'][] = $fullfilename; |
|
795 | + } |
|
796 | + } else { |
|
797 | + // the rest of the files are new enough to keep |
|
798 | + break; |
|
799 | + } |
|
800 | + } |
|
801 | + } |
|
802 | + $this->DebugMessage('CleanUpCacheDirectory() purged '.count($DeletedKeys['maxage']).' files based on (config_cache_maxage='.$this->config_cache_maxage.')', __FILE__, __LINE__); |
|
803 | + foreach ($DeletedKeys['maxage'] as $fullfilename) { |
|
804 | + unset($CacheDirOldFilesAge[$fullfilename]); |
|
805 | + unset($CacheDirOldFilesSize[$fullfilename]); |
|
806 | + } |
|
807 | + } |
|
808 | + |
|
809 | + if ($this->config_cache_maxsize > 0) { |
|
810 | + $TotalCachedFileSize = array_sum($CacheDirOldFilesSize); |
|
811 | + $DeletedKeys['maxsize'] = array(); |
|
812 | + foreach ($CacheDirOldFilesAge as $fullfilename => $filedate) { |
|
813 | + if ($TotalCachedFileSize > $this->config_cache_maxsize) { |
|
814 | + $this->DebugMessage('deleting "'.$fullfilename.'"', __FILE__, __LINE__); |
|
815 | + if (@unlink($fullfilename)) { |
|
816 | + $TotalCachedFileSize -= $CacheDirOldFilesSize[$fullfilename]; |
|
817 | + $DeletedKeys['maxsize'][] = $fullfilename; |
|
818 | + } |
|
819 | + } else { |
|
820 | + // the total filesizes are small enough to keep the rest of the files |
|
821 | + break; |
|
822 | + } |
|
823 | + } |
|
824 | + $this->DebugMessage('CleanUpCacheDirectory() purged '.count($DeletedKeys['maxsize']).' files based on (config_cache_maxsize='.$this->config_cache_maxsize.')', __FILE__, __LINE__); |
|
825 | + foreach ($DeletedKeys['maxsize'] as $fullfilename) { |
|
826 | + unset($CacheDirOldFilesAge[$fullfilename]); |
|
827 | + unset($CacheDirOldFilesSize[$fullfilename]); |
|
828 | + } |
|
829 | + } |
|
830 | + |
|
831 | + } else { |
|
832 | + $this->DebugMessage('skipping CleanUpCacheDirectory() because config set to not use it', __FILE__, __LINE__); |
|
833 | + } |
|
834 | + $totalpurged = 0; |
|
835 | + foreach ($DeletedKeys as $key => $value) { |
|
836 | + $totalpurged += count($value); |
|
837 | + } |
|
838 | + $this->DebugMessage('CleanUpCacheDirectory() purged '.$totalpurged.' files (from '.count($AllFilesInCacheDirectory).') based on config settings', __FILE__, __LINE__); |
|
839 | + if ($totalpurged > 0) { |
|
840 | + $empty_dirs = array(); |
|
841 | + foreach ($AllFilesInCacheDirectory as $fullfilename) { |
|
842 | + if (is_dir($fullfilename)) { |
|
843 | + $empty_dirs[$this->realPathSafe($fullfilename)] = 1; |
|
844 | + } else { |
|
845 | + unset($empty_dirs[$this->realPathSafe(dirname($fullfilename))]); |
|
846 | + } |
|
847 | + } |
|
848 | + krsort($empty_dirs); |
|
849 | + $totalpurgeddirs = 0; |
|
850 | + foreach ($empty_dirs as $empty_dir => $dummy) { |
|
851 | + if ($empty_dir == $this->config_cache_directory) { |
|
852 | + // shouldn't happen, but just in case, don't let it delete actual cache directory |
|
853 | + continue; |
|
854 | + } elseif (@rmdir($empty_dir)) { |
|
855 | + $totalpurgeddirs++; |
|
856 | + } else { |
|
857 | + $this->DebugMessage('failed to rmdir('.$empty_dir.')', __FILE__, __LINE__); |
|
858 | + } |
|
859 | + } |
|
860 | + $this->DebugMessage('purged '.$totalpurgeddirs.' empty directories', __FILE__, __LINE__); |
|
861 | + } |
|
862 | + return true; |
|
863 | + } |
|
864 | + |
|
865 | + ////////////////////////////////////////////////////////////////////// |
|
866 | + |
|
867 | + // private: re-initializator (call between rendering multiple images with one object) |
|
868 | + public function resetObject() { |
|
869 | + $class_vars = get_class_vars(get_class($this)); |
|
870 | + foreach ($class_vars as $key => $value) { |
|
871 | + // do not clobber debug or config info |
|
872 | + if (!preg_match('#^(config_|debug|fatalerror)#i', $key)) { |
|
873 | + $this->$key = $value; |
|
874 | + } |
|
875 | + } |
|
876 | + $this->phpThumb(); // re-initialize some class variables |
|
877 | + return true; |
|
878 | + } |
|
879 | + |
|
880 | + ////////////////////////////////////////////////////////////////////// |
|
881 | + |
|
882 | + public function ResolveSource() { |
|
883 | + if (is_resource($this->gdimg_source)) { |
|
884 | + $this->DebugMessage('ResolveSource() exiting because is_resource($this->gdimg_source)', __FILE__, __LINE__); |
|
885 | + return true; |
|
886 | + } |
|
887 | + if ($this->rawImageData) { |
|
888 | + $this->sourceFilename = null; |
|
889 | + $this->DebugMessage('ResolveSource() exiting because $this->rawImageData is set ('.number_format(strlen($this->rawImageData)).' bytes)', __FILE__, __LINE__); |
|
890 | + return true; |
|
891 | + } |
|
892 | + if ($this->sourceFilename) { |
|
893 | + $this->sourceFilename = $this->ResolveFilenameToAbsolute($this->sourceFilename); |
|
894 | + $this->DebugMessage('$this->sourceFilename set to "'.$this->sourceFilename.'"', __FILE__, __LINE__); |
|
895 | + } elseif ($this->src) { |
|
896 | + $this->sourceFilename = $this->ResolveFilenameToAbsolute($this->src); |
|
897 | + $this->DebugMessage('$this->sourceFilename set to "'.$this->sourceFilename.'" from $this->src ('.$this->src.')', __FILE__, __LINE__); |
|
898 | + } else { |
|
899 | + return $this->ErrorImage('$this->sourceFilename and $this->src are both empty'); |
|
900 | + } |
|
901 | + if ($this->iswindows && ((substr($this->sourceFilename, 0, 2) == '//') || (substr($this->sourceFilename, 0, 2) == '\\\\'))) { |
|
902 | + // Windows \\share\filename.ext |
|
903 | + } elseif (preg_match('#^[a-z0-9]+://#i', $this->sourceFilename, $protocol_matches)) { |
|
904 | + if (preg_match('#^(f|ht)tps?\://#i', $this->sourceFilename)) { |
|
905 | + // URL |
|
906 | + if ($this->config_http_user_agent) { |
|
907 | + ini_set('user_agent', $this->config_http_user_agent); |
|
908 | + } |
|
909 | + } else { |
|
910 | + return $this->ErrorImage('only FTP and HTTP/HTTPS protocols are allowed, "'.$protocol_matches[1].'" is not'); |
|
911 | + } |
|
912 | + } elseif (!@file_exists($this->sourceFilename)) { |
|
913 | + return $this->ErrorImage('"'.$this->sourceFilename.'" does not exist'); |
|
914 | + } elseif (!@is_file($this->sourceFilename)) { |
|
915 | + return $this->ErrorImage('"'.$this->sourceFilename.'" is not a file'); |
|
916 | + } |
|
917 | + return true; |
|
918 | + } |
|
919 | + |
|
920 | + |
|
921 | + public function setOutputFormat() { |
|
922 | + static $alreadyCalled = false; |
|
923 | + if ($this->thumbnailFormat && $alreadyCalled) { |
|
924 | + return true; |
|
925 | + } |
|
926 | + $alreadyCalled = true; |
|
927 | + |
|
928 | + $AvailableImageOutputFormats = array(); |
|
929 | + $AvailableImageOutputFormats[] = 'text'; |
|
930 | + if (@is_readable( __DIR__ .'/phpthumb.ico.php')) { |
|
931 | + $AvailableImageOutputFormats[] = 'ico'; |
|
932 | + } |
|
933 | + if (@is_readable( __DIR__ .'/phpthumb.bmp.php')) { |
|
934 | + $AvailableImageOutputFormats[] = 'bmp'; |
|
935 | + } |
|
936 | + |
|
937 | + $this->thumbnailFormat = 'ico'; |
|
938 | + |
|
939 | + // Set default output format based on what image types are available |
|
940 | + if (function_exists('imagetypes')) { |
|
941 | + $imagetypes = imagetypes(); |
|
942 | + if ($imagetypes & IMG_WBMP) { |
|
943 | + $this->thumbnailFormat = 'wbmp'; |
|
944 | + $AvailableImageOutputFormats[] = 'wbmp'; |
|
945 | + } |
|
946 | + if ($imagetypes & IMG_GIF) { |
|
947 | + $this->thumbnailFormat = 'gif'; |
|
948 | + $AvailableImageOutputFormats[] = 'gif'; |
|
949 | + } |
|
950 | + if ($imagetypes & IMG_PNG) { |
|
951 | + $this->thumbnailFormat = 'png'; |
|
952 | + $AvailableImageOutputFormats[] = 'png'; |
|
953 | + } |
|
954 | + if ($imagetypes & IMG_JPG) { |
|
955 | + $this->thumbnailFormat = 'jpeg'; |
|
956 | + $AvailableImageOutputFormats[] = 'jpeg'; |
|
957 | + } |
|
958 | + } else { |
|
959 | + $this->DebugMessage('imagetypes() does not exist - GD support might not be enabled?', __FILE__, __LINE__); |
|
960 | + } |
|
961 | + if ($this->ImageMagickVersion()) { |
|
962 | + $IMformats = array('jpeg', 'png', 'gif', 'bmp', 'ico', 'wbmp'); |
|
963 | + $this->DebugMessage('Addding ImageMagick formats to $AvailableImageOutputFormats ('.implode(';', $AvailableImageOutputFormats).')', __FILE__, __LINE__); |
|
964 | + foreach ($IMformats as $key => $format) { |
|
965 | + $AvailableImageOutputFormats[] = $format; |
|
966 | + } |
|
967 | + } |
|
968 | + $AvailableImageOutputFormats = array_unique($AvailableImageOutputFormats); |
|
969 | + $this->DebugMessage('$AvailableImageOutputFormats = array('.implode(';', $AvailableImageOutputFormats).')', __FILE__, __LINE__); |
|
970 | + |
|
971 | + $this->f = preg_replace('#[^a-z]#', '', strtolower($this->f)); |
|
972 | + if (strtolower($this->config_output_format) == 'jpg') { |
|
973 | + $this->config_output_format = 'jpeg'; |
|
974 | + } |
|
975 | + if (strtolower($this->f) == 'jpg') { |
|
976 | + $this->f = 'jpeg'; |
|
977 | + } |
|
978 | + if (phpthumb_functions::CaseInsensitiveInArray($this->config_output_format, $AvailableImageOutputFormats)) { |
|
979 | + // set output format to config default if that format is available |
|
980 | + $this->DebugMessage('$this->thumbnailFormat set to $this->config_output_format "'.strtolower($this->config_output_format).'"', __FILE__, __LINE__); |
|
981 | + $this->thumbnailFormat = strtolower($this->config_output_format); |
|
982 | + } elseif ($this->config_output_format) { |
|
983 | + $this->DebugMessage('$this->thumbnailFormat staying as "'.$this->thumbnailFormat.'" because $this->config_output_format ('.strtolower($this->config_output_format).') is not in $AvailableImageOutputFormats', __FILE__, __LINE__); |
|
984 | + } |
|
985 | + if ($this->f && (phpthumb_functions::CaseInsensitiveInArray($this->f, $AvailableImageOutputFormats))) { |
|
986 | + // override output format if $this->f is set and that format is available |
|
987 | + $this->DebugMessage('$this->thumbnailFormat set to $this->f "'.strtolower($this->f).'"', __FILE__, __LINE__); |
|
988 | + $this->thumbnailFormat = strtolower($this->f); |
|
989 | + } elseif ($this->f) { |
|
990 | + $this->DebugMessage('$this->thumbnailFormat staying as "'.$this->thumbnailFormat.'" because $this->f ('.strtolower($this->f).') is not in $AvailableImageOutputFormats', __FILE__, __LINE__); |
|
991 | + } |
|
992 | + |
|
993 | + // for JPEG images, quality 1 (worst) to 99 (best) |
|
994 | + // quality < 25 is nasty, with not much size savings - not recommended |
|
995 | + // problems with 100 - invalid JPEG? |
|
996 | + $this->thumbnailQuality = max(1, min(99, ($this->q ? (int) $this->q : 75))); |
|
997 | + $this->DebugMessage('$this->thumbnailQuality set to "'.$this->thumbnailQuality.'"', __FILE__, __LINE__); |
|
998 | + |
|
999 | + return true; |
|
1000 | + } |
|
1001 | + |
|
1002 | + |
|
1003 | + public function setCacheDirectory() { |
|
1004 | + // resolve cache directory to absolute pathname |
|
1005 | + $this->DebugMessage('setCacheDirectory() starting with config_cache_directory = "'.$this->config_cache_directory.'"', __FILE__, __LINE__); |
|
1006 | + if ($this->config_cache_directory[ 0 ] == '.') { |
|
1007 | + if (preg_match('#^(f|ht)tps?\://#i', $this->src)) { |
|
1008 | + if (!$this->config_cache_disable_warning) { |
|
1009 | + $this->ErrorImage('$this->config_cache_directory ('.$this->config_cache_directory.') cannot be used for remote images. Adjust "cache_directory" or "cache_disable_warning" in phpThumb.config.php'); |
|
1010 | + } |
|
1011 | + } elseif ($this->src) { |
|
1012 | + // resolve relative cache directory to source image |
|
1013 | + $this->config_cache_directory = dirname($this->ResolveFilenameToAbsolute($this->src)).DIRECTORY_SEPARATOR.$this->config_cache_directory; |
|
1014 | + } else { |
|
1015 | + // $this->new is probably set |
|
1016 | + } |
|
1017 | + } |
|
1018 | + if (substr($this->config_cache_directory, -1) == '/') { |
|
1019 | + $this->config_cache_directory = substr($this->config_cache_directory, 0, -1); |
|
1020 | + } |
|
1021 | + if ($this->iswindows) { |
|
1022 | + $this->config_cache_directory = str_replace('/', DIRECTORY_SEPARATOR, $this->config_cache_directory); |
|
1023 | + } |
|
1024 | + if ($this->config_cache_directory) { |
|
1025 | + $real_cache_path = $this->realPathSafe($this->config_cache_directory); |
|
1026 | + if (!$real_cache_path) { |
|
1027 | + $this->DebugMessage('$this->realPathSafe($this->config_cache_directory) failed for "'.$this->config_cache_directory.'"', __FILE__, __LINE__); |
|
1028 | + if (!is_dir($this->config_cache_directory)) { |
|
1029 | + $this->DebugMessage('!is_dir('.$this->config_cache_directory.')', __FILE__, __LINE__); |
|
1030 | + } |
|
1031 | + } |
|
1032 | + if ($real_cache_path) { |
|
1033 | + $this->DebugMessage('setting config_cache_directory to $this->realPathSafe('.$this->config_cache_directory.') = "'.$real_cache_path.'"', __FILE__, __LINE__); |
|
1034 | + $this->config_cache_directory = $real_cache_path; |
|
1035 | + } |
|
1036 | + } |
|
1037 | + if (!is_dir($this->config_cache_directory)) { |
|
1038 | + if (!$this->config_cache_disable_warning) { |
|
1039 | + $this->ErrorImage('$this->config_cache_directory ('.$this->config_cache_directory.') does not exist. Adjust "cache_directory" or "cache_disable_warning" in phpThumb.config.php'); |
|
1040 | + } |
|
1041 | + $this->DebugMessage('$this->config_cache_directory ('.$this->config_cache_directory.') is not a directory', __FILE__, __LINE__); |
|
1042 | + $this->config_cache_directory = null; |
|
1043 | + } elseif (!@is_writable($this->config_cache_directory)) { |
|
1044 | + $this->DebugMessage('$this->config_cache_directory is not writable ('.$this->config_cache_directory.')', __FILE__, __LINE__); |
|
1045 | + } |
|
1046 | + |
|
1047 | + $this->InitializeTempDirSetting(); |
|
1048 | + if (!@is_dir($this->config_temp_directory) && !@is_writable($this->config_temp_directory) && @is_dir($this->config_cache_directory) && @is_writable($this->config_cache_directory)) { |
|
1049 | + $this->DebugMessage('setting $this->config_temp_directory = $this->config_cache_directory ('.$this->config_cache_directory.')', __FILE__, __LINE__); |
|
1050 | + $this->config_temp_directory = $this->config_cache_directory; |
|
1051 | + } |
|
1052 | + return true; |
|
1053 | + } |
|
1054 | + |
|
1055 | + /* Takes the array of path segments up to now, and the next segment (maybe a modifier: empty, . or ..) |
|
1056 | 1056 | Applies it, adding or removing from $segments as a result. Returns nothing. */ |
1057 | - // http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
|
1058 | - public function applyPathSegment(&$segments, $segment) { |
|
1059 | - if ($segment == '.') { |
|
1060 | - return; // always remove |
|
1061 | - } |
|
1062 | - if ($segment == '') { |
|
1063 | - $test = array_pop($segments); |
|
1064 | - if (null === $test) { |
|
1065 | - $segments[] = $segment; // keep the first empty block |
|
1066 | - } elseif ($test == '') { |
|
1067 | - $test = array_pop($segments); |
|
1068 | - if (null === $test) { |
|
1069 | - $segments[] = $test; |
|
1070 | - $segments[] = $segment; // keep the second one too |
|
1071 | - } else { // put both back and ignore segment |
|
1072 | - $segments[] = $test; |
|
1073 | - $segments[] = $test; |
|
1074 | - } |
|
1075 | - } else { |
|
1076 | - $segments[] = $test; // ignore empty blocks |
|
1077 | - } |
|
1078 | - } else { |
|
1079 | - if ($segment == '..') { |
|
1080 | - $test = array_pop($segments); |
|
1081 | - if (null === $test) { |
|
1082 | - $segments[] = $segment; |
|
1083 | - } elseif ($test == '..') { |
|
1084 | - $segments[] = $test; |
|
1085 | - $segments[] = $segment; |
|
1086 | - } else { |
|
1087 | - if ($test == '') { |
|
1088 | - $segments[] = $test; |
|
1089 | - } // else nothing, remove both |
|
1090 | - } |
|
1091 | - } else { |
|
1092 | - $segments[] = $segment; |
|
1093 | - } |
|
1094 | - } |
|
1095 | - } |
|
1096 | - |
|
1097 | - /* Takes array of path components, normalizes it: removes empty slots and '.', collapses '..' and folder names. Returns array. */ |
|
1098 | - // http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
|
1099 | - public function normalizePath($segments) { |
|
1100 | - $parts = array(); |
|
1101 | - foreach ($segments as $segment) { |
|
1102 | - $this->applyPathSegment($parts, $segment); |
|
1103 | - } |
|
1104 | - return $parts; |
|
1105 | - } |
|
1106 | - |
|
1107 | - /* True if the provided path points (without resolving symbolic links) into one of the allowed directories. */ |
|
1108 | - // http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
|
1109 | - public function matchPath($path, $allowed_dirs) { |
|
1110 | - if (!empty($allowed_dirs)) { |
|
1111 | - foreach ($allowed_dirs as $one_dir) { |
|
1112 | - if (preg_match('#^'.preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', $this->realPathSafe($one_dir))).'#', $path)) { |
|
1113 | - return true; |
|
1114 | - } |
|
1115 | - } |
|
1116 | - } |
|
1117 | - return false; |
|
1118 | - } |
|
1119 | - |
|
1120 | - /* True if the provided path points inside one of open_basedirs (or if open_basedirs are disabled) */ |
|
1121 | - // http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
|
1122 | - public function isInOpenBasedir($path) { |
|
1123 | - static $open_basedirs = null; |
|
1124 | - if (null === $open_basedirs) { |
|
1125 | - $ini_text = ini_get('open_basedir'); |
|
1126 | - $this->DebugMessage('open_basedir: "'.$ini_text.'"', __FILE__, __LINE__); |
|
1127 | - $open_basedirs = array(); |
|
1128 | - if (strlen($ini_text) > 0) { |
|
1129 | - foreach (preg_split('#[;:]#', $ini_text) as $key => $value) { |
|
1130 | - $open_basedirs[$key] = $this->realPathSafe($value); |
|
1131 | - } |
|
1132 | - } |
|
1133 | - } |
|
1134 | - return (empty($open_basedirs) || $this->matchPath($path, $open_basedirs)); |
|
1135 | - } |
|
1136 | - |
|
1137 | - /* Resolves all symlinks in $path, checking that each continuous part ends in an allowed zone. Returns null, if any component leads outside of allowed zone. */ |
|
1138 | - // http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
|
1139 | - public function resolvePath($path, $allowed_dirs) { |
|
1140 | - $this->DebugMessage('resolvePath: '.$path.' (allowed_dirs: '.print_r($allowed_dirs, true).')', __FILE__, __LINE__); |
|
1141 | - |
|
1142 | - // add base path to the top of the list |
|
1143 | - if (!$this->config_allow_src_above_docroot) { |
|
1144 | - array_unshift($allowed_dirs, $this->realPathSafe($this->config_document_root)); |
|
1145 | - } else { |
|
1146 | - if (!$this->config_allow_src_above_phpthumb) { |
|
1147 | - array_unshift($allowed_dirs, $this->realPathSafe( __DIR__ )); |
|
1148 | - } else { |
|
1149 | - // no checks are needed, offload the work to realpath and forget about it |
|
1150 | - $this->DebugMessage('resolvePath: checks disabled, returning '.$this->realPathSafe($path), __FILE__, __LINE__); |
|
1151 | - return $this->realPathSafe($path); |
|
1152 | - } |
|
1153 | - } |
|
1154 | - if ($path == '') { |
|
1155 | - return null; // save us trouble |
|
1156 | - } |
|
1157 | - |
|
1158 | - do { |
|
1159 | - $this->DebugMessage('resolvePath: iteration, path='.$path.', base path = '.$allowed_dirs[0], __FILE__, __LINE__); |
|
1160 | - |
|
1161 | - $parts = array(); |
|
1162 | - // do not use "cleaner" foreach version of this loop as later code relies on both $segments and $i |
|
1163 | - // http://support.silisoftware.com/phpBB3/viewtopic.php?t=964 |
|
1164 | - $segments = explode(DIRECTORY_SEPARATOR, $path); |
|
1165 | - for ($i = 0, $iMax = count($segments); $i < $iMax; $i++) { |
|
1166 | - $this->applyPathSegment($parts, $segments[$i]); |
|
1167 | - $thispart = implode(DIRECTORY_SEPARATOR, $parts); |
|
1168 | - if ($this->isInOpenBasedir($thispart)) { |
|
1169 | - if (is_link($thispart)) { |
|
1170 | - break; |
|
1171 | - } |
|
1172 | - } |
|
1173 | - } |
|
1174 | - |
|
1175 | - $this->DebugMessage('resolvePath: stop at component '.$i, __FILE__, __LINE__); |
|
1176 | - // test the part up to here |
|
1177 | - $path = implode(DIRECTORY_SEPARATOR, $parts); |
|
1178 | - $this->DebugMessage('resolvePath: stop at path='.$path, __FILE__, __LINE__); |
|
1179 | - if (!$this->matchPath($path, $allowed_dirs)) { |
|
1180 | - $this->DebugMessage('resolvePath: no match, returning null', __FILE__, __LINE__); |
|
1181 | - return null; |
|
1182 | - } |
|
1183 | - if ($i >= count($segments)) { // reached end |
|
1184 | - $this->DebugMessage('resolvePath: path parsed, over', __FILE__, __LINE__); |
|
1185 | - break; |
|
1186 | - } |
|
1187 | - // else it's symlink, rewrite path |
|
1188 | - $path = readlink($path); |
|
1189 | - $this->DebugMessage('resolvePath: symlink matched, target='.$path, __FILE__, __LINE__); |
|
1190 | - |
|
1191 | - /* |
|
1057 | + // http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
|
1058 | + public function applyPathSegment(&$segments, $segment) { |
|
1059 | + if ($segment == '.') { |
|
1060 | + return; // always remove |
|
1061 | + } |
|
1062 | + if ($segment == '') { |
|
1063 | + $test = array_pop($segments); |
|
1064 | + if (null === $test) { |
|
1065 | + $segments[] = $segment; // keep the first empty block |
|
1066 | + } elseif ($test == '') { |
|
1067 | + $test = array_pop($segments); |
|
1068 | + if (null === $test) { |
|
1069 | + $segments[] = $test; |
|
1070 | + $segments[] = $segment; // keep the second one too |
|
1071 | + } else { // put both back and ignore segment |
|
1072 | + $segments[] = $test; |
|
1073 | + $segments[] = $test; |
|
1074 | + } |
|
1075 | + } else { |
|
1076 | + $segments[] = $test; // ignore empty blocks |
|
1077 | + } |
|
1078 | + } else { |
|
1079 | + if ($segment == '..') { |
|
1080 | + $test = array_pop($segments); |
|
1081 | + if (null === $test) { |
|
1082 | + $segments[] = $segment; |
|
1083 | + } elseif ($test == '..') { |
|
1084 | + $segments[] = $test; |
|
1085 | + $segments[] = $segment; |
|
1086 | + } else { |
|
1087 | + if ($test == '') { |
|
1088 | + $segments[] = $test; |
|
1089 | + } // else nothing, remove both |
|
1090 | + } |
|
1091 | + } else { |
|
1092 | + $segments[] = $segment; |
|
1093 | + } |
|
1094 | + } |
|
1095 | + } |
|
1096 | + |
|
1097 | + /* Takes array of path components, normalizes it: removes empty slots and '.', collapses '..' and folder names. Returns array. */ |
|
1098 | + // http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
|
1099 | + public function normalizePath($segments) { |
|
1100 | + $parts = array(); |
|
1101 | + foreach ($segments as $segment) { |
|
1102 | + $this->applyPathSegment($parts, $segment); |
|
1103 | + } |
|
1104 | + return $parts; |
|
1105 | + } |
|
1106 | + |
|
1107 | + /* True if the provided path points (without resolving symbolic links) into one of the allowed directories. */ |
|
1108 | + // http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
|
1109 | + public function matchPath($path, $allowed_dirs) { |
|
1110 | + if (!empty($allowed_dirs)) { |
|
1111 | + foreach ($allowed_dirs as $one_dir) { |
|
1112 | + if (preg_match('#^'.preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', $this->realPathSafe($one_dir))).'#', $path)) { |
|
1113 | + return true; |
|
1114 | + } |
|
1115 | + } |
|
1116 | + } |
|
1117 | + return false; |
|
1118 | + } |
|
1119 | + |
|
1120 | + /* True if the provided path points inside one of open_basedirs (or if open_basedirs are disabled) */ |
|
1121 | + // http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
|
1122 | + public function isInOpenBasedir($path) { |
|
1123 | + static $open_basedirs = null; |
|
1124 | + if (null === $open_basedirs) { |
|
1125 | + $ini_text = ini_get('open_basedir'); |
|
1126 | + $this->DebugMessage('open_basedir: "'.$ini_text.'"', __FILE__, __LINE__); |
|
1127 | + $open_basedirs = array(); |
|
1128 | + if (strlen($ini_text) > 0) { |
|
1129 | + foreach (preg_split('#[;:]#', $ini_text) as $key => $value) { |
|
1130 | + $open_basedirs[$key] = $this->realPathSafe($value); |
|
1131 | + } |
|
1132 | + } |
|
1133 | + } |
|
1134 | + return (empty($open_basedirs) || $this->matchPath($path, $open_basedirs)); |
|
1135 | + } |
|
1136 | + |
|
1137 | + /* Resolves all symlinks in $path, checking that each continuous part ends in an allowed zone. Returns null, if any component leads outside of allowed zone. */ |
|
1138 | + // http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
|
1139 | + public function resolvePath($path, $allowed_dirs) { |
|
1140 | + $this->DebugMessage('resolvePath: '.$path.' (allowed_dirs: '.print_r($allowed_dirs, true).')', __FILE__, __LINE__); |
|
1141 | + |
|
1142 | + // add base path to the top of the list |
|
1143 | + if (!$this->config_allow_src_above_docroot) { |
|
1144 | + array_unshift($allowed_dirs, $this->realPathSafe($this->config_document_root)); |
|
1145 | + } else { |
|
1146 | + if (!$this->config_allow_src_above_phpthumb) { |
|
1147 | + array_unshift($allowed_dirs, $this->realPathSafe( __DIR__ )); |
|
1148 | + } else { |
|
1149 | + // no checks are needed, offload the work to realpath and forget about it |
|
1150 | + $this->DebugMessage('resolvePath: checks disabled, returning '.$this->realPathSafe($path), __FILE__, __LINE__); |
|
1151 | + return $this->realPathSafe($path); |
|
1152 | + } |
|
1153 | + } |
|
1154 | + if ($path == '') { |
|
1155 | + return null; // save us trouble |
|
1156 | + } |
|
1157 | + |
|
1158 | + do { |
|
1159 | + $this->DebugMessage('resolvePath: iteration, path='.$path.', base path = '.$allowed_dirs[0], __FILE__, __LINE__); |
|
1160 | + |
|
1161 | + $parts = array(); |
|
1162 | + // do not use "cleaner" foreach version of this loop as later code relies on both $segments and $i |
|
1163 | + // http://support.silisoftware.com/phpBB3/viewtopic.php?t=964 |
|
1164 | + $segments = explode(DIRECTORY_SEPARATOR, $path); |
|
1165 | + for ($i = 0, $iMax = count($segments); $i < $iMax; $i++) { |
|
1166 | + $this->applyPathSegment($parts, $segments[$i]); |
|
1167 | + $thispart = implode(DIRECTORY_SEPARATOR, $parts); |
|
1168 | + if ($this->isInOpenBasedir($thispart)) { |
|
1169 | + if (is_link($thispart)) { |
|
1170 | + break; |
|
1171 | + } |
|
1172 | + } |
|
1173 | + } |
|
1174 | + |
|
1175 | + $this->DebugMessage('resolvePath: stop at component '.$i, __FILE__, __LINE__); |
|
1176 | + // test the part up to here |
|
1177 | + $path = implode(DIRECTORY_SEPARATOR, $parts); |
|
1178 | + $this->DebugMessage('resolvePath: stop at path='.$path, __FILE__, __LINE__); |
|
1179 | + if (!$this->matchPath($path, $allowed_dirs)) { |
|
1180 | + $this->DebugMessage('resolvePath: no match, returning null', __FILE__, __LINE__); |
|
1181 | + return null; |
|
1182 | + } |
|
1183 | + if ($i >= count($segments)) { // reached end |
|
1184 | + $this->DebugMessage('resolvePath: path parsed, over', __FILE__, __LINE__); |
|
1185 | + break; |
|
1186 | + } |
|
1187 | + // else it's symlink, rewrite path |
|
1188 | + $path = readlink($path); |
|
1189 | + $this->DebugMessage('resolvePath: symlink matched, target='.$path, __FILE__, __LINE__); |
|
1190 | + |
|
1191 | + /* |
|
1192 | 1192 | Replace base path with symlink target. |
1193 | 1193 | Assuming: |
1194 | 1194 | /www/img/external -> /external |
@@ -1198,134 +1198,134 @@ discard block |
||
1198 | 1198 | GET /www/img/external/../www/img/pic.jpg |
1199 | 1199 | So there's only one base path which is the last symlink target, but any number of stable whitelisted paths. |
1200 | 1200 | */ |
1201 | - if ($this->config_auto_allow_symlinks) { |
|
1202 | - $allowed_dirs[0] = $path; |
|
1203 | - } |
|
1204 | - $path = $path.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, array_slice($segments,$i + 1)); |
|
1205 | - } while (true); |
|
1206 | - return $path; |
|
1207 | - } |
|
1208 | - |
|
1209 | - |
|
1210 | - public function realPathSafe($filename) { |
|
1211 | - // http://php.net/manual/en/function.realpath.php -- "Note: The running script must have executable permissions on all directories in the hierarchy, otherwise realpath() will return FALSE" |
|
1212 | - // realPathSafe() provides a reasonable facsimile of realpath() but does not resolve symbolic links, nor does it check that the file/path actually exists |
|
1213 | - if (!$this->config_disable_realpath) { |
|
1214 | - return realpath($filename); |
|
1215 | - } |
|
1216 | - |
|
1217 | - // http://stackoverflow.com/questions/21421569 |
|
1218 | - $newfilename = preg_replace('#[\\/]+#', DIRECTORY_SEPARATOR, $filename); |
|
1219 | - if (!preg_match('#^'.DIRECTORY_SEPARATOR.'#', $newfilename)) { |
|
1220 | - $newfilename = __DIR__ .DIRECTORY_SEPARATOR.$newfilename; |
|
1221 | - } |
|
1222 | - do { |
|
1223 | - $beforeloop = $newfilename; |
|
1224 | - |
|
1225 | - // Replace all sequences of more than one / with a single one [[ If you're working on a system that treats // at the start of a path as special, make sure you replace multiple / characters at the start with two of them. This is the only place where POSIX allows (but does not mandate) special handling for multiples, in all other cases, multiple / characters are equivalent to a single one.]] |
|
1226 | - $newfilename = preg_replace('#'.DIRECTORY_SEPARATOR.'+#', DIRECTORY_SEPARATOR, $newfilename); |
|
1227 | - |
|
1228 | - // Replace all occurrences of /./ with / |
|
1229 | - $newfilename = preg_replace('#'.DIRECTORY_SEPARATOR.'\\.'.DIRECTORY_SEPARATOR.'#', DIRECTORY_SEPARATOR, $newfilename); |
|
1230 | - |
|
1231 | - // Remove ./ if at the start |
|
1232 | - $newfilename = preg_replace('#^\\.'.DIRECTORY_SEPARATOR.'#', '', $newfilename); |
|
1233 | - |
|
1234 | - // Remove /. if at the end |
|
1235 | - $newfilename = preg_replace('#'.DIRECTORY_SEPARATOR.'\\.$#', '', $newfilename); |
|
1236 | - |
|
1237 | - // Replace /anything/../ with / |
|
1238 | - $newfilename = preg_replace('#'.DIRECTORY_SEPARATOR.'[^'.DIRECTORY_SEPARATOR.']+'.DIRECTORY_SEPARATOR.'\\.\\.'.DIRECTORY_SEPARATOR.'#', DIRECTORY_SEPARATOR, $newfilename); |
|
1239 | - |
|
1240 | - // Remove /anything/.. if at the end |
|
1241 | - $newfilename = preg_replace('#'.DIRECTORY_SEPARATOR.'[^'.DIRECTORY_SEPARATOR.']+'.DIRECTORY_SEPARATOR.'\\.\\.$#', '', $newfilename); |
|
1242 | - |
|
1243 | - } while ($newfilename != $beforeloop); |
|
1244 | - return $newfilename; |
|
1245 | - } |
|
1246 | - |
|
1247 | - |
|
1248 | - public function ResolveFilenameToAbsolute($filename) { |
|
1249 | - if (empty($filename)) { |
|
1250 | - return false; |
|
1251 | - } |
|
1252 | - |
|
1253 | - if (preg_match('#^[a-z0-9]+\:/{1,2}#i', $filename)) { |
|
1254 | - // eg: http://host/path/file.jpg (HTTP URL) |
|
1255 | - // eg: ftp://host/path/file.jpg (FTP URL) |
|
1256 | - // eg: data1:/path/file.jpg (Netware path) |
|
1257 | - |
|
1258 | - //$AbsoluteFilename = $filename; |
|
1259 | - return $filename; |
|
1260 | - |
|
1261 | - } elseif ($this->iswindows && isset($filename{1}) && ($filename{1} == ':')) { |
|
1262 | - |
|
1263 | - // absolute pathname (Windows) |
|
1264 | - $AbsoluteFilename = $filename; |
|
1265 | - |
|
1266 | - } elseif ($this->iswindows && ((substr($filename, 0, 2) == '//') || (substr($filename, 0, 2) == '\\\\'))) { |
|
1267 | - |
|
1268 | - // absolute pathname (Windows) |
|
1269 | - $AbsoluteFilename = $filename; |
|
1270 | - |
|
1271 | - } elseif ($filename{0} == '/') { |
|
1272 | - |
|
1273 | - if (@is_readable($filename) && !@is_readable($this->config_document_root.$filename)) { |
|
1274 | - |
|
1275 | - // absolute filename (*nix) |
|
1276 | - $AbsoluteFilename = $filename; |
|
1277 | - |
|
1278 | - } elseif (isset($filename{1}) && ($filename{1} == '~')) { |
|
1201 | + if ($this->config_auto_allow_symlinks) { |
|
1202 | + $allowed_dirs[0] = $path; |
|
1203 | + } |
|
1204 | + $path = $path.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, array_slice($segments,$i + 1)); |
|
1205 | + } while (true); |
|
1206 | + return $path; |
|
1207 | + } |
|
1279 | 1208 | |
1280 | - // /~user/path |
|
1281 | - if ($ApacheLookupURIarray = phpthumb_functions::ApacheLookupURIarray($filename)) { |
|
1282 | - $AbsoluteFilename = $ApacheLookupURIarray['filename']; |
|
1283 | - } else { |
|
1284 | - $AbsoluteFilename = $this->realPathSafe($filename); |
|
1285 | - if (@is_readable($AbsoluteFilename)) { |
|
1286 | - $this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.$filename.'", but the correct filename ('.$AbsoluteFilename.') seems to have been resolved with $this->realPathSafe($filename)', __FILE__, __LINE__); |
|
1287 | - } elseif (is_dir(dirname($AbsoluteFilename))) { |
|
1288 | - $this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.dirname($filename).'", but the correct directory ('.dirname($AbsoluteFilename).') seems to have been resolved with $this->realPathSafe(.)', __FILE__, __LINE__); |
|
1289 | - } else { |
|
1290 | - return $this->ErrorImage('phpthumb_functions::ApacheLookupURIarray() failed for "'.$filename.'". This has been known to fail on Apache2 - try using the absolute filename for the source image (ex: "/home/user/httpdocs/image.jpg" instead of "/~user/image.jpg")'); |
|
1291 | - } |
|
1292 | - } |
|
1293 | 1209 | |
1294 | - } else { |
|
1210 | + public function realPathSafe($filename) { |
|
1211 | + // http://php.net/manual/en/function.realpath.php -- "Note: The running script must have executable permissions on all directories in the hierarchy, otherwise realpath() will return FALSE" |
|
1212 | + // realPathSafe() provides a reasonable facsimile of realpath() but does not resolve symbolic links, nor does it check that the file/path actually exists |
|
1213 | + if (!$this->config_disable_realpath) { |
|
1214 | + return realpath($filename); |
|
1215 | + } |
|
1295 | 1216 | |
1296 | - // relative filename (any OS) |
|
1297 | - if (preg_match('#^'.preg_quote($this->config_document_root).'#', $filename)) { |
|
1298 | - $AbsoluteFilename = $filename; |
|
1299 | - $this->DebugMessage('ResolveFilenameToAbsolute() NOT prepending $this->config_document_root ('.$this->config_document_root.') to $filename ('.$filename.') resulting in ($AbsoluteFilename = "'.$AbsoluteFilename.'")', __FILE__, __LINE__); |
|
1300 | - } else { |
|
1301 | - $AbsoluteFilename = $this->config_document_root.$filename; |
|
1302 | - $this->DebugMessage('ResolveFilenameToAbsolute() prepending $this->config_document_root ('.$this->config_document_root.') to $filename ('.$filename.') resulting in ($AbsoluteFilename = "'.$AbsoluteFilename.'")', __FILE__, __LINE__); |
|
1303 | - } |
|
1217 | + // http://stackoverflow.com/questions/21421569 |
|
1218 | + $newfilename = preg_replace('#[\\/]+#', DIRECTORY_SEPARATOR, $filename); |
|
1219 | + if (!preg_match('#^'.DIRECTORY_SEPARATOR.'#', $newfilename)) { |
|
1220 | + $newfilename = __DIR__ .DIRECTORY_SEPARATOR.$newfilename; |
|
1221 | + } |
|
1222 | + do { |
|
1223 | + $beforeloop = $newfilename; |
|
1224 | + |
|
1225 | + // Replace all sequences of more than one / with a single one [[ If you're working on a system that treats // at the start of a path as special, make sure you replace multiple / characters at the start with two of them. This is the only place where POSIX allows (but does not mandate) special handling for multiples, in all other cases, multiple / characters are equivalent to a single one.]] |
|
1226 | + $newfilename = preg_replace('#'.DIRECTORY_SEPARATOR.'+#', DIRECTORY_SEPARATOR, $newfilename); |
|
1227 | + |
|
1228 | + // Replace all occurrences of /./ with / |
|
1229 | + $newfilename = preg_replace('#'.DIRECTORY_SEPARATOR.'\\.'.DIRECTORY_SEPARATOR.'#', DIRECTORY_SEPARATOR, $newfilename); |
|
1230 | + |
|
1231 | + // Remove ./ if at the start |
|
1232 | + $newfilename = preg_replace('#^\\.'.DIRECTORY_SEPARATOR.'#', '', $newfilename); |
|
1233 | + |
|
1234 | + // Remove /. if at the end |
|
1235 | + $newfilename = preg_replace('#'.DIRECTORY_SEPARATOR.'\\.$#', '', $newfilename); |
|
1236 | + |
|
1237 | + // Replace /anything/../ with / |
|
1238 | + $newfilename = preg_replace('#'.DIRECTORY_SEPARATOR.'[^'.DIRECTORY_SEPARATOR.']+'.DIRECTORY_SEPARATOR.'\\.\\.'.DIRECTORY_SEPARATOR.'#', DIRECTORY_SEPARATOR, $newfilename); |
|
1239 | + |
|
1240 | + // Remove /anything/.. if at the end |
|
1241 | + $newfilename = preg_replace('#'.DIRECTORY_SEPARATOR.'[^'.DIRECTORY_SEPARATOR.']+'.DIRECTORY_SEPARATOR.'\\.\\.$#', '', $newfilename); |
|
1242 | + |
|
1243 | + } while ($newfilename != $beforeloop); |
|
1244 | + return $newfilename; |
|
1245 | + } |
|
1246 | + |
|
1247 | + |
|
1248 | + public function ResolveFilenameToAbsolute($filename) { |
|
1249 | + if (empty($filename)) { |
|
1250 | + return false; |
|
1251 | + } |
|
1252 | + |
|
1253 | + if (preg_match('#^[a-z0-9]+\:/{1,2}#i', $filename)) { |
|
1254 | + // eg: http://host/path/file.jpg (HTTP URL) |
|
1255 | + // eg: ftp://host/path/file.jpg (FTP URL) |
|
1256 | + // eg: data1:/path/file.jpg (Netware path) |
|
1257 | + |
|
1258 | + //$AbsoluteFilename = $filename; |
|
1259 | + return $filename; |
|
1260 | + |
|
1261 | + } elseif ($this->iswindows && isset($filename{1}) && ($filename{1} == ':')) { |
|
1262 | + |
|
1263 | + // absolute pathname (Windows) |
|
1264 | + $AbsoluteFilename = $filename; |
|
1265 | + |
|
1266 | + } elseif ($this->iswindows && ((substr($filename, 0, 2) == '//') || (substr($filename, 0, 2) == '\\\\'))) { |
|
1267 | + |
|
1268 | + // absolute pathname (Windows) |
|
1269 | + $AbsoluteFilename = $filename; |
|
1270 | + |
|
1271 | + } elseif ($filename{0} == '/') { |
|
1272 | + |
|
1273 | + if (@is_readable($filename) && !@is_readable($this->config_document_root.$filename)) { |
|
1274 | + |
|
1275 | + // absolute filename (*nix) |
|
1276 | + $AbsoluteFilename = $filename; |
|
1277 | + |
|
1278 | + } elseif (isset($filename{1}) && ($filename{1} == '~')) { |
|
1279 | + |
|
1280 | + // /~user/path |
|
1281 | + if ($ApacheLookupURIarray = phpthumb_functions::ApacheLookupURIarray($filename)) { |
|
1282 | + $AbsoluteFilename = $ApacheLookupURIarray['filename']; |
|
1283 | + } else { |
|
1284 | + $AbsoluteFilename = $this->realPathSafe($filename); |
|
1285 | + if (@is_readable($AbsoluteFilename)) { |
|
1286 | + $this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.$filename.'", but the correct filename ('.$AbsoluteFilename.') seems to have been resolved with $this->realPathSafe($filename)', __FILE__, __LINE__); |
|
1287 | + } elseif (is_dir(dirname($AbsoluteFilename))) { |
|
1288 | + $this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.dirname($filename).'", but the correct directory ('.dirname($AbsoluteFilename).') seems to have been resolved with $this->realPathSafe(.)', __FILE__, __LINE__); |
|
1289 | + } else { |
|
1290 | + return $this->ErrorImage('phpthumb_functions::ApacheLookupURIarray() failed for "'.$filename.'". This has been known to fail on Apache2 - try using the absolute filename for the source image (ex: "/home/user/httpdocs/image.jpg" instead of "/~user/image.jpg")'); |
|
1291 | + } |
|
1292 | + } |
|
1293 | + |
|
1294 | + } else { |
|
1295 | + |
|
1296 | + // relative filename (any OS) |
|
1297 | + if (preg_match('#^'.preg_quote($this->config_document_root).'#', $filename)) { |
|
1298 | + $AbsoluteFilename = $filename; |
|
1299 | + $this->DebugMessage('ResolveFilenameToAbsolute() NOT prepending $this->config_document_root ('.$this->config_document_root.') to $filename ('.$filename.') resulting in ($AbsoluteFilename = "'.$AbsoluteFilename.'")', __FILE__, __LINE__); |
|
1300 | + } else { |
|
1301 | + $AbsoluteFilename = $this->config_document_root.$filename; |
|
1302 | + $this->DebugMessage('ResolveFilenameToAbsolute() prepending $this->config_document_root ('.$this->config_document_root.') to $filename ('.$filename.') resulting in ($AbsoluteFilename = "'.$AbsoluteFilename.'")', __FILE__, __LINE__); |
|
1303 | + } |
|
1304 | + |
|
1305 | + } |
|
1304 | 1306 | |
1305 | - } |
|
1307 | + } else { |
|
1306 | 1308 | |
1307 | - } else { |
|
1309 | + // relative to current directory (any OS) |
|
1310 | + $AbsoluteFilename = __DIR__ .DIRECTORY_SEPARATOR.preg_replace('#[/\\\\]#', DIRECTORY_SEPARATOR, $filename); |
|
1311 | + |
|
1312 | + if (substr(dirname(@$_SERVER['PHP_SELF']), 0, 2) == '/~') { |
|
1313 | + if ($ApacheLookupURIarray = phpthumb_functions::ApacheLookupURIarray(dirname(@$_SERVER['PHP_SELF']))) { |
|
1314 | + $AbsoluteFilename = $ApacheLookupURIarray['filename'].DIRECTORY_SEPARATOR.$filename; |
|
1315 | + } else { |
|
1316 | + $AbsoluteFilename = $this->realPathSafe('.').DIRECTORY_SEPARATOR.$filename; |
|
1317 | + if (@is_readable($AbsoluteFilename)) { |
|
1318 | + $this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.dirname(@$_SERVER['PHP_SELF']).'", but the correct filename ('.$AbsoluteFilename.') seems to have been resolved with $this->realPathSafe(.)/$filename', __FILE__, __LINE__); |
|
1319 | + } elseif (is_dir(dirname($AbsoluteFilename))) { |
|
1320 | + $this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.dirname(@$_SERVER['PHP_SELF']).'", but the correct directory ('.dirname($AbsoluteFilename).') seems to have been resolved with $this->realPathSafe(.)', __FILE__, __LINE__); |
|
1321 | + } else { |
|
1322 | + return $this->ErrorImage('phpthumb_functions::ApacheLookupURIarray() failed for "'.dirname(@$_SERVER['PHP_SELF']).'". This has been known to fail on Apache2 - try using the absolute filename for the source image'); |
|
1323 | + } |
|
1324 | + } |
|
1325 | + } |
|
1308 | 1326 | |
1309 | - // relative to current directory (any OS) |
|
1310 | - $AbsoluteFilename = __DIR__ .DIRECTORY_SEPARATOR.preg_replace('#[/\\\\]#', DIRECTORY_SEPARATOR, $filename); |
|
1311 | - |
|
1312 | - if (substr(dirname(@$_SERVER['PHP_SELF']), 0, 2) == '/~') { |
|
1313 | - if ($ApacheLookupURIarray = phpthumb_functions::ApacheLookupURIarray(dirname(@$_SERVER['PHP_SELF']))) { |
|
1314 | - $AbsoluteFilename = $ApacheLookupURIarray['filename'].DIRECTORY_SEPARATOR.$filename; |
|
1315 | - } else { |
|
1316 | - $AbsoluteFilename = $this->realPathSafe('.').DIRECTORY_SEPARATOR.$filename; |
|
1317 | - if (@is_readable($AbsoluteFilename)) { |
|
1318 | - $this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.dirname(@$_SERVER['PHP_SELF']).'", but the correct filename ('.$AbsoluteFilename.') seems to have been resolved with $this->realPathSafe(.)/$filename', __FILE__, __LINE__); |
|
1319 | - } elseif (is_dir(dirname($AbsoluteFilename))) { |
|
1320 | - $this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.dirname(@$_SERVER['PHP_SELF']).'", but the correct directory ('.dirname($AbsoluteFilename).') seems to have been resolved with $this->realPathSafe(.)', __FILE__, __LINE__); |
|
1321 | - } else { |
|
1322 | - return $this->ErrorImage('phpthumb_functions::ApacheLookupURIarray() failed for "'.dirname(@$_SERVER['PHP_SELF']).'". This has been known to fail on Apache2 - try using the absolute filename for the source image'); |
|
1323 | - } |
|
1324 | - } |
|
1325 | - } |
|
1326 | - |
|
1327 | - } |
|
1328 | - /* |
|
1327 | + } |
|
1328 | + /* |
|
1329 | 1329 | // removed 2014-May-30: http://support.silisoftware.com/phpBB3/viewtopic.php?t=961 |
1330 | 1330 | if (is_link($AbsoluteFilename)) { |
1331 | 1331 | $this->DebugMessage('is_link()==true, changing "'.$AbsoluteFilename.'" to "'.readlink($AbsoluteFilename).'"', __FILE__, __LINE__); |
@@ -1335,317 +1335,317 @@ discard block |
||
1335 | 1335 | $AbsoluteFilename = $this->realPathSafe($AbsoluteFilename); |
1336 | 1336 | } |
1337 | 1337 | */ |
1338 | - if ($this->iswindows) { |
|
1339 | - $AbsoluteFilename = preg_replace('#^'.preg_quote($this->realPathSafe($this->config_document_root)).'#i', str_replace('\\', '\\\\', $this->realPathSafe($this->config_document_root)), $AbsoluteFilename); |
|
1340 | - $AbsoluteFilename = str_replace(DIRECTORY_SEPARATOR, '/', $AbsoluteFilename); |
|
1341 | - } |
|
1342 | - $resolvedAbsoluteFilename = $this->resolvePath($AbsoluteFilename, $this->config_additional_allowed_dirs); |
|
1343 | - if (!$this->config_allow_src_above_docroot && !preg_match('#^'.preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', $this->realPathSafe($this->config_document_root))).'#', $resolvedAbsoluteFilename)) { |
|
1344 | - $this->DebugMessage('!$this->config_allow_src_above_docroot therefore setting "'.$AbsoluteFilename.'" (outside "'.$this->realPathSafe($this->config_document_root).'") to null', __FILE__, __LINE__); |
|
1345 | - return false; |
|
1346 | - } |
|
1347 | - if (!$this->config_allow_src_above_phpthumb && !preg_match('#^'.preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', __DIR__ )).'#', $resolvedAbsoluteFilename)) { |
|
1348 | - $this->DebugMessage('!$this->config_allow_src_above_phpthumb therefore setting "'.$AbsoluteFilename.'" (outside "'. __DIR__ .'") to null', __FILE__, __LINE__); |
|
1349 | - return false; |
|
1350 | - } |
|
1351 | - return $resolvedAbsoluteFilename; |
|
1352 | - } |
|
1353 | - |
|
1354 | - |
|
1355 | - public function file_exists_ignoreopenbasedir($filename, $cached=true) { |
|
1356 | - static $open_basedirs = null; |
|
1357 | - static $file_exists_cache = array(); |
|
1358 | - if (!$cached || !isset($file_exists_cache[$filename])) { |
|
1359 | - if (null === $open_basedirs) { |
|
1360 | - $open_basedirs = preg_split('#[;:]#', ini_get('open_basedir')); |
|
1361 | - } |
|
1362 | - if (empty($open_basedirs) || in_array(dirname($filename), $open_basedirs)) { |
|
1363 | - $file_exists_cache[$filename] = file_exists($filename); |
|
1364 | - } elseif ($this->iswindows) { |
|
1365 | - $ls_filename = trim(phpthumb_functions::SafeExec('dir /b '.phpthumb_functions::escapeshellarg_replacement($filename))); |
|
1366 | - $file_exists_cache[$filename] = ($ls_filename == basename($filename)); // command dir /b return only filename without path |
|
1367 | - } else { |
|
1368 | - $ls_filename = trim(phpthumb_functions::SafeExec('ls '.phpthumb_functions::escapeshellarg_replacement($filename))); |
|
1369 | - $file_exists_cache[$filename] = ($ls_filename == $filename); |
|
1370 | - } |
|
1371 | - } |
|
1372 | - return $file_exists_cache[$filename]; |
|
1373 | - } |
|
1374 | - |
|
1375 | - |
|
1376 | - public function ImageMagickWhichConvert() { |
|
1377 | - static $WhichConvert = null; |
|
1378 | - if (null === $WhichConvert) { |
|
1379 | - if ($this->iswindows) { |
|
1380 | - $WhichConvert = false; |
|
1381 | - } else { |
|
1382 | - $IMwhichConvertCacheFilename = $this->config_cache_directory.DIRECTORY_SEPARATOR.'phpThumbCacheIMwhichConvert.txt'; |
|
1383 | - if (($cachedwhichconvertstring = @file_get_contents($IMwhichConvertCacheFilename)) !== false) { |
|
1384 | - $WhichConvert = $cachedwhichconvertstring; |
|
1385 | - } else { |
|
1386 | - $WhichConvert = trim(phpthumb_functions::SafeExec('which convert')); |
|
1387 | - @file_put_contents($IMwhichConvertCacheFilename, $WhichConvert); |
|
1388 | - @chmod($IMwhichConvertCacheFilename, $this->getParameter('config_file_create_mask')); |
|
1389 | - } |
|
1390 | - } |
|
1391 | - } |
|
1392 | - return $WhichConvert; |
|
1393 | - } |
|
1394 | - |
|
1395 | - |
|
1396 | - public function ImageMagickCommandlineBase() { |
|
1397 | - static $commandline = null; |
|
1398 | - if (null === $commandline) { |
|
1399 | - if ($this->issafemode) { |
|
1400 | - $commandline = ''; |
|
1401 | - return $commandline; |
|
1402 | - } |
|
1403 | - |
|
1404 | - $IMcommandlineBaseCacheFilename = $this->config_cache_directory.DIRECTORY_SEPARATOR.'phpThumbCacheIMcommandlineBase.txt'; |
|
1405 | - if (($commandline = @file_get_contents($IMcommandlineBaseCacheFilename)) !== false) { |
|
1406 | - return $commandline; |
|
1407 | - } |
|
1408 | - |
|
1409 | - $commandline = (null !== $this->config_imagemagick_path ? $this->config_imagemagick_path : ''); |
|
1410 | - |
|
1411 | - if ($this->config_imagemagick_path && ($this->config_imagemagick_path != $this->realPathSafe($this->config_imagemagick_path))) { |
|
1412 | - if (@is_executable($this->realPathSafe($this->config_imagemagick_path))) { |
|
1413 | - $this->DebugMessage('Changing $this->config_imagemagick_path ('.$this->config_imagemagick_path.') to $this->realPathSafe($this->config_imagemagick_path) ('.$this->realPathSafe($this->config_imagemagick_path).')', __FILE__, __LINE__); |
|
1414 | - $this->config_imagemagick_path = $this->realPathSafe($this->config_imagemagick_path); |
|
1415 | - } else { |
|
1416 | - $this->DebugMessage('Leaving $this->config_imagemagick_path as ('.$this->config_imagemagick_path.') because !is_execuatable($this->realPathSafe($this->config_imagemagick_path)) ('.$this->realPathSafe($this->config_imagemagick_path).')', __FILE__, __LINE__); |
|
1417 | - } |
|
1418 | - } |
|
1419 | - $this->DebugMessage(' file_exists('.$this->config_imagemagick_path.') = '. (int) (@file_exists($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1420 | - $this->DebugMessage('file_exists_ignoreopenbasedir('.$this->config_imagemagick_path.') = '. (int) $this->file_exists_ignoreopenbasedir($this->config_imagemagick_path), __FILE__, __LINE__); |
|
1421 | - $this->DebugMessage(' is_file('.$this->config_imagemagick_path.') = '. (int) (@is_file($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1422 | - $this->DebugMessage(' is_executable('.$this->config_imagemagick_path.') = '. (int) (@is_executable($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1423 | - |
|
1424 | - if ($this->file_exists_ignoreopenbasedir($this->config_imagemagick_path)) { |
|
1425 | - |
|
1426 | - $this->DebugMessage('using ImageMagick path from $this->config_imagemagick_path ('.$this->config_imagemagick_path.')', __FILE__, __LINE__); |
|
1427 | - if ($this->iswindows) { |
|
1428 | - $commandline = substr($this->config_imagemagick_path, 0, 2).' && cd '.phpthumb_functions::escapeshellarg_replacement(str_replace('/', DIRECTORY_SEPARATOR, substr(dirname($this->config_imagemagick_path), 2))).' && '.phpthumb_functions::escapeshellarg_replacement(basename($this->config_imagemagick_path)); |
|
1429 | - } else { |
|
1430 | - $commandline = phpthumb_functions::escapeshellarg_replacement($this->config_imagemagick_path); |
|
1431 | - } |
|
1432 | - |
|
1433 | - } else { |
|
1434 | - |
|
1435 | - $which_convert = $this->ImageMagickWhichConvert(); |
|
1436 | - $IMversion = $this->ImageMagickVersion(); |
|
1437 | - |
|
1438 | - if ($which_convert && ($which_convert{0} == '/') && $this->file_exists_ignoreopenbasedir($which_convert)) { |
|
1439 | - |
|
1440 | - // `which convert` *should* return the path if "convert" exist, or nothing if it doesn't |
|
1441 | - // other things *may* get returned, like "sh: convert: not found" or "no convert in /usr/local/bin /usr/sbin /usr/bin /usr/ccs/bin" |
|
1442 | - // so only do this if the value returned exists as a file |
|
1443 | - $this->DebugMessage('using ImageMagick path from `which convert` ('.$which_convert.')', __FILE__, __LINE__); |
|
1444 | - $commandline = 'convert'; |
|
1445 | - |
|
1446 | - } elseif ($IMversion) { |
|
1447 | - |
|
1448 | - $this->DebugMessage('setting ImageMagick path to $this->config_imagemagick_path ('.$this->config_imagemagick_path.') ['.$IMversion.']', __FILE__, __LINE__); |
|
1449 | - $commandline = $this->config_imagemagick_path; |
|
1450 | - |
|
1451 | - } else { |
|
1452 | - |
|
1453 | - $this->DebugMessage('ImageMagickThumbnailToGD() aborting because cannot find convert in $this->config_imagemagick_path ('.$this->config_imagemagick_path.'), and `which convert` returned ('.$which_convert.')', __FILE__, __LINE__); |
|
1454 | - $commandline = ''; |
|
1455 | - |
|
1456 | - } |
|
1457 | - |
|
1458 | - } |
|
1459 | - |
|
1460 | - @file_put_contents($IMcommandlineBaseCacheFilename, $commandline); |
|
1461 | - @chmod($IMcommandlineBaseCacheFilename, $this->getParameter('config_file_create_mask')); |
|
1462 | - } |
|
1463 | - return $commandline; |
|
1464 | - } |
|
1465 | - |
|
1466 | - |
|
1467 | - public function ImageMagickVersion($returnRAW=false) { |
|
1468 | - static $versionstring = null; |
|
1469 | - if (null === $versionstring) { |
|
1470 | - $versionstring = array(0=>false, 1=>false); |
|
1471 | - |
|
1472 | - $IMversionCacheFilename = $this->config_cache_directory.DIRECTORY_SEPARATOR.'phpThumbCacheIMversion.txt'; |
|
1473 | - if ($cachedversionstring = @file_get_contents($IMversionCacheFilename)) { |
|
1474 | - |
|
1475 | - $versionstring = explode("\n", $cachedversionstring, 2); |
|
1476 | - $versionstring[0] = ($versionstring[0] ? $versionstring[0] : false); // "false" is stored as an empty string in the cache file |
|
1477 | - $versionstring[1] = ($versionstring[1] ? $versionstring[1] : false); // "false" is stored as an empty string in the cache file |
|
1478 | - |
|
1479 | - } else { |
|
1480 | - |
|
1481 | - $commandline = $this->ImageMagickCommandlineBase(); |
|
1482 | - $commandline = (null !== $commandline ? $commandline : ''); |
|
1483 | - if ($commandline) { |
|
1484 | - $commandline .= ' --version'; |
|
1485 | - $this->DebugMessage('ImageMagick version checked with "'.$commandline.'"', __FILE__, __LINE__); |
|
1486 | - $versionstring[1] = trim(phpthumb_functions::SafeExec($commandline)); |
|
1487 | - if (preg_match('#^Version: [^0-9]*([ 0-9\\.\\:Q/\\-]+)#i', $versionstring[1], $matches)) { |
|
1488 | - $versionstring[0] = trim($matches[1]); |
|
1489 | - } else { |
|
1490 | - $versionstring[0] = false; |
|
1491 | - $this->DebugMessage('ImageMagick did not return recognized version string ('.$versionstring[1].')', __FILE__, __LINE__); |
|
1492 | - } |
|
1493 | - $this->DebugMessage('ImageMagick convert --version says "'.@$matches[0].'"', __FILE__, __LINE__); |
|
1494 | - } |
|
1495 | - |
|
1496 | - @file_put_contents($IMversionCacheFilename, $versionstring[0]."\n".$versionstring[1]); |
|
1497 | - @chmod($IMversionCacheFilename, $this->getParameter('config_file_create_mask')); |
|
1498 | - |
|
1499 | - } |
|
1500 | - } |
|
1501 | - return $versionstring[ (int) $returnRAW ]; |
|
1502 | - } |
|
1503 | - |
|
1504 | - |
|
1505 | - public function ImageMagickSwitchAvailable($switchname) { |
|
1506 | - static $IMoptions = null; |
|
1507 | - if (null === $IMoptions) { |
|
1508 | - $IMoptions = array(); |
|
1509 | - $commandline = $this->ImageMagickCommandlineBase(); |
|
1510 | - if (null !== $commandline) { |
|
1511 | - $commandline .= ' -help'; |
|
1512 | - $IMhelp_lines = explode("\n", phpthumb_functions::SafeExec($commandline)); |
|
1513 | - foreach ($IMhelp_lines as $line) { |
|
1514 | - if (preg_match('#^[\\+\\-]([a-z\\-]+) #', trim($line), $matches)) { |
|
1515 | - $IMoptions[$matches[1]] = true; |
|
1516 | - } |
|
1517 | - } |
|
1518 | - } |
|
1519 | - } |
|
1520 | - if (is_array($switchname)) { |
|
1521 | - $allOK = true; |
|
1522 | - foreach ($switchname as $key => $value) { |
|
1523 | - if (!isset($IMoptions[$value])) { |
|
1524 | - $allOK = false; |
|
1525 | - break; |
|
1526 | - } |
|
1527 | - } |
|
1528 | - $this->DebugMessage('ImageMagickSwitchAvailable('.implode(';', $switchname).') = '. (int) $allOK .'', __FILE__, __LINE__); |
|
1529 | - } else { |
|
1530 | - $allOK = isset($IMoptions[$switchname]); |
|
1531 | - $this->DebugMessage('ImageMagickSwitchAvailable('.$switchname.') = '. (int) $allOK .'', __FILE__, __LINE__); |
|
1532 | - } |
|
1533 | - return $allOK; |
|
1534 | - } |
|
1535 | - |
|
1536 | - |
|
1537 | - public function ImageMagickFormatsList() { |
|
1538 | - static $IMformatsList = null; |
|
1539 | - if (null === $IMformatsList) { |
|
1540 | - $IMformatsList = ''; |
|
1541 | - $commandline = $this->ImageMagickCommandlineBase(); |
|
1542 | - if (null !== $commandline) { |
|
1543 | - $commandline = dirname($commandline).DIRECTORY_SEPARATOR.str_replace('convert', 'identify', basename($commandline)); |
|
1544 | - $commandline .= ' -list format'; |
|
1545 | - $IMformatsList = phpthumb_functions::SafeExec($commandline); |
|
1546 | - } |
|
1547 | - } |
|
1548 | - return $IMformatsList; |
|
1549 | - } |
|
1550 | - |
|
1551 | - |
|
1552 | - public function SourceDataToTempFile() { |
|
1553 | - if ($IMtempSourceFilename = $this->phpThumb_tempnam()) { |
|
1554 | - $IMtempSourceFilename = $this->realPathSafe($IMtempSourceFilename); |
|
1555 | - ob_start(); |
|
1556 | - $fp_tempfile = fopen($IMtempSourceFilename, 'wb'); |
|
1557 | - $tempfile_open_error = ob_get_contents(); |
|
1558 | - ob_end_clean(); |
|
1559 | - if ($fp_tempfile) { |
|
1560 | - fwrite($fp_tempfile, $this->rawImageData); |
|
1561 | - fclose($fp_tempfile); |
|
1562 | - @chmod($IMtempSourceFilename, $this->getParameter('config_file_create_mask')); |
|
1563 | - $this->sourceFilename = $IMtempSourceFilename; |
|
1564 | - $this->DebugMessage('ImageMagickThumbnailToGD() setting $this->sourceFilename to "'.$IMtempSourceFilename.'" from $this->rawImageData ('.strlen($this->rawImageData).' bytes)', __FILE__, __LINE__); |
|
1565 | - } else { |
|
1566 | - $this->DebugMessage('ImageMagickThumbnailToGD() FAILED setting $this->sourceFilename to "'.$IMtempSourceFilename.'" (failed to open for writing: "'.$tempfile_open_error.'")', __FILE__, __LINE__); |
|
1567 | - } |
|
1568 | - unset($tempfile_open_error, $IMtempSourceFilename); |
|
1569 | - return true; |
|
1570 | - } |
|
1571 | - $this->DebugMessage('SourceDataToTempFile() FAILED because $this->phpThumb_tempnam() failed', __FILE__, __LINE__); |
|
1572 | - return false; |
|
1573 | - } |
|
1574 | - |
|
1575 | - |
|
1576 | - public function ImageMagickThumbnailToGD() { |
|
1577 | - // http://www.imagemagick.org/script/command-line-options.php |
|
1578 | - |
|
1579 | - $this->useRawIMoutput = true; |
|
1580 | - if (phpthumb_functions::gd_version()) { |
|
1581 | - // if GD is not available, must use whatever ImageMagick can output |
|
1582 | - |
|
1583 | - // $UnAllowedParameters contains options that can only be processed in GD, not ImageMagick |
|
1584 | - // note: 'fltr' *may* need to be processed by GD, but we'll check that in more detail below |
|
1585 | - $UnAllowedParameters = array('xto', 'ar', 'bg', 'bc'); |
|
1586 | - // 'ra' may be part of this list, if not a multiple of 90 degrees |
|
1587 | - foreach ($UnAllowedParameters as $parameter) { |
|
1588 | - if (isset($this->$parameter)) { |
|
1589 | - $this->DebugMessage('$this->useRawIMoutput=false because "'.$parameter.'" is set', __FILE__, __LINE__); |
|
1590 | - $this->useRawIMoutput = false; |
|
1591 | - break; |
|
1592 | - } |
|
1593 | - } |
|
1594 | - } |
|
1595 | - $this->DebugMessage('$this->useRawIMoutput='.($this->useRawIMoutput ? 'true' : 'false').' after checking $UnAllowedParameters', __FILE__, __LINE__); |
|
1596 | - $ImageCreateFunction = ''; |
|
1597 | - $outputFormat = $this->thumbnailFormat; |
|
1598 | - if (phpthumb_functions::gd_version()) { |
|
1599 | - if ($this->useRawIMoutput) { |
|
1600 | - switch ($this->thumbnailFormat) { |
|
1601 | - case 'gif': |
|
1602 | - $ImageCreateFunction = 'imagecreatefromgif'; |
|
1603 | - $this->is_alpha = true; |
|
1604 | - break; |
|
1605 | - case 'png': |
|
1606 | - $ImageCreateFunction = 'imagecreatefrompng'; |
|
1607 | - $this->is_alpha = true; |
|
1608 | - break; |
|
1609 | - case 'jpg': |
|
1610 | - case 'jpeg': |
|
1611 | - $ImageCreateFunction = 'imagecreatefromjpeg'; |
|
1612 | - break; |
|
1613 | - default: |
|
1614 | - $this->DebugMessage('Forcing output to PNG because $this->thumbnailFormat ('.$this->thumbnailFormat.' is not a GD-supported format)', __FILE__, __LINE__); |
|
1615 | - $outputFormat = 'png'; |
|
1616 | - $ImageCreateFunction = 'imagecreatefrompng'; |
|
1617 | - $this->is_alpha = true; |
|
1618 | - $this->useRawIMoutput = false; |
|
1619 | - break; |
|
1620 | - } |
|
1621 | - if (!function_exists(@$ImageCreateFunction)) { |
|
1622 | - // ImageMagickThumbnailToGD() depends on imagecreatefrompng/imagecreatefromgif |
|
1623 | - //$this->DebugMessage('ImageMagickThumbnailToGD() aborting because '.@$ImageCreateFunction.'() is not available', __FILE__, __LINE__); |
|
1624 | - $this->useRawIMoutput = true; |
|
1625 | - //return false; |
|
1626 | - } |
|
1627 | - } else { |
|
1628 | - $outputFormat = 'png'; |
|
1629 | - $ImageCreateFunction = 'imagecreatefrompng'; |
|
1630 | - $this->is_alpha = true; |
|
1631 | - $this->useRawIMoutput = false; |
|
1632 | - } |
|
1633 | - } |
|
1634 | - |
|
1635 | - // http://freealter.org/doc_distrib/ImageMagick-5.1.1/www/convert.html |
|
1636 | - if (!$this->sourceFilename && $this->rawImageData) { |
|
1637 | - $this->SourceDataToTempFile(); |
|
1638 | - } |
|
1639 | - if (!$this->sourceFilename) { |
|
1640 | - $this->DebugMessage('ImageMagickThumbnailToGD() aborting because $this->sourceFilename is empty', __FILE__, __LINE__); |
|
1641 | - $this->useRawIMoutput = false; |
|
1642 | - return false; |
|
1643 | - } |
|
1644 | - if ($this->issafemode) { |
|
1645 | - $this->DebugMessage('ImageMagickThumbnailToGD() aborting because safe_mode is enabled', __FILE__, __LINE__); |
|
1646 | - $this->useRawIMoutput = false; |
|
1647 | - return false; |
|
1648 | - } |
|
1338 | + if ($this->iswindows) { |
|
1339 | + $AbsoluteFilename = preg_replace('#^'.preg_quote($this->realPathSafe($this->config_document_root)).'#i', str_replace('\\', '\\\\', $this->realPathSafe($this->config_document_root)), $AbsoluteFilename); |
|
1340 | + $AbsoluteFilename = str_replace(DIRECTORY_SEPARATOR, '/', $AbsoluteFilename); |
|
1341 | + } |
|
1342 | + $resolvedAbsoluteFilename = $this->resolvePath($AbsoluteFilename, $this->config_additional_allowed_dirs); |
|
1343 | + if (!$this->config_allow_src_above_docroot && !preg_match('#^'.preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', $this->realPathSafe($this->config_document_root))).'#', $resolvedAbsoluteFilename)) { |
|
1344 | + $this->DebugMessage('!$this->config_allow_src_above_docroot therefore setting "'.$AbsoluteFilename.'" (outside "'.$this->realPathSafe($this->config_document_root).'") to null', __FILE__, __LINE__); |
|
1345 | + return false; |
|
1346 | + } |
|
1347 | + if (!$this->config_allow_src_above_phpthumb && !preg_match('#^'.preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', __DIR__ )).'#', $resolvedAbsoluteFilename)) { |
|
1348 | + $this->DebugMessage('!$this->config_allow_src_above_phpthumb therefore setting "'.$AbsoluteFilename.'" (outside "'. __DIR__ .'") to null', __FILE__, __LINE__); |
|
1349 | + return false; |
|
1350 | + } |
|
1351 | + return $resolvedAbsoluteFilename; |
|
1352 | + } |
|
1353 | + |
|
1354 | + |
|
1355 | + public function file_exists_ignoreopenbasedir($filename, $cached=true) { |
|
1356 | + static $open_basedirs = null; |
|
1357 | + static $file_exists_cache = array(); |
|
1358 | + if (!$cached || !isset($file_exists_cache[$filename])) { |
|
1359 | + if (null === $open_basedirs) { |
|
1360 | + $open_basedirs = preg_split('#[;:]#', ini_get('open_basedir')); |
|
1361 | + } |
|
1362 | + if (empty($open_basedirs) || in_array(dirname($filename), $open_basedirs)) { |
|
1363 | + $file_exists_cache[$filename] = file_exists($filename); |
|
1364 | + } elseif ($this->iswindows) { |
|
1365 | + $ls_filename = trim(phpthumb_functions::SafeExec('dir /b '.phpthumb_functions::escapeshellarg_replacement($filename))); |
|
1366 | + $file_exists_cache[$filename] = ($ls_filename == basename($filename)); // command dir /b return only filename without path |
|
1367 | + } else { |
|
1368 | + $ls_filename = trim(phpthumb_functions::SafeExec('ls '.phpthumb_functions::escapeshellarg_replacement($filename))); |
|
1369 | + $file_exists_cache[$filename] = ($ls_filename == $filename); |
|
1370 | + } |
|
1371 | + } |
|
1372 | + return $file_exists_cache[$filename]; |
|
1373 | + } |
|
1374 | + |
|
1375 | + |
|
1376 | + public function ImageMagickWhichConvert() { |
|
1377 | + static $WhichConvert = null; |
|
1378 | + if (null === $WhichConvert) { |
|
1379 | + if ($this->iswindows) { |
|
1380 | + $WhichConvert = false; |
|
1381 | + } else { |
|
1382 | + $IMwhichConvertCacheFilename = $this->config_cache_directory.DIRECTORY_SEPARATOR.'phpThumbCacheIMwhichConvert.txt'; |
|
1383 | + if (($cachedwhichconvertstring = @file_get_contents($IMwhichConvertCacheFilename)) !== false) { |
|
1384 | + $WhichConvert = $cachedwhichconvertstring; |
|
1385 | + } else { |
|
1386 | + $WhichConvert = trim(phpthumb_functions::SafeExec('which convert')); |
|
1387 | + @file_put_contents($IMwhichConvertCacheFilename, $WhichConvert); |
|
1388 | + @chmod($IMwhichConvertCacheFilename, $this->getParameter('config_file_create_mask')); |
|
1389 | + } |
|
1390 | + } |
|
1391 | + } |
|
1392 | + return $WhichConvert; |
|
1393 | + } |
|
1394 | + |
|
1395 | + |
|
1396 | + public function ImageMagickCommandlineBase() { |
|
1397 | + static $commandline = null; |
|
1398 | + if (null === $commandline) { |
|
1399 | + if ($this->issafemode) { |
|
1400 | + $commandline = ''; |
|
1401 | + return $commandline; |
|
1402 | + } |
|
1403 | + |
|
1404 | + $IMcommandlineBaseCacheFilename = $this->config_cache_directory.DIRECTORY_SEPARATOR.'phpThumbCacheIMcommandlineBase.txt'; |
|
1405 | + if (($commandline = @file_get_contents($IMcommandlineBaseCacheFilename)) !== false) { |
|
1406 | + return $commandline; |
|
1407 | + } |
|
1408 | + |
|
1409 | + $commandline = (null !== $this->config_imagemagick_path ? $this->config_imagemagick_path : ''); |
|
1410 | + |
|
1411 | + if ($this->config_imagemagick_path && ($this->config_imagemagick_path != $this->realPathSafe($this->config_imagemagick_path))) { |
|
1412 | + if (@is_executable($this->realPathSafe($this->config_imagemagick_path))) { |
|
1413 | + $this->DebugMessage('Changing $this->config_imagemagick_path ('.$this->config_imagemagick_path.') to $this->realPathSafe($this->config_imagemagick_path) ('.$this->realPathSafe($this->config_imagemagick_path).')', __FILE__, __LINE__); |
|
1414 | + $this->config_imagemagick_path = $this->realPathSafe($this->config_imagemagick_path); |
|
1415 | + } else { |
|
1416 | + $this->DebugMessage('Leaving $this->config_imagemagick_path as ('.$this->config_imagemagick_path.') because !is_execuatable($this->realPathSafe($this->config_imagemagick_path)) ('.$this->realPathSafe($this->config_imagemagick_path).')', __FILE__, __LINE__); |
|
1417 | + } |
|
1418 | + } |
|
1419 | + $this->DebugMessage(' file_exists('.$this->config_imagemagick_path.') = '. (int) (@file_exists($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1420 | + $this->DebugMessage('file_exists_ignoreopenbasedir('.$this->config_imagemagick_path.') = '. (int) $this->file_exists_ignoreopenbasedir($this->config_imagemagick_path), __FILE__, __LINE__); |
|
1421 | + $this->DebugMessage(' is_file('.$this->config_imagemagick_path.') = '. (int) (@is_file($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1422 | + $this->DebugMessage(' is_executable('.$this->config_imagemagick_path.') = '. (int) (@is_executable($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1423 | + |
|
1424 | + if ($this->file_exists_ignoreopenbasedir($this->config_imagemagick_path)) { |
|
1425 | + |
|
1426 | + $this->DebugMessage('using ImageMagick path from $this->config_imagemagick_path ('.$this->config_imagemagick_path.')', __FILE__, __LINE__); |
|
1427 | + if ($this->iswindows) { |
|
1428 | + $commandline = substr($this->config_imagemagick_path, 0, 2).' && cd '.phpthumb_functions::escapeshellarg_replacement(str_replace('/', DIRECTORY_SEPARATOR, substr(dirname($this->config_imagemagick_path), 2))).' && '.phpthumb_functions::escapeshellarg_replacement(basename($this->config_imagemagick_path)); |
|
1429 | + } else { |
|
1430 | + $commandline = phpthumb_functions::escapeshellarg_replacement($this->config_imagemagick_path); |
|
1431 | + } |
|
1432 | + |
|
1433 | + } else { |
|
1434 | + |
|
1435 | + $which_convert = $this->ImageMagickWhichConvert(); |
|
1436 | + $IMversion = $this->ImageMagickVersion(); |
|
1437 | + |
|
1438 | + if ($which_convert && ($which_convert{0} == '/') && $this->file_exists_ignoreopenbasedir($which_convert)) { |
|
1439 | + |
|
1440 | + // `which convert` *should* return the path if "convert" exist, or nothing if it doesn't |
|
1441 | + // other things *may* get returned, like "sh: convert: not found" or "no convert in /usr/local/bin /usr/sbin /usr/bin /usr/ccs/bin" |
|
1442 | + // so only do this if the value returned exists as a file |
|
1443 | + $this->DebugMessage('using ImageMagick path from `which convert` ('.$which_convert.')', __FILE__, __LINE__); |
|
1444 | + $commandline = 'convert'; |
|
1445 | + |
|
1446 | + } elseif ($IMversion) { |
|
1447 | + |
|
1448 | + $this->DebugMessage('setting ImageMagick path to $this->config_imagemagick_path ('.$this->config_imagemagick_path.') ['.$IMversion.']', __FILE__, __LINE__); |
|
1449 | + $commandline = $this->config_imagemagick_path; |
|
1450 | + |
|
1451 | + } else { |
|
1452 | + |
|
1453 | + $this->DebugMessage('ImageMagickThumbnailToGD() aborting because cannot find convert in $this->config_imagemagick_path ('.$this->config_imagemagick_path.'), and `which convert` returned ('.$which_convert.')', __FILE__, __LINE__); |
|
1454 | + $commandline = ''; |
|
1455 | + |
|
1456 | + } |
|
1457 | + |
|
1458 | + } |
|
1459 | + |
|
1460 | + @file_put_contents($IMcommandlineBaseCacheFilename, $commandline); |
|
1461 | + @chmod($IMcommandlineBaseCacheFilename, $this->getParameter('config_file_create_mask')); |
|
1462 | + } |
|
1463 | + return $commandline; |
|
1464 | + } |
|
1465 | + |
|
1466 | + |
|
1467 | + public function ImageMagickVersion($returnRAW=false) { |
|
1468 | + static $versionstring = null; |
|
1469 | + if (null === $versionstring) { |
|
1470 | + $versionstring = array(0=>false, 1=>false); |
|
1471 | + |
|
1472 | + $IMversionCacheFilename = $this->config_cache_directory.DIRECTORY_SEPARATOR.'phpThumbCacheIMversion.txt'; |
|
1473 | + if ($cachedversionstring = @file_get_contents($IMversionCacheFilename)) { |
|
1474 | + |
|
1475 | + $versionstring = explode("\n", $cachedversionstring, 2); |
|
1476 | + $versionstring[0] = ($versionstring[0] ? $versionstring[0] : false); // "false" is stored as an empty string in the cache file |
|
1477 | + $versionstring[1] = ($versionstring[1] ? $versionstring[1] : false); // "false" is stored as an empty string in the cache file |
|
1478 | + |
|
1479 | + } else { |
|
1480 | + |
|
1481 | + $commandline = $this->ImageMagickCommandlineBase(); |
|
1482 | + $commandline = (null !== $commandline ? $commandline : ''); |
|
1483 | + if ($commandline) { |
|
1484 | + $commandline .= ' --version'; |
|
1485 | + $this->DebugMessage('ImageMagick version checked with "'.$commandline.'"', __FILE__, __LINE__); |
|
1486 | + $versionstring[1] = trim(phpthumb_functions::SafeExec($commandline)); |
|
1487 | + if (preg_match('#^Version: [^0-9]*([ 0-9\\.\\:Q/\\-]+)#i', $versionstring[1], $matches)) { |
|
1488 | + $versionstring[0] = trim($matches[1]); |
|
1489 | + } else { |
|
1490 | + $versionstring[0] = false; |
|
1491 | + $this->DebugMessage('ImageMagick did not return recognized version string ('.$versionstring[1].')', __FILE__, __LINE__); |
|
1492 | + } |
|
1493 | + $this->DebugMessage('ImageMagick convert --version says "'.@$matches[0].'"', __FILE__, __LINE__); |
|
1494 | + } |
|
1495 | + |
|
1496 | + @file_put_contents($IMversionCacheFilename, $versionstring[0]."\n".$versionstring[1]); |
|
1497 | + @chmod($IMversionCacheFilename, $this->getParameter('config_file_create_mask')); |
|
1498 | + |
|
1499 | + } |
|
1500 | + } |
|
1501 | + return $versionstring[ (int) $returnRAW ]; |
|
1502 | + } |
|
1503 | + |
|
1504 | + |
|
1505 | + public function ImageMagickSwitchAvailable($switchname) { |
|
1506 | + static $IMoptions = null; |
|
1507 | + if (null === $IMoptions) { |
|
1508 | + $IMoptions = array(); |
|
1509 | + $commandline = $this->ImageMagickCommandlineBase(); |
|
1510 | + if (null !== $commandline) { |
|
1511 | + $commandline .= ' -help'; |
|
1512 | + $IMhelp_lines = explode("\n", phpthumb_functions::SafeExec($commandline)); |
|
1513 | + foreach ($IMhelp_lines as $line) { |
|
1514 | + if (preg_match('#^[\\+\\-]([a-z\\-]+) #', trim($line), $matches)) { |
|
1515 | + $IMoptions[$matches[1]] = true; |
|
1516 | + } |
|
1517 | + } |
|
1518 | + } |
|
1519 | + } |
|
1520 | + if (is_array($switchname)) { |
|
1521 | + $allOK = true; |
|
1522 | + foreach ($switchname as $key => $value) { |
|
1523 | + if (!isset($IMoptions[$value])) { |
|
1524 | + $allOK = false; |
|
1525 | + break; |
|
1526 | + } |
|
1527 | + } |
|
1528 | + $this->DebugMessage('ImageMagickSwitchAvailable('.implode(';', $switchname).') = '. (int) $allOK .'', __FILE__, __LINE__); |
|
1529 | + } else { |
|
1530 | + $allOK = isset($IMoptions[$switchname]); |
|
1531 | + $this->DebugMessage('ImageMagickSwitchAvailable('.$switchname.') = '. (int) $allOK .'', __FILE__, __LINE__); |
|
1532 | + } |
|
1533 | + return $allOK; |
|
1534 | + } |
|
1535 | + |
|
1536 | + |
|
1537 | + public function ImageMagickFormatsList() { |
|
1538 | + static $IMformatsList = null; |
|
1539 | + if (null === $IMformatsList) { |
|
1540 | + $IMformatsList = ''; |
|
1541 | + $commandline = $this->ImageMagickCommandlineBase(); |
|
1542 | + if (null !== $commandline) { |
|
1543 | + $commandline = dirname($commandline).DIRECTORY_SEPARATOR.str_replace('convert', 'identify', basename($commandline)); |
|
1544 | + $commandline .= ' -list format'; |
|
1545 | + $IMformatsList = phpthumb_functions::SafeExec($commandline); |
|
1546 | + } |
|
1547 | + } |
|
1548 | + return $IMformatsList; |
|
1549 | + } |
|
1550 | + |
|
1551 | + |
|
1552 | + public function SourceDataToTempFile() { |
|
1553 | + if ($IMtempSourceFilename = $this->phpThumb_tempnam()) { |
|
1554 | + $IMtempSourceFilename = $this->realPathSafe($IMtempSourceFilename); |
|
1555 | + ob_start(); |
|
1556 | + $fp_tempfile = fopen($IMtempSourceFilename, 'wb'); |
|
1557 | + $tempfile_open_error = ob_get_contents(); |
|
1558 | + ob_end_clean(); |
|
1559 | + if ($fp_tempfile) { |
|
1560 | + fwrite($fp_tempfile, $this->rawImageData); |
|
1561 | + fclose($fp_tempfile); |
|
1562 | + @chmod($IMtempSourceFilename, $this->getParameter('config_file_create_mask')); |
|
1563 | + $this->sourceFilename = $IMtempSourceFilename; |
|
1564 | + $this->DebugMessage('ImageMagickThumbnailToGD() setting $this->sourceFilename to "'.$IMtempSourceFilename.'" from $this->rawImageData ('.strlen($this->rawImageData).' bytes)', __FILE__, __LINE__); |
|
1565 | + } else { |
|
1566 | + $this->DebugMessage('ImageMagickThumbnailToGD() FAILED setting $this->sourceFilename to "'.$IMtempSourceFilename.'" (failed to open for writing: "'.$tempfile_open_error.'")', __FILE__, __LINE__); |
|
1567 | + } |
|
1568 | + unset($tempfile_open_error, $IMtempSourceFilename); |
|
1569 | + return true; |
|
1570 | + } |
|
1571 | + $this->DebugMessage('SourceDataToTempFile() FAILED because $this->phpThumb_tempnam() failed', __FILE__, __LINE__); |
|
1572 | + return false; |
|
1573 | + } |
|
1574 | + |
|
1575 | + |
|
1576 | + public function ImageMagickThumbnailToGD() { |
|
1577 | + // http://www.imagemagick.org/script/command-line-options.php |
|
1578 | + |
|
1579 | + $this->useRawIMoutput = true; |
|
1580 | + if (phpthumb_functions::gd_version()) { |
|
1581 | + // if GD is not available, must use whatever ImageMagick can output |
|
1582 | + |
|
1583 | + // $UnAllowedParameters contains options that can only be processed in GD, not ImageMagick |
|
1584 | + // note: 'fltr' *may* need to be processed by GD, but we'll check that in more detail below |
|
1585 | + $UnAllowedParameters = array('xto', 'ar', 'bg', 'bc'); |
|
1586 | + // 'ra' may be part of this list, if not a multiple of 90 degrees |
|
1587 | + foreach ($UnAllowedParameters as $parameter) { |
|
1588 | + if (isset($this->$parameter)) { |
|
1589 | + $this->DebugMessage('$this->useRawIMoutput=false because "'.$parameter.'" is set', __FILE__, __LINE__); |
|
1590 | + $this->useRawIMoutput = false; |
|
1591 | + break; |
|
1592 | + } |
|
1593 | + } |
|
1594 | + } |
|
1595 | + $this->DebugMessage('$this->useRawIMoutput='.($this->useRawIMoutput ? 'true' : 'false').' after checking $UnAllowedParameters', __FILE__, __LINE__); |
|
1596 | + $ImageCreateFunction = ''; |
|
1597 | + $outputFormat = $this->thumbnailFormat; |
|
1598 | + if (phpthumb_functions::gd_version()) { |
|
1599 | + if ($this->useRawIMoutput) { |
|
1600 | + switch ($this->thumbnailFormat) { |
|
1601 | + case 'gif': |
|
1602 | + $ImageCreateFunction = 'imagecreatefromgif'; |
|
1603 | + $this->is_alpha = true; |
|
1604 | + break; |
|
1605 | + case 'png': |
|
1606 | + $ImageCreateFunction = 'imagecreatefrompng'; |
|
1607 | + $this->is_alpha = true; |
|
1608 | + break; |
|
1609 | + case 'jpg': |
|
1610 | + case 'jpeg': |
|
1611 | + $ImageCreateFunction = 'imagecreatefromjpeg'; |
|
1612 | + break; |
|
1613 | + default: |
|
1614 | + $this->DebugMessage('Forcing output to PNG because $this->thumbnailFormat ('.$this->thumbnailFormat.' is not a GD-supported format)', __FILE__, __LINE__); |
|
1615 | + $outputFormat = 'png'; |
|
1616 | + $ImageCreateFunction = 'imagecreatefrompng'; |
|
1617 | + $this->is_alpha = true; |
|
1618 | + $this->useRawIMoutput = false; |
|
1619 | + break; |
|
1620 | + } |
|
1621 | + if (!function_exists(@$ImageCreateFunction)) { |
|
1622 | + // ImageMagickThumbnailToGD() depends on imagecreatefrompng/imagecreatefromgif |
|
1623 | + //$this->DebugMessage('ImageMagickThumbnailToGD() aborting because '.@$ImageCreateFunction.'() is not available', __FILE__, __LINE__); |
|
1624 | + $this->useRawIMoutput = true; |
|
1625 | + //return false; |
|
1626 | + } |
|
1627 | + } else { |
|
1628 | + $outputFormat = 'png'; |
|
1629 | + $ImageCreateFunction = 'imagecreatefrompng'; |
|
1630 | + $this->is_alpha = true; |
|
1631 | + $this->useRawIMoutput = false; |
|
1632 | + } |
|
1633 | + } |
|
1634 | + |
|
1635 | + // http://freealter.org/doc_distrib/ImageMagick-5.1.1/www/convert.html |
|
1636 | + if (!$this->sourceFilename && $this->rawImageData) { |
|
1637 | + $this->SourceDataToTempFile(); |
|
1638 | + } |
|
1639 | + if (!$this->sourceFilename) { |
|
1640 | + $this->DebugMessage('ImageMagickThumbnailToGD() aborting because $this->sourceFilename is empty', __FILE__, __LINE__); |
|
1641 | + $this->useRawIMoutput = false; |
|
1642 | + return false; |
|
1643 | + } |
|
1644 | + if ($this->issafemode) { |
|
1645 | + $this->DebugMessage('ImageMagickThumbnailToGD() aborting because safe_mode is enabled', __FILE__, __LINE__); |
|
1646 | + $this->useRawIMoutput = false; |
|
1647 | + return false; |
|
1648 | + } |
|
1649 | 1649 | // TO BE FIXED |
1650 | 1650 | //if (true) { |
1651 | 1651 | // $this->DebugMessage('ImageMagickThumbnailToGD() aborting it is broken right now', __FILE__, __LINE__); |
@@ -1653,2741 +1653,2741 @@ discard block |
||
1653 | 1653 | // return false; |
1654 | 1654 | //} |
1655 | 1655 | |
1656 | - $commandline = $this->ImageMagickCommandlineBase(); |
|
1657 | - if ($commandline) { |
|
1658 | - $commandline .= ' '.phpthumb_functions::escapeshellarg_replacement(preg_replace('#[/\\\\]#', DIRECTORY_SEPARATOR, $this->sourceFilename).(($outputFormat == 'gif') ? '' : '['. (int) $this->sfn .']')); // [0] means first frame of (GIF) animation, can be ignored |
|
1659 | - if ($IMtempfilename = $this->phpThumb_tempnam()) { |
|
1660 | - $IMtempfilename = $this->realPathSafe($IMtempfilename); |
|
1661 | - |
|
1662 | - $IMuseExplicitImageOutputDimensions = false; |
|
1663 | - if ($this->ImageMagickSwitchAvailable('thumbnail') && $this->config_imagemagick_use_thumbnail) { |
|
1664 | - $IMresizeParameter = 'thumbnail'; |
|
1665 | - } else { |
|
1666 | - $IMresizeParameter = 'resize'; |
|
1667 | - |
|
1668 | - // some (older? around 2002) versions of IM won't accept "-resize 100x" but require "-resize 100x100" |
|
1669 | - $commandline_test = $this->ImageMagickCommandlineBase().' logo: -resize 1x '.phpthumb_functions::escapeshellarg_replacement($IMtempfilename).' 2>&1'; |
|
1670 | - $IMresult_test = phpthumb_functions::SafeExec($commandline_test); |
|
1671 | - $IMuseExplicitImageOutputDimensions = preg_match('#image dimensions are zero#i', $IMresult_test); |
|
1672 | - $this->DebugMessage('IMuseExplicitImageOutputDimensions = '. (int) $IMuseExplicitImageOutputDimensions, __FILE__, __LINE__); |
|
1673 | - if ($fp_im_temp = @fopen($IMtempfilename, 'wb')) { |
|
1674 | - // erase temp image so ImageMagick logo doesn't get output if other processing fails |
|
1675 | - fclose($fp_im_temp); |
|
1676 | - @chmod($IMtempfilename, $this->getParameter('config_file_create_mask')); |
|
1677 | - } |
|
1678 | - } |
|
1679 | - |
|
1680 | - |
|
1681 | - ob_start(); |
|
1682 | - $getimagesize = getimagesize($this->sourceFilename); |
|
1683 | - $GetImageSizeError = ob_get_contents(); |
|
1684 | - ob_end_clean(); |
|
1685 | - if (is_array($getimagesize)) { |
|
1686 | - $this->DebugMessage('getimagesize('.$this->sourceFilename.') SUCCEEDED: '.print_r($getimagesize, true), __FILE__, __LINE__); |
|
1687 | - } else { |
|
1688 | - $this->DebugMessage('getimagesize('.$this->sourceFilename.') FAILED with error "'.$GetImageSizeError.'"', __FILE__, __LINE__); |
|
1689 | - } |
|
1690 | - if (null !== $this->dpi && $this->ImageMagickSwitchAvailable('density')) { |
|
1691 | - // for vector source formats only (WMF, PDF, etc) |
|
1692 | - if (is_array($getimagesize) && isset($getimagesize[2]) && ($getimagesize[2] == IMAGETYPE_PNG)) { |
|
1693 | - // explicitly exclude PNG from "-flatten" to make sure transparency is preserved |
|
1694 | - // https://github.com/JamesHeinrich/phpThumb/issues/65 |
|
1695 | - } else { |
|
1696 | - $commandline .= ' -flatten'; |
|
1697 | - $commandline .= ' -density '.phpthumb_functions::escapeshellarg_replacement($this->dpi); |
|
1698 | - } |
|
1699 | - } |
|
1700 | - if (is_array($getimagesize)) { |
|
1701 | - $this->DebugMessage('getimagesize('.$this->sourceFilename.') returned [w='.$getimagesize[0].';h='.$getimagesize[1].';f='.$getimagesize[2].']', __FILE__, __LINE__); |
|
1702 | - $this->source_width = $getimagesize[0]; |
|
1703 | - $this->source_height = $getimagesize[1]; |
|
1704 | - $this->DebugMessage('source dimensions set to '.$this->source_width.'x'.$this->source_height, __FILE__, __LINE__); |
|
1705 | - $this->SetOrientationDependantWidthHeight(); |
|
1706 | - |
|
1707 | - if (!preg_match('#('.implode('|', $this->AlphaCapableFormats).')#i', $outputFormat)) { |
|
1708 | - // not a transparency-capable format |
|
1709 | - $commandline .= ' -background '.phpthumb_functions::escapeshellarg_replacement('#'.($this->bg ? $this->bg : 'FFFFFF')); |
|
1710 | - if ($getimagesize[2] == IMAGETYPE_GIF) { |
|
1711 | - $commandline .= ' -flatten'; |
|
1712 | - } |
|
1713 | - } else { |
|
1714 | - if ($getimagesize[2] == IMAGETYPE_PNG && !$this->bg) { |
|
1715 | - $commandline .= ' -background none'; |
|
1716 | - } |
|
1717 | - } |
|
1718 | - if ($getimagesize[2] == IMAGETYPE_GIF) { |
|
1719 | - $commandline .= ' -coalesce'; // may be needed for animated GIFs |
|
1720 | - } |
|
1721 | - if ($this->source_width || $this->source_height) { |
|
1722 | - if ($this->zc) { |
|
1723 | - |
|
1724 | - $borderThickness = 0; |
|
1725 | - if (!empty($this->fltr)) { |
|
1726 | - foreach ($this->fltr as $key => $value) { |
|
1727 | - if (preg_match('#^bord\|([0-9]+)#', $value, $matches)) { |
|
1728 | - $borderThickness = $matches[1]; |
|
1729 | - break; |
|
1730 | - } |
|
1731 | - } |
|
1732 | - } |
|
1733 | - $wAll = (int) max($this->w, $this->wp, $this->wl, $this->ws) - (2 * $borderThickness); |
|
1734 | - $hAll = (int) max($this->h, $this->hp, $this->hl, $this->hs) - (2 * $borderThickness); |
|
1735 | - $imAR = $this->source_width / $this->source_height; |
|
1736 | - $zcAR = (($wAll && $hAll) ? $wAll / $hAll : 1); |
|
1737 | - $side = phpthumb_functions::nonempty_min($this->source_width, $this->source_height, max($wAll, $hAll)); |
|
1738 | - $sideX = phpthumb_functions::nonempty_min($this->source_width, $wAll, round($hAll * $zcAR)); |
|
1739 | - $sideY = phpthumb_functions::nonempty_min( $this->source_height, $hAll, round($wAll / $zcAR)); |
|
1740 | - |
|
1741 | - $thumbnailH = round(max($sideY, ($sideY * $zcAR) / $imAR)); |
|
1742 | - if ($this->aoe == 1) { |
|
1743 | - $commandline .= ' -'.$IMresizeParameter.' "'.$wAll.'x'.$hAll.'^"'; |
|
1744 | - } else { |
|
1745 | - $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement(($IMuseExplicitImageOutputDimensions ? $thumbnailH : '').'x'.$thumbnailH); |
|
1746 | - } |
|
1747 | - |
|
1748 | - switch (strtoupper($this->zc)) { |
|
1749 | - case 'T': |
|
1750 | - $commandline .= ' -gravity north'; |
|
1751 | - break; |
|
1752 | - case 'B': |
|
1753 | - $commandline .= ' -gravity south'; |
|
1754 | - break; |
|
1755 | - case 'L': |
|
1756 | - $commandline .= ' -gravity west'; |
|
1757 | - break; |
|
1758 | - case 'R': |
|
1759 | - $commandline .= ' -gravity east'; |
|
1760 | - break; |
|
1761 | - case 'TL': |
|
1762 | - $commandline .= ' -gravity northwest'; |
|
1763 | - break; |
|
1764 | - case 'TR': |
|
1765 | - $commandline .= ' -gravity northeast'; |
|
1766 | - break; |
|
1767 | - case 'BL': |
|
1768 | - $commandline .= ' -gravity southwest'; |
|
1769 | - break; |
|
1770 | - case 'BR': |
|
1771 | - $commandline .= ' -gravity southeast'; |
|
1772 | - break; |
|
1773 | - case '1': |
|
1774 | - case 'C': |
|
1775 | - default: |
|
1776 | - $commandline .= ' -gravity center'; |
|
1777 | - break; |
|
1778 | - } |
|
1779 | - |
|
1780 | - if (($wAll > 0) && ($hAll > 0)) { |
|
1781 | - $commandline .= ' -crop '.phpthumb_functions::escapeshellarg_replacement($wAll.'x'.$hAll.'+0+0'); |
|
1782 | - } else { |
|
1783 | - $commandline .= ' -crop '.phpthumb_functions::escapeshellarg_replacement($side.'x'.$side.'+0+0'); |
|
1784 | - } |
|
1785 | - if ($this->ImageMagickSwitchAvailable('repage')) { |
|
1786 | - $commandline .= ' +repage'; |
|
1787 | - } else { |
|
1788 | - $this->DebugMessage('Skipping "+repage" because ImageMagick (v'.$this->ImageMagickVersion().') does not support it', __FILE__, __LINE__); |
|
1789 | - } |
|
1790 | - |
|
1791 | - } elseif ($this->sw || $this->sh || $this->sx || $this->sy) { |
|
1792 | - |
|
1793 | - $crop_param = ''; |
|
1794 | - $crop_param .= ($this->sw ? (($this->sw < 2) ? round($this->sw * $this->source_width) : $this->sw) : $this->source_width); |
|
1795 | - $crop_param .= 'x'.($this->sh ? (($this->sh < 2) ? round($this->sh * $this->source_height) : $this->sh) : $this->source_height); |
|
1796 | - $crop_param .= '+'.(($this->sx < 2) ? round($this->sx * $this->source_width) : $this->sx); |
|
1797 | - $crop_param .= '+'.(($this->sy < 2) ? round($this->sy * $this->source_height) : $this->sy); |
|
1656 | + $commandline = $this->ImageMagickCommandlineBase(); |
|
1657 | + if ($commandline) { |
|
1658 | + $commandline .= ' '.phpthumb_functions::escapeshellarg_replacement(preg_replace('#[/\\\\]#', DIRECTORY_SEPARATOR, $this->sourceFilename).(($outputFormat == 'gif') ? '' : '['. (int) $this->sfn .']')); // [0] means first frame of (GIF) animation, can be ignored |
|
1659 | + if ($IMtempfilename = $this->phpThumb_tempnam()) { |
|
1660 | + $IMtempfilename = $this->realPathSafe($IMtempfilename); |
|
1661 | + |
|
1662 | + $IMuseExplicitImageOutputDimensions = false; |
|
1663 | + if ($this->ImageMagickSwitchAvailable('thumbnail') && $this->config_imagemagick_use_thumbnail) { |
|
1664 | + $IMresizeParameter = 'thumbnail'; |
|
1665 | + } else { |
|
1666 | + $IMresizeParameter = 'resize'; |
|
1667 | + |
|
1668 | + // some (older? around 2002) versions of IM won't accept "-resize 100x" but require "-resize 100x100" |
|
1669 | + $commandline_test = $this->ImageMagickCommandlineBase().' logo: -resize 1x '.phpthumb_functions::escapeshellarg_replacement($IMtempfilename).' 2>&1'; |
|
1670 | + $IMresult_test = phpthumb_functions::SafeExec($commandline_test); |
|
1671 | + $IMuseExplicitImageOutputDimensions = preg_match('#image dimensions are zero#i', $IMresult_test); |
|
1672 | + $this->DebugMessage('IMuseExplicitImageOutputDimensions = '. (int) $IMuseExplicitImageOutputDimensions, __FILE__, __LINE__); |
|
1673 | + if ($fp_im_temp = @fopen($IMtempfilename, 'wb')) { |
|
1674 | + // erase temp image so ImageMagick logo doesn't get output if other processing fails |
|
1675 | + fclose($fp_im_temp); |
|
1676 | + @chmod($IMtempfilename, $this->getParameter('config_file_create_mask')); |
|
1677 | + } |
|
1678 | + } |
|
1679 | + |
|
1680 | + |
|
1681 | + ob_start(); |
|
1682 | + $getimagesize = getimagesize($this->sourceFilename); |
|
1683 | + $GetImageSizeError = ob_get_contents(); |
|
1684 | + ob_end_clean(); |
|
1685 | + if (is_array($getimagesize)) { |
|
1686 | + $this->DebugMessage('getimagesize('.$this->sourceFilename.') SUCCEEDED: '.print_r($getimagesize, true), __FILE__, __LINE__); |
|
1687 | + } else { |
|
1688 | + $this->DebugMessage('getimagesize('.$this->sourceFilename.') FAILED with error "'.$GetImageSizeError.'"', __FILE__, __LINE__); |
|
1689 | + } |
|
1690 | + if (null !== $this->dpi && $this->ImageMagickSwitchAvailable('density')) { |
|
1691 | + // for vector source formats only (WMF, PDF, etc) |
|
1692 | + if (is_array($getimagesize) && isset($getimagesize[2]) && ($getimagesize[2] == IMAGETYPE_PNG)) { |
|
1693 | + // explicitly exclude PNG from "-flatten" to make sure transparency is preserved |
|
1694 | + // https://github.com/JamesHeinrich/phpThumb/issues/65 |
|
1695 | + } else { |
|
1696 | + $commandline .= ' -flatten'; |
|
1697 | + $commandline .= ' -density '.phpthumb_functions::escapeshellarg_replacement($this->dpi); |
|
1698 | + } |
|
1699 | + } |
|
1700 | + if (is_array($getimagesize)) { |
|
1701 | + $this->DebugMessage('getimagesize('.$this->sourceFilename.') returned [w='.$getimagesize[0].';h='.$getimagesize[1].';f='.$getimagesize[2].']', __FILE__, __LINE__); |
|
1702 | + $this->source_width = $getimagesize[0]; |
|
1703 | + $this->source_height = $getimagesize[1]; |
|
1704 | + $this->DebugMessage('source dimensions set to '.$this->source_width.'x'.$this->source_height, __FILE__, __LINE__); |
|
1705 | + $this->SetOrientationDependantWidthHeight(); |
|
1706 | + |
|
1707 | + if (!preg_match('#('.implode('|', $this->AlphaCapableFormats).')#i', $outputFormat)) { |
|
1708 | + // not a transparency-capable format |
|
1709 | + $commandline .= ' -background '.phpthumb_functions::escapeshellarg_replacement('#'.($this->bg ? $this->bg : 'FFFFFF')); |
|
1710 | + if ($getimagesize[2] == IMAGETYPE_GIF) { |
|
1711 | + $commandline .= ' -flatten'; |
|
1712 | + } |
|
1713 | + } else { |
|
1714 | + if ($getimagesize[2] == IMAGETYPE_PNG && !$this->bg) { |
|
1715 | + $commandline .= ' -background none'; |
|
1716 | + } |
|
1717 | + } |
|
1718 | + if ($getimagesize[2] == IMAGETYPE_GIF) { |
|
1719 | + $commandline .= ' -coalesce'; // may be needed for animated GIFs |
|
1720 | + } |
|
1721 | + if ($this->source_width || $this->source_height) { |
|
1722 | + if ($this->zc) { |
|
1723 | + |
|
1724 | + $borderThickness = 0; |
|
1725 | + if (!empty($this->fltr)) { |
|
1726 | + foreach ($this->fltr as $key => $value) { |
|
1727 | + if (preg_match('#^bord\|([0-9]+)#', $value, $matches)) { |
|
1728 | + $borderThickness = $matches[1]; |
|
1729 | + break; |
|
1730 | + } |
|
1731 | + } |
|
1732 | + } |
|
1733 | + $wAll = (int) max($this->w, $this->wp, $this->wl, $this->ws) - (2 * $borderThickness); |
|
1734 | + $hAll = (int) max($this->h, $this->hp, $this->hl, $this->hs) - (2 * $borderThickness); |
|
1735 | + $imAR = $this->source_width / $this->source_height; |
|
1736 | + $zcAR = (($wAll && $hAll) ? $wAll / $hAll : 1); |
|
1737 | + $side = phpthumb_functions::nonempty_min($this->source_width, $this->source_height, max($wAll, $hAll)); |
|
1738 | + $sideX = phpthumb_functions::nonempty_min($this->source_width, $wAll, round($hAll * $zcAR)); |
|
1739 | + $sideY = phpthumb_functions::nonempty_min( $this->source_height, $hAll, round($wAll / $zcAR)); |
|
1740 | + |
|
1741 | + $thumbnailH = round(max($sideY, ($sideY * $zcAR) / $imAR)); |
|
1742 | + if ($this->aoe == 1) { |
|
1743 | + $commandline .= ' -'.$IMresizeParameter.' "'.$wAll.'x'.$hAll.'^"'; |
|
1744 | + } else { |
|
1745 | + $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement(($IMuseExplicitImageOutputDimensions ? $thumbnailH : '').'x'.$thumbnailH); |
|
1746 | + } |
|
1747 | + |
|
1748 | + switch (strtoupper($this->zc)) { |
|
1749 | + case 'T': |
|
1750 | + $commandline .= ' -gravity north'; |
|
1751 | + break; |
|
1752 | + case 'B': |
|
1753 | + $commandline .= ' -gravity south'; |
|
1754 | + break; |
|
1755 | + case 'L': |
|
1756 | + $commandline .= ' -gravity west'; |
|
1757 | + break; |
|
1758 | + case 'R': |
|
1759 | + $commandline .= ' -gravity east'; |
|
1760 | + break; |
|
1761 | + case 'TL': |
|
1762 | + $commandline .= ' -gravity northwest'; |
|
1763 | + break; |
|
1764 | + case 'TR': |
|
1765 | + $commandline .= ' -gravity northeast'; |
|
1766 | + break; |
|
1767 | + case 'BL': |
|
1768 | + $commandline .= ' -gravity southwest'; |
|
1769 | + break; |
|
1770 | + case 'BR': |
|
1771 | + $commandline .= ' -gravity southeast'; |
|
1772 | + break; |
|
1773 | + case '1': |
|
1774 | + case 'C': |
|
1775 | + default: |
|
1776 | + $commandline .= ' -gravity center'; |
|
1777 | + break; |
|
1778 | + } |
|
1779 | + |
|
1780 | + if (($wAll > 0) && ($hAll > 0)) { |
|
1781 | + $commandline .= ' -crop '.phpthumb_functions::escapeshellarg_replacement($wAll.'x'.$hAll.'+0+0'); |
|
1782 | + } else { |
|
1783 | + $commandline .= ' -crop '.phpthumb_functions::escapeshellarg_replacement($side.'x'.$side.'+0+0'); |
|
1784 | + } |
|
1785 | + if ($this->ImageMagickSwitchAvailable('repage')) { |
|
1786 | + $commandline .= ' +repage'; |
|
1787 | + } else { |
|
1788 | + $this->DebugMessage('Skipping "+repage" because ImageMagick (v'.$this->ImageMagickVersion().') does not support it', __FILE__, __LINE__); |
|
1789 | + } |
|
1790 | + |
|
1791 | + } elseif ($this->sw || $this->sh || $this->sx || $this->sy) { |
|
1792 | + |
|
1793 | + $crop_param = ''; |
|
1794 | + $crop_param .= ($this->sw ? (($this->sw < 2) ? round($this->sw * $this->source_width) : $this->sw) : $this->source_width); |
|
1795 | + $crop_param .= 'x'.($this->sh ? (($this->sh < 2) ? round($this->sh * $this->source_height) : $this->sh) : $this->source_height); |
|
1796 | + $crop_param .= '+'.(($this->sx < 2) ? round($this->sx * $this->source_width) : $this->sx); |
|
1797 | + $crop_param .= '+'.(($this->sy < 2) ? round($this->sy * $this->source_height) : $this->sy); |
|
1798 | 1798 | // TO BE FIXED |
1799 | 1799 | // makes 1x1 output |
1800 | 1800 | // http://trainspotted.com/phpThumb/phpThumb.php?src=/content/CNR/47/CNR-4728-LD-L-20110723-898.jpg&w=100&h=100&far=1&f=png&fltr[]=lvl&sx=0.05&sy=0.25&sw=0.92&sh=0.42 |
1801 | 1801 | // '/usr/bin/convert' -density 150 -thumbnail 100x100 -contrast-stretch '0.1%' '/var/www/vhosts/trainspotted.com/httpdocs/content/CNR/47/CNR-4728-LD-L-20110723-898.jpg[0]' png:'/var/www/vhosts/trainspotted.com/httpdocs/phpThumb/_cache/pThumbIIUlvj' |
1802 | - $commandline .= ' -crop '.phpthumb_functions::escapeshellarg_replacement($crop_param); |
|
1802 | + $commandline .= ' -crop '.phpthumb_functions::escapeshellarg_replacement($crop_param); |
|
1803 | 1803 | |
1804 | - // this is broken for aoe=1, but unsure how to fix. Send advice to [email protected] |
|
1805 | - if ($this->w || $this->h) { |
|
1806 | - //if ($this->ImageMagickSwitchAvailable('repage')) { |
|
1804 | + // this is broken for aoe=1, but unsure how to fix. Send advice to [email protected] |
|
1805 | + if ($this->w || $this->h) { |
|
1806 | + //if ($this->ImageMagickSwitchAvailable('repage')) { |
|
1807 | 1807 | if (false) { |
1808 | 1808 | // TO BE FIXED |
1809 | 1809 | // newer versions of ImageMagick require -repage <geometry> |
1810 | - $commandline .= ' -repage'; |
|
1811 | - } else { |
|
1812 | - $this->DebugMessage('Skipping "-repage" because ImageMagick (v'.$this->ImageMagickVersion().') does not support it', __FILE__, __LINE__); |
|
1813 | - } |
|
1814 | - if ($IMuseExplicitImageOutputDimensions) { |
|
1815 | - if ($this->w && !$this->h) { |
|
1816 | - $this->h = ceil($this->w / ($this->source_width / $this->source_height)); |
|
1817 | - } elseif ($this->h && !$this->w) { |
|
1818 | - $this->w = ceil($this->h * ($this->source_width / $this->source_height)); |
|
1819 | - } |
|
1820 | - } |
|
1821 | - $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement($this->w.'x'.$this->h); |
|
1822 | - } |
|
1823 | - |
|
1824 | - } else { |
|
1825 | - |
|
1826 | - if ($this->iar && ((int) $this->w > 0) && ((int) $this->h > 0)) { |
|
1827 | - |
|
1828 | - list($nw, $nh) = phpthumb_functions::TranslateWHbyAngle($this->w, $this->h, $this->ra); |
|
1829 | - $nw = ((round($nw) != 0) ? round($nw) : ''); |
|
1830 | - $nh = ((round($nh) != 0) ? round($nh) : ''); |
|
1831 | - $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement($nw.'x'.$nh.'!'); |
|
1832 | - |
|
1833 | - } elseif ($this->far && ((int) $this->w > 0) && ((int) $this->h > 0)) { |
|
1834 | - |
|
1835 | - $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement(phpthumb_functions::nonempty_min($this->w, $getimagesize[0]).'x'.phpthumb_functions::nonempty_min($this->h, $getimagesize[1])); |
|
1836 | - $commandline .= ' -gravity center'; |
|
1837 | - $commandline .= ' -background '.phpthumb_functions::escapeshellarg_replacement('#'.$this->bg); |
|
1838 | - $commandline .= ' -extent '.phpthumb_functions::escapeshellarg_replacement($this->w.'x'.$this->h); |
|
1839 | - |
|
1840 | - } else { |
|
1841 | - |
|
1842 | - $this->w = (($this->aoe && $this->w) ? $this->w : ($this->w ? phpthumb_functions::nonempty_min($this->w, $getimagesize[0]) : '')); |
|
1843 | - $this->h = (($this->aoe && $this->h) ? $this->h : ($this->h ? phpthumb_functions::nonempty_min($this->h, $getimagesize[1]) : '')); |
|
1844 | - if ($this->w || $this->h) { |
|
1845 | - if ($IMuseExplicitImageOutputDimensions) { |
|
1846 | - if ($this->w && !$this->h) { |
|
1847 | - $this->h = ceil($this->w / ($this->source_width / $this->source_height)); |
|
1848 | - } elseif ($this->h && !$this->w) { |
|
1849 | - $this->w = ceil($this->h * ($this->source_width / $this->source_height)); |
|
1850 | - } |
|
1851 | - } |
|
1852 | - list($nw, $nh) = phpthumb_functions::TranslateWHbyAngle($this->w, $this->h, $this->ra); |
|
1853 | - $nw = ((round($nw) != 0) ? round($nw) : ''); |
|
1854 | - $nh = ((round($nh) != 0) ? round($nh) : ''); |
|
1855 | - $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement($nw.'x'.$nh); |
|
1856 | - } |
|
1857 | - |
|
1858 | - } |
|
1859 | - } |
|
1860 | - } |
|
1861 | - |
|
1862 | - } else { |
|
1863 | - |
|
1864 | - $this->DebugMessage('getimagesize('.$this->sourceFilename.') failed', __FILE__, __LINE__); |
|
1865 | - if ($this->w || $this->h) { |
|
1866 | - $exactDimensionsBang = (($this->iar && ((int) $this->w > 0) && ((int) $this->h > 0)) ? '!' : ''); |
|
1867 | - if ($IMuseExplicitImageOutputDimensions) { |
|
1868 | - // unknown source aspect ratio, just put large number and hope IM figures it out |
|
1869 | - $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement(($this->w ? $this->w : '9999').'x'.($this->h ? $this->h : '9999').$exactDimensionsBang); |
|
1870 | - } else { |
|
1871 | - $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement($this->w.'x'.$this->h.$exactDimensionsBang); |
|
1872 | - } |
|
1873 | - } |
|
1874 | - |
|
1875 | - } |
|
1876 | - |
|
1877 | - if ($this->ra) { |
|
1878 | - $this->ra = (int) $this->ra; |
|
1879 | - if ($this->ImageMagickSwitchAvailable('rotate')) { |
|
1880 | - if (!preg_match('#('.implode('|', $this->AlphaCapableFormats).')#i', $outputFormat) || phpthumb_functions::version_compare_replacement($this->ImageMagickVersion(), '6.3.7', '>=')) { |
|
1881 | - $this->DebugMessage('Using ImageMagick rotate', __FILE__, __LINE__); |
|
1882 | - $commandline .= ' -rotate '.phpthumb_functions::escapeshellarg_replacement($this->ra); |
|
1883 | - if (($this->ra % 90) != 0) { |
|
1884 | - if (preg_match('#('.implode('|', $this->AlphaCapableFormats).')#i', $outputFormat)) { |
|
1885 | - // alpha-capable format |
|
1886 | - $commandline .= ' -background rgba(255,255,255,0)'; |
|
1887 | - } else { |
|
1888 | - $commandline .= ' -background '.phpthumb_functions::escapeshellarg_replacement('#'.($this->bg ? $this->bg : 'FFFFFF')); |
|
1889 | - } |
|
1890 | - } |
|
1891 | - $this->ra = 0; |
|
1892 | - } else { |
|
1893 | - $this->DebugMessage('Not using ImageMagick rotate because alpha background buggy before v6.3.7', __FILE__, __LINE__); |
|
1894 | - } |
|
1895 | - } else { |
|
1896 | - $this->DebugMessage('Not using ImageMagick rotate because not supported', __FILE__, __LINE__); |
|
1897 | - } |
|
1898 | - } |
|
1899 | - |
|
1900 | - $successfullyProcessedFilters = array(); |
|
1901 | - foreach ($this->fltr as $filterkey => $filtercommand) { |
|
1902 | - @list($command, $parameter) = explode('|', $filtercommand, 2); |
|
1903 | - switch ($command) { |
|
1904 | - case 'brit': |
|
1905 | - if ($this->ImageMagickSwitchAvailable('modulate')) { |
|
1906 | - $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement((100 + (int) $parameter).',100,100'); |
|
1907 | - $successfullyProcessedFilters[] = $filterkey; |
|
1908 | - } |
|
1909 | - break; |
|
1910 | - |
|
1911 | - case 'cont': |
|
1912 | - if ($this->ImageMagickSwitchAvailable('contrast')) { |
|
1913 | - $contDiv10 = round((int) $parameter / 10); |
|
1914 | - if ($contDiv10 > 0) { |
|
1915 | - $contDiv10 = min($contDiv10, 100); |
|
1916 | - for ($i = 0; $i < $contDiv10; $i++) { |
|
1917 | - $commandline .= ' -contrast'; // increase contrast by 10% |
|
1918 | - } |
|
1919 | - } elseif ($contDiv10 < 0) { |
|
1920 | - $contDiv10 = max($contDiv10, -100); |
|
1921 | - for ($i = $contDiv10; $i < 0; $i++) { |
|
1922 | - $commandline .= ' +contrast'; // decrease contrast by 10% |
|
1923 | - } |
|
1924 | - } else { |
|
1925 | - // do nothing |
|
1926 | - } |
|
1927 | - $successfullyProcessedFilters[] = $filterkey; |
|
1928 | - } |
|
1929 | - break; |
|
1930 | - |
|
1931 | - case 'ds': |
|
1932 | - if ($this->ImageMagickSwitchAvailable(array('colorspace', 'modulate'))) { |
|
1933 | - if ($parameter == 100) { |
|
1934 | - $commandline .= ' -colorspace GRAY'; |
|
1935 | - $commandline .= ' -modulate 100,0,100'; |
|
1936 | - } else { |
|
1937 | - $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement('100,'.(100 - (int) $parameter).',100'); |
|
1938 | - } |
|
1939 | - $successfullyProcessedFilters[] = $filterkey; |
|
1940 | - } |
|
1941 | - break; |
|
1942 | - |
|
1943 | - case 'sat': |
|
1944 | - if ($this->ImageMagickSwitchAvailable(array('colorspace', 'modulate'))) { |
|
1945 | - if ($parameter == -100) { |
|
1946 | - $commandline .= ' -colorspace GRAY'; |
|
1947 | - $commandline .= ' -modulate 100,0,100'; |
|
1948 | - } else { |
|
1949 | - $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement('100,'.(100 + (int) $parameter).',100'); |
|
1950 | - } |
|
1951 | - $successfullyProcessedFilters[] = $filterkey; |
|
1952 | - } |
|
1953 | - break; |
|
1954 | - |
|
1955 | - case 'gray': |
|
1956 | - if ($this->ImageMagickSwitchAvailable(array('colorspace', 'modulate'))) { |
|
1957 | - $commandline .= ' -colorspace GRAY'; |
|
1958 | - $commandline .= ' -modulate 100,0,100'; |
|
1959 | - $successfullyProcessedFilters[] = $filterkey; |
|
1960 | - } |
|
1961 | - break; |
|
1962 | - |
|
1963 | - case 'clr': |
|
1964 | - if ($this->ImageMagickSwitchAvailable(array('fill', 'colorize'))) { |
|
1965 | - @list($amount, $color) = explode('|', $parameter); |
|
1966 | - $commandline .= ' -fill '.phpthumb_functions::escapeshellarg_replacement('#'.preg_replace('#[^0-9A-F]#i', '', $color)); |
|
1967 | - $commandline .= ' -colorize '.phpthumb_functions::escapeshellarg_replacement(min(max((int) $amount, 0), 100)); |
|
1968 | - } |
|
1969 | - break; |
|
1970 | - |
|
1971 | - case 'sep': |
|
1972 | - if ($this->ImageMagickSwitchAvailable('sepia-tone')) { |
|
1973 | - @list($amount, $color) = explode('|', $parameter); |
|
1974 | - $amount = ($amount ? $amount : 80); |
|
1975 | - if (!$color) { |
|
1976 | - $commandline .= ' -sepia-tone '.phpthumb_functions::escapeshellarg_replacement(min(max((int) $amount, 0), 100).'%'); |
|
1977 | - $successfullyProcessedFilters[] = $filterkey; |
|
1978 | - } |
|
1979 | - } |
|
1980 | - break; |
|
1981 | - |
|
1982 | - case 'gam': |
|
1983 | - @list($amount) = explode('|', $parameter); |
|
1984 | - $amount = min(max((float) $amount, 0.001), 10); |
|
1985 | - if (number_format($amount, 3) != '1.000') { |
|
1986 | - if ($this->ImageMagickSwitchAvailable('gamma')) { |
|
1987 | - $commandline .= ' -gamma '.phpthumb_functions::escapeshellarg_replacement($amount); |
|
1988 | - $successfullyProcessedFilters[] = $filterkey; |
|
1989 | - } |
|
1990 | - } |
|
1991 | - break; |
|
1992 | - |
|
1993 | - case 'neg': |
|
1994 | - if ($this->ImageMagickSwitchAvailable('negate')) { |
|
1995 | - $commandline .= ' -negate'; |
|
1996 | - $successfullyProcessedFilters[] = $filterkey; |
|
1997 | - } |
|
1998 | - break; |
|
1999 | - |
|
2000 | - case 'th': |
|
2001 | - @list($amount) = explode('|', $parameter); |
|
2002 | - if ($this->ImageMagickSwitchAvailable(array('threshold', 'dither', 'monochrome'))) { |
|
2003 | - $commandline .= ' -threshold '.phpthumb_functions::escapeshellarg_replacement(round(min(max((int) $amount, 0), 255) / 2.55).'%'); |
|
2004 | - $commandline .= ' -dither'; |
|
2005 | - $commandline .= ' -monochrome'; |
|
2006 | - $successfullyProcessedFilters[] = $filterkey; |
|
2007 | - } |
|
2008 | - break; |
|
2009 | - |
|
2010 | - case 'rcd': |
|
2011 | - if ($this->ImageMagickSwitchAvailable(array('colors', 'dither'))) { |
|
2012 | - @list($colors, $dither) = explode('|', $parameter); |
|
2013 | - $colors = ($colors ? (int) $colors : 256); |
|
2014 | - $dither = ((strlen($dither) > 0) ? (bool) $dither : true); |
|
2015 | - $commandline .= ' -colors '.phpthumb_functions::escapeshellarg_replacement(max($colors, 8)); // ImageMagick will otherwise fail with "cannot quantize to fewer than 8 colors" |
|
2016 | - $commandline .= ($dither ? ' -dither' : ' +dither'); |
|
2017 | - $successfullyProcessedFilters[] = $filterkey; |
|
2018 | - } |
|
2019 | - break; |
|
2020 | - |
|
2021 | - case 'flip': |
|
2022 | - if ($this->ImageMagickSwitchAvailable(array('flip', 'flop'))) { |
|
2023 | - if (strpos(strtolower($parameter), 'x') !== false) { |
|
2024 | - $commandline .= ' -flop'; |
|
2025 | - } |
|
2026 | - if (strpos(strtolower($parameter), 'y') !== false) { |
|
2027 | - $commandline .= ' -flip'; |
|
2028 | - } |
|
2029 | - $successfullyProcessedFilters[] = $filterkey; |
|
2030 | - } |
|
2031 | - break; |
|
2032 | - |
|
2033 | - case 'edge': |
|
2034 | - if ($this->ImageMagickSwitchAvailable('edge')) { |
|
2035 | - $parameter = (!empty($parameter) ? $parameter : 2); |
|
2036 | - $commandline .= ' -edge '.phpthumb_functions::escapeshellarg_replacement(!empty($parameter) ? (int) $parameter : 1); |
|
2037 | - $successfullyProcessedFilters[] = $filterkey; |
|
2038 | - } |
|
2039 | - break; |
|
2040 | - |
|
2041 | - case 'emb': |
|
2042 | - if ($this->ImageMagickSwitchAvailable(array('emboss', 'negate'))) { |
|
2043 | - $parameter = (!empty($parameter) ? $parameter : 2); |
|
2044 | - $commandline .= ' -emboss '.phpthumb_functions::escapeshellarg_replacement((int) $parameter); |
|
2045 | - if ($parameter < 2) { |
|
2046 | - $commandline .= ' -negate'; // ImageMagick negates the image for some reason with '-emboss 1'; |
|
2047 | - } |
|
2048 | - $successfullyProcessedFilters[] = $filterkey; |
|
2049 | - } |
|
2050 | - break; |
|
2051 | - |
|
2052 | - case 'lvl': |
|
2053 | - @list($band, $method, $threshold) = explode('|', $parameter); |
|
2054 | - $band = ($band ? preg_replace('#[^RGBA\\*]#', '', strtoupper($band)) : '*'); |
|
2055 | - $method = ((strlen($method) > 0) ? (int) $method : 2); |
|
2056 | - $threshold = ((strlen($threshold) > 0) ? min(max((float) $threshold, 0), 100) : 0.1); |
|
2057 | - |
|
2058 | - $band = preg_replace('#[^RGBA\\*]#', '', strtoupper($band)); |
|
2059 | - |
|
2060 | - if (($method > 1) && !$this->ImageMagickSwitchAvailable(array('channel', 'contrast-stretch'))) { |
|
2061 | - // Because ImageMagick processing happens before PHP-GD filters, and because some |
|
2062 | - // clipping is involved in the "lvl" filter, if "lvl" happens before "wb" then the |
|
2063 | - // "wb" filter will have (almost) no effect. Therefore, if "wb" is enabled then |
|
2064 | - // force the "lvl" filter to be processed by GD, not ImageMagick. |
|
2065 | - foreach ($this->fltr as $fltr_key => $fltr_value) { |
|
2066 | - list($fltr_cmd) = explode('|', $fltr_value); |
|
2067 | - if ($fltr_cmd == 'wb') { |
|
2068 | - $this->DebugMessage('Setting "lvl" filter method to "0" (from "'.$method.'") because white-balance filter also enabled', __FILE__, __LINE__); |
|
2069 | - $method = 0; |
|
2070 | - } |
|
2071 | - } |
|
2072 | - } |
|
2073 | - |
|
2074 | - switch ($method) { |
|
2075 | - case 0: // internal RGB |
|
2076 | - case 1: // internal grayscale |
|
2077 | - break; |
|
2078 | - case 2: // ImageMagick "contrast-stretch" |
|
2079 | - if ($this->ImageMagickSwitchAvailable('contrast-stretch')) { |
|
2080 | - if ($band != '*') { |
|
2081 | - $commandline .= ' -channel '.phpthumb_functions::escapeshellarg_replacement(strtoupper($band)); |
|
2082 | - } |
|
2083 | - $threshold = preg_replace('#[^0-9\\.]#', '', $threshold); // should be unneccesary, but just to be double-sure |
|
2084 | - //$commandline .= ' -contrast-stretch '.phpthumb_functions::escapeshellarg_replacement($threshold.'%'); |
|
2085 | - $commandline .= ' -contrast-stretch \''.$threshold.'%\''; |
|
2086 | - if ($band != '*') { |
|
2087 | - $commandline .= ' +channel'; |
|
2088 | - } |
|
2089 | - $successfullyProcessedFilters[] = $filterkey; |
|
2090 | - } |
|
2091 | - break; |
|
2092 | - case 3: // ImageMagick "normalize" |
|
2093 | - if ($this->ImageMagickSwitchAvailable('normalize')) { |
|
2094 | - if ($band != '*') { |
|
2095 | - $commandline .= ' -channel '.phpthumb_functions::escapeshellarg_replacement(strtoupper($band)); |
|
2096 | - } |
|
2097 | - $commandline .= ' -normalize'; |
|
2098 | - if ($band != '*') { |
|
2099 | - $commandline .= ' +channel'; |
|
2100 | - } |
|
2101 | - $successfullyProcessedFilters[] = $filterkey; |
|
2102 | - } |
|
2103 | - break; |
|
2104 | - default: |
|
2105 | - $this->DebugMessage('unsupported method ('.$method.') for "lvl" filter', __FILE__, __LINE__); |
|
2106 | - break; |
|
2107 | - } |
|
2108 | - if (isset($this->fltr[$filterkey]) && ($method > 1)) { |
|
2109 | - $this->fltr[$filterkey] = $command.'|'.$band.'|0|'.$threshold; |
|
2110 | - $this->DebugMessage('filter "lvl" remapped from method "'.$method.'" to method "0" because ImageMagick support is missing', __FILE__, __LINE__); |
|
2111 | - } |
|
2112 | - break; |
|
2113 | - |
|
2114 | - case 'wb': |
|
2115 | - if ($this->ImageMagickSwitchAvailable(array('channel', 'contrast-stretch'))) { |
|
2116 | - @list($threshold) = explode('|', $parameter); |
|
2117 | - $threshold = (!empty($threshold) ? min(max((float) $threshold, 0), 100) : 0.1); |
|
2118 | - $threshold = preg_replace('#[^0-9\\.]#', '', $threshold); // should be unneccesary, but just to be double-sure |
|
2119 | - //$commandline .= ' -channel R -contrast-stretch '.phpthumb_functions::escapeshellarg_replacement($threshold.'%'); // doesn't work on Windows because most versions of PHP do not properly |
|
2120 | - //$commandline .= ' -channel G -contrast-stretch '.phpthumb_functions::escapeshellarg_replacement($threshold.'%'); // escape special characters (such as %) and just replace them with spaces |
|
2121 | - //$commandline .= ' -channel B -contrast-stretch '.phpthumb_functions::escapeshellarg_replacement($threshold.'%'); // https://bugs.php.net/bug.php?id=43261 |
|
2122 | - $commandline .= ' -channel R -contrast-stretch \''.$threshold.'%\''; |
|
2123 | - $commandline .= ' -channel G -contrast-stretch \''.$threshold.'%\''; |
|
2124 | - $commandline .= ' -channel B -contrast-stretch \''.$threshold.'%\''; |
|
2125 | - $commandline .= ' +channel'; |
|
2126 | - $successfullyProcessedFilters[] = $filterkey; |
|
2127 | - } |
|
2128 | - break; |
|
2129 | - |
|
2130 | - case 'blur': |
|
2131 | - if ($this->ImageMagickSwitchAvailable('blur')) { |
|
2132 | - @list($radius) = explode('|', $parameter); |
|
2133 | - $radius = (!empty($radius) ? min(max((int) $radius, 0), 25) : 1); |
|
2134 | - $commandline .= ' -blur '.phpthumb_functions::escapeshellarg_replacement($radius); |
|
2135 | - $successfullyProcessedFilters[] = $filterkey; |
|
2136 | - } |
|
2137 | - break; |
|
2138 | - |
|
2139 | - case 'gblr': |
|
2140 | - @list($radius) = explode('|', $parameter); |
|
2141 | - $radius = (!empty($radius) ? min(max((int) $radius, 0), 25) : 1); |
|
2142 | - // "-gaussian" changed to "-gaussian-blur" sometime around 2009 |
|
2143 | - if ($this->ImageMagickSwitchAvailable('gaussian-blur')) { |
|
2144 | - $commandline .= ' -gaussian-blur '.phpthumb_functions::escapeshellarg_replacement($radius); |
|
2145 | - $successfullyProcessedFilters[] = $filterkey; |
|
2146 | - } elseif ($this->ImageMagickSwitchAvailable('gaussian')) { |
|
2147 | - $commandline .= ' -gaussian '.phpthumb_functions::escapeshellarg_replacement($radius); |
|
2148 | - $successfullyProcessedFilters[] = $filterkey; |
|
2149 | - } |
|
2150 | - break; |
|
2151 | - |
|
2152 | - case 'usm': |
|
2153 | - if ($this->ImageMagickSwitchAvailable('unsharp')) { |
|
2154 | - @list($amount, $radius, $threshold) = explode('|', $parameter); |
|
2155 | - $amount = ($amount ? min(max((int) $amount, 0), 255) : 80); |
|
2156 | - $radius = ($radius ? min(max((int) $radius, 0), 10) : 0.5); |
|
2157 | - $threshold = (strlen($threshold) ? min(max((int) $threshold, 0), 50) : 3); |
|
2158 | - $commandline .= ' -unsharp '.phpthumb_functions::escapeshellarg_replacement(number_format(($radius * 2) - 1, 2, '.', '').'x1+'.number_format($amount / 100, 2, '.', '').'+'.number_format($threshold / 100, 2, '.', '')); |
|
2159 | - $successfullyProcessedFilters[] = $filterkey; |
|
2160 | - } |
|
2161 | - break; |
|
2162 | - |
|
2163 | - case 'bord': |
|
2164 | - if ($this->ImageMagickSwitchAvailable(array('border', 'bordercolor', 'thumbnail', 'crop'))) { |
|
2165 | - if (!$this->zc) { |
|
2166 | - @list($width, $rX, $rY, $color) = explode('|', $parameter); |
|
2167 | - $width = (int) $width; |
|
2168 | - $rX = (int) $rX; |
|
2169 | - $rY = (int) $rY; |
|
2170 | - if ($width && !$rX && !$rY) { |
|
2171 | - if (!phpthumb_functions::IsHexColor($color)) { |
|
2172 | - $color = ((!empty($this->bc) && phpthumb_functions::IsHexColor($this->bc)) ? $this->bc : '000000'); |
|
2173 | - } |
|
2174 | - $commandline .= ' -border '.phpthumb_functions::escapeshellarg_replacement((int) $width); |
|
2175 | - $commandline .= ' -bordercolor '.phpthumb_functions::escapeshellarg_replacement('#'.$color); |
|
2176 | - |
|
2177 | - if (preg_match('# \\-crop "([0-9]+)x([0-9]+)\\+0\\+0" #', $commandline, $matches)) { |
|
2178 | - $commandline = str_replace(' -crop "'.$matches[1].'x'.$matches[2].'+0+0" ', ' -crop '.phpthumb_functions::escapeshellarg_replacement(($matches[1] - (2 * $width)).'x'.($matches[2] - (2 * $width)).'+0+0').' ', $commandline); |
|
2179 | - } elseif (preg_match('# \\-'.$IMresizeParameter.' "([0-9]+)x([0-9]+)" #', $commandline, $matches)) { |
|
2180 | - $commandline = str_replace(' -'.$IMresizeParameter.' "'.$matches[1].'x'.$matches[2].'" ', ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement(($matches[1] - (2 * $width)).'x'.($matches[2] - (2 * $width))).' ', $commandline); |
|
2181 | - } |
|
2182 | - $successfullyProcessedFilters[] = $filterkey; |
|
2183 | - } |
|
2184 | - } |
|
2185 | - } |
|
2186 | - break; |
|
2187 | - |
|
2188 | - case 'crop': |
|
2189 | - break; |
|
2190 | - |
|
2191 | - case 'sblr': |
|
2192 | - break; |
|
2193 | - |
|
2194 | - case 'mean': |
|
2195 | - break; |
|
2196 | - |
|
2197 | - case 'smth': |
|
2198 | - break; |
|
2199 | - |
|
2200 | - case 'bvl': |
|
2201 | - break; |
|
2202 | - |
|
2203 | - case 'wmi': |
|
2204 | - break; |
|
2205 | - |
|
2206 | - case 'wmt': |
|
2207 | - break; |
|
2208 | - |
|
2209 | - case 'over': |
|
2210 | - break; |
|
2211 | - |
|
2212 | - case 'hist': |
|
2213 | - break; |
|
2214 | - |
|
2215 | - case 'fram': |
|
2216 | - break; |
|
2217 | - |
|
2218 | - case 'drop': |
|
2219 | - break; |
|
2220 | - |
|
2221 | - case 'mask': |
|
2222 | - break; |
|
2223 | - |
|
2224 | - case 'elip': |
|
2225 | - break; |
|
2226 | - |
|
2227 | - case 'ric': |
|
2228 | - break; |
|
2229 | - |
|
2230 | - case 'stc': |
|
2231 | - break; |
|
2232 | - |
|
2233 | - case 'size': |
|
2234 | - break; |
|
2235 | - |
|
2236 | - default: |
|
2237 | - $this->DebugMessage('Unknown $this->fltr['.$filterkey.'] ('.$filtercommand.') -- deleting filter command', __FILE__, __LINE__); |
|
2238 | - $successfullyProcessedFilters[] = $filterkey; |
|
2239 | - break; |
|
2240 | - } |
|
2241 | - if (!isset($this->fltr[$filterkey])) { |
|
2242 | - $this->DebugMessage('Processed $this->fltr['.$filterkey.'] ('.$filtercommand.') with ImageMagick', __FILE__, __LINE__); |
|
2243 | - } else { |
|
2244 | - $this->DebugMessage('Skipping $this->fltr['.$filterkey.'] ('.$filtercommand.') with ImageMagick', __FILE__, __LINE__); |
|
2245 | - } |
|
2246 | - } |
|
2247 | - $this->DebugMessage('Remaining $this->fltr after ImageMagick: ('.$this->phpThumbDebugVarDump($this->fltr).')', __FILE__, __LINE__); |
|
2248 | - if (count($this->fltr) > 0) { |
|
2249 | - $this->useRawIMoutput = false; |
|
2250 | - } |
|
2251 | - |
|
2252 | - if (preg_match('#jpe?g#i', $outputFormat) && $this->q) { |
|
2253 | - if ($this->ImageMagickSwitchAvailable(array('quality', 'interlace'))) { |
|
2254 | - $commandline .= ' -quality '.phpthumb_functions::escapeshellarg_replacement($this->thumbnailQuality); |
|
2255 | - if ($this->config_output_interlace) { |
|
2256 | - // causes weird things with animated GIF... leave for JPEG only |
|
2257 | - $commandline .= ' -interlace line '; // Use Line or Plane to create an interlaced PNG or GIF or progressive JPEG image |
|
2258 | - } |
|
2259 | - } |
|
2260 | - } |
|
2261 | - $commandline .= ' '.$outputFormat.':'.phpthumb_functions::escapeshellarg_replacement($IMtempfilename); |
|
2262 | - if (!$this->iswindows) { |
|
2263 | - $commandline .= ' 2>&1'; |
|
2264 | - } |
|
2265 | - $this->DebugMessage('ImageMagick called as ('.$commandline.')', __FILE__, __LINE__); |
|
2266 | - $IMresult = phpthumb_functions::SafeExec($commandline); |
|
2267 | - clearstatcache(); |
|
2268 | - if (!@file_exists($IMtempfilename) || !@filesize($IMtempfilename)) { |
|
2269 | - $this->FatalError('ImageMagick failed with message ('.trim($IMresult).')'); |
|
2270 | - $this->DebugMessage('ImageMagick failed with message ('.trim($IMresult).')', __FILE__, __LINE__); |
|
2271 | - if ($this->iswindows && !$IMresult) { |
|
2272 | - $this->DebugMessage('Check to make sure that PHP has read+write permissions to "'.dirname($IMtempfilename).'"', __FILE__, __LINE__); |
|
2273 | - } |
|
2274 | - |
|
2275 | - } else { |
|
2276 | - |
|
2277 | - foreach ($successfullyProcessedFilters as $dummy => $filterkey) { |
|
2278 | - unset($this->fltr[$filterkey]); |
|
2279 | - } |
|
2280 | - $this->IMresizedData = file_get_contents($IMtempfilename); |
|
2281 | - $getimagesize_imresized = @getimagesize($IMtempfilename); |
|
2282 | - $this->DebugMessage('getimagesize('.$IMtempfilename.') returned [w='.$getimagesize_imresized[0].';h='.$getimagesize_imresized[1].';f='.$getimagesize_imresized[2].']', __FILE__, __LINE__); |
|
2283 | - if (($this->config_max_source_pixels > 0) && (($getimagesize_imresized[0] * $getimagesize_imresized[1]) > $this->config_max_source_pixels)) { |
|
2284 | - $this->DebugMessage('skipping ImageMagickThumbnailToGD::'.$ImageCreateFunction.'() because IM output is too large ('.$getimagesize_imresized[0].'x'.$getimagesize_imresized[0].' = '.($getimagesize_imresized[0] * $getimagesize_imresized[1]).' > '.$this->config_max_source_pixels.')', __FILE__, __LINE__); |
|
2285 | - } elseif (function_exists(@$ImageCreateFunction) && ($this->gdimg_source = @$ImageCreateFunction($IMtempfilename))) { |
|
2286 | - $this->source_width = imagesx($this->gdimg_source); |
|
2287 | - $this->source_height = imagesy($this->gdimg_source); |
|
2288 | - $this->DebugMessage('ImageMagickThumbnailToGD::'.$ImageCreateFunction.'() succeeded, $this->gdimg_source is now ('.$this->source_width.'x'.$this->source_height.')', __FILE__, __LINE__); |
|
2289 | - $this->DebugMessage('ImageMagickThumbnailToGD() returning $this->IMresizedData ('.strlen($this->IMresizedData).' bytes)', __FILE__, __LINE__); |
|
2290 | - } else { |
|
2291 | - $this->useRawIMoutput = true; |
|
2292 | - $this->DebugMessage('$this->useRawIMoutput set to TRUE because '.@$ImageCreateFunction.'('.$IMtempfilename.') failed', __FILE__, __LINE__); |
|
2293 | - } |
|
2294 | - if (file_exists($IMtempfilename)) { |
|
2295 | - $this->DebugMessage('deleting "'.$IMtempfilename.'"', __FILE__, __LINE__); |
|
2296 | - @unlink($IMtempfilename); |
|
2297 | - } |
|
2298 | - return true; |
|
2299 | - |
|
2300 | - } |
|
2301 | - if (file_exists($IMtempfilename)) { |
|
2302 | - $this->DebugMessage('deleting "'.$IMtempfilename.'"', __FILE__, __LINE__); |
|
2303 | - @unlink($IMtempfilename); |
|
2304 | - } |
|
2305 | - |
|
2306 | - } elseif ($this->issafemode) { |
|
2307 | - $this->DebugMessage('ImageMagickThumbnailToGD() aborting because PHP safe_mode is enabled and phpThumb_tempnam() failed', __FILE__, __LINE__); |
|
2308 | - $this->useRawIMoutput = false; |
|
2309 | - } else { |
|
2310 | - if (file_exists($IMtempfilename)) { |
|
2311 | - $this->DebugMessage('deleting "'.$IMtempfilename.'"', __FILE__, __LINE__); |
|
2312 | - @unlink($IMtempfilename); |
|
2313 | - } |
|
2314 | - $this->DebugMessage('ImageMagickThumbnailToGD() aborting, phpThumb_tempnam() failed', __FILE__, __LINE__); |
|
2315 | - } |
|
2316 | - } else { |
|
2317 | - $this->DebugMessage('ImageMagickThumbnailToGD() aborting because ImageMagickCommandlineBase() failed', __FILE__, __LINE__); |
|
2318 | - } |
|
2319 | - $this->useRawIMoutput = false; |
|
2320 | - return false; |
|
2321 | - } |
|
2322 | - |
|
2323 | - |
|
2324 | - public function Rotate() { |
|
2325 | - if ($this->ra || $this->ar) { |
|
2326 | - if (!function_exists('imagerotate')) { |
|
2327 | - $this->DebugMessage('!function_exists(imagerotate)', __FILE__, __LINE__); |
|
2328 | - return false; |
|
2329 | - } |
|
2330 | - if (!include_once( __DIR__ .'/phpthumb.filters.php')) { |
|
2331 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.filters.php" which is required for applying filters ('.implode(';', $this->fltr).')', __FILE__, __LINE__); |
|
2332 | - return false; |
|
2333 | - } |
|
2334 | - |
|
2335 | - $this->config_background_hexcolor = ($this->bg ? $this->bg : $this->config_background_hexcolor); |
|
2336 | - if (!phpthumb_functions::IsHexColor($this->config_background_hexcolor)) { |
|
2337 | - return $this->ErrorImage('Invalid hex color string "'.$this->config_background_hexcolor.'" for parameter "bg"'); |
|
2338 | - } |
|
2339 | - |
|
2340 | - $rotate_angle = 0; |
|
2341 | - if ($this->ra) { |
|
2342 | - |
|
2343 | - $rotate_angle = (float) $this->ra; |
|
2344 | - |
|
2345 | - } else { |
|
2346 | - |
|
2347 | - if ($this->ar == 'x') { |
|
2348 | - if (phpthumb_functions::version_compare_replacement(PHP_VERSION, '4.2.0', '>=')) { |
|
2349 | - if ($this->sourceFilename) { |
|
2350 | - if (function_exists('exif_read_data')) { |
|
2351 | - if ($exif_data = @exif_read_data($this->sourceFilename, 'IFD0')) { |
|
2352 | - // http://sylvana.net/jpegcrop/exif_orientation.html |
|
2353 | - switch (@$exif_data['Orientation']) { |
|
2354 | - case 1: |
|
2355 | - $rotate_angle = 0; |
|
2356 | - break; |
|
2357 | - case 3: |
|
2358 | - $rotate_angle = 180; |
|
2359 | - break; |
|
2360 | - case 6: |
|
2361 | - $rotate_angle = 270; |
|
2362 | - break; |
|
2363 | - case 8: |
|
2364 | - $rotate_angle = 90; |
|
2365 | - break; |
|
2366 | - |
|
2367 | - default: |
|
2368 | - $this->DebugMessage('EXIF auto-rotate failed because unknown $exif_data[Orientation] "'.@$exif_data['Orientation'].'"', __FILE__, __LINE__); |
|
2369 | - return false; |
|
2370 | - break; |
|
2371 | - } |
|
2372 | - $this->DebugMessage('EXIF auto-rotate set to '.$rotate_angle.' degrees ($exif_data[Orientation] = "'.@$exif_data['Orientation'].'")', __FILE__, __LINE__); |
|
2373 | - } else { |
|
2374 | - $this->DebugMessage('failed: exif_read_data('.$this->sourceFilename.')', __FILE__, __LINE__); |
|
2375 | - return false; |
|
2376 | - } |
|
2377 | - } else { |
|
2378 | - $this->DebugMessage('!function_exists(exif_read_data)', __FILE__, __LINE__); |
|
2379 | - return false; |
|
2380 | - } |
|
2381 | - } else { |
|
2382 | - $this->DebugMessage('Cannot auto-rotate from EXIF data because $this->sourceFilename is empty', __FILE__, __LINE__); |
|
2383 | - return false; |
|
2384 | - } |
|
2385 | - } else { |
|
2386 | - $this->DebugMessage('Cannot auto-rotate from EXIF data because PHP is less than v4.2.0 ('. PHP_VERSION .')', __FILE__, __LINE__); |
|
2387 | - return false; |
|
2388 | - } |
|
2389 | - } elseif (($this->ar == 'l') && ($this->source_height > $this->source_width)) { |
|
2390 | - $rotate_angle = 270; |
|
2391 | - } elseif (($this->ar == 'L') && ($this->source_height > $this->source_width)) { |
|
2392 | - $rotate_angle = 90; |
|
2393 | - } elseif (($this->ar == 'p') && ($this->source_width > $this->source_height)) { |
|
2394 | - $rotate_angle = 90; |
|
2395 | - } elseif (($this->ar == 'P') && ($this->source_width > $this->source_height)) { |
|
2396 | - $rotate_angle = 270; |
|
2397 | - } |
|
2398 | - |
|
2399 | - } |
|
2400 | - if ($rotate_angle % 90) { |
|
2401 | - $this->is_alpha = true; |
|
2402 | - } |
|
2403 | - phpthumb_filters::ImprovedImageRotate($this->gdimg_source, $rotate_angle, $this->config_background_hexcolor, $this->bg, $this); |
|
2404 | - $this->source_width = imagesx($this->gdimg_source); |
|
2405 | - $this->source_height = imagesy($this->gdimg_source); |
|
2406 | - } |
|
2407 | - return true; |
|
2408 | - } |
|
2409 | - |
|
2410 | - |
|
2411 | - public function FixedAspectRatio() { |
|
2412 | - // optional fixed-dimension images (regardless of aspect ratio) |
|
2413 | - |
|
2414 | - if (!$this->far) { |
|
2415 | - // do nothing |
|
2416 | - return true; |
|
2417 | - } |
|
2418 | - |
|
2419 | - if (!$this->w || !$this->h) { |
|
2420 | - return false; |
|
2421 | - } |
|
2422 | - $this->thumbnail_width = $this->w; |
|
2423 | - $this->thumbnail_height = $this->h; |
|
2424 | - $this->is_alpha = true; |
|
2425 | - if ($this->thumbnail_image_width >= $this->thumbnail_width) { |
|
2426 | - |
|
2427 | - $aspectratio = $this->thumbnail_image_height / $this->thumbnail_image_width; |
|
2428 | - if ($this->w) { |
|
2429 | - $this->thumbnail_image_height = round($this->thumbnail_image_width * $aspectratio); |
|
2430 | - $this->thumbnail_height = ($this->h ? $this->h : $this->thumbnail_image_height); |
|
2431 | - } elseif ($this->thumbnail_image_height < $this->thumbnail_height) { |
|
2432 | - $this->thumbnail_image_height = $this->thumbnail_height; |
|
2433 | - $this->thumbnail_image_width = round($this->thumbnail_image_height / $aspectratio); |
|
2434 | - } |
|
2435 | - |
|
2436 | - } else { |
|
2437 | - |
|
2438 | - $aspectratio = $this->thumbnail_image_width / $this->thumbnail_image_height; |
|
2439 | - if ($this->h) { |
|
2440 | - $this->thumbnail_image_width = round($this->thumbnail_image_height * $aspectratio); |
|
2441 | - } elseif ($this->thumbnail_image_width < $this->thumbnail_width) { |
|
2442 | - $this->thumbnail_image_width = $this->thumbnail_width; |
|
2443 | - $this->thumbnail_image_height = round($this->thumbnail_image_width / $aspectratio); |
|
2444 | - } |
|
2445 | - |
|
2446 | - } |
|
2447 | - return true; |
|
2448 | - } |
|
2449 | - |
|
2450 | - |
|
2451 | - public function OffsiteDomainIsAllowed($hostname, $allowed_domains) { |
|
2452 | - static $domain_is_allowed = array(); |
|
2453 | - $hostname = strtolower($hostname); |
|
2454 | - if (!isset($domain_is_allowed[$hostname])) { |
|
2455 | - $domain_is_allowed[$hostname] = false; |
|
2456 | - foreach ($allowed_domains as $valid_domain) { |
|
2457 | - $starpos = strpos($valid_domain, '*'); |
|
2458 | - if ($starpos !== false) { |
|
2459 | - $valid_domain = substr($valid_domain, $starpos + 1); |
|
2460 | - if (preg_match('#'.preg_quote($valid_domain).'$#', $hostname)) { |
|
2461 | - $domain_is_allowed[$hostname] = true; |
|
2462 | - break; |
|
2463 | - } |
|
2464 | - } else { |
|
2465 | - if (strtolower($valid_domain) === $hostname) { |
|
2466 | - $domain_is_allowed[$hostname] = true; |
|
2467 | - break; |
|
2468 | - } |
|
2469 | - } |
|
2470 | - } |
|
2471 | - } |
|
2472 | - return $domain_is_allowed[$hostname]; |
|
2473 | - } |
|
2474 | - |
|
2475 | - |
|
2476 | - public function AntiOffsiteLinking() { |
|
2477 | - // Optional anti-offsite hijacking of the thumbnail script |
|
2478 | - $allow = true; |
|
2479 | - if ($allow && $this->config_nooffsitelink_enabled && (@$_SERVER['HTTP_REFERER'] || $this->config_nooffsitelink_require_refer)) { |
|
2480 | - $this->DebugMessage('AntiOffsiteLinking() checking $_SERVER[HTTP_REFERER] "'.@$_SERVER['HTTP_REFERER'].'"', __FILE__, __LINE__); |
|
2481 | - foreach ($this->config_nooffsitelink_valid_domains as $key => $valid_domain) { |
|
2482 | - // $_SERVER['HTTP_HOST'] contains the port number, so strip it out here to make default configuration work |
|
2483 | - list($clean_domain) = explode(':', $valid_domain); |
|
2484 | - $this->config_nooffsitelink_valid_domains[$key] = $clean_domain; |
|
2485 | - } |
|
2486 | - $parsed_url = phpthumb_functions::ParseURLbetter(@$_SERVER['HTTP_REFERER']); |
|
2487 | - if (!$this->OffsiteDomainIsAllowed(@$parsed_url['host'], $this->config_nooffsitelink_valid_domains)) { |
|
2488 | - $allow = false; |
|
2489 | - //$this->DebugMessage('AntiOffsiteLinking() - "'.@$parsed_url['host'].'" is NOT in $this->config_nooffsitelink_valid_domains ('.implode(';', $this->config_nooffsitelink_valid_domains).')', __FILE__, __LINE__); |
|
2490 | - $this->ErrorImage('AntiOffsiteLinking() - "'.@$parsed_url['host'].'" is NOT in $this->config_nooffsitelink_valid_domains ('.implode(';', $this->config_nooffsitelink_valid_domains).')'); |
|
2491 | - } else { |
|
2492 | - $this->DebugMessage('AntiOffsiteLinking() - "'.@$parsed_url['host'].'" is in $this->config_nooffsitelink_valid_domains ('.implode(';', $this->config_nooffsitelink_valid_domains).')', __FILE__, __LINE__); |
|
2493 | - } |
|
2494 | - } |
|
2495 | - |
|
2496 | - if ($allow && $this->config_nohotlink_enabled && preg_match('#^(f|ht)tps?\://#i', $this->src)) { |
|
2497 | - $parsed_url = phpthumb_functions::ParseURLbetter($this->src); |
|
2498 | - //if (!phpthumb_functions::CaseInsensitiveInArray(@$parsed_url['host'], $this->config_nohotlink_valid_domains)) { |
|
2499 | - if (!$this->OffsiteDomainIsAllowed(@$parsed_url['host'], $this->config_nohotlink_valid_domains)) { |
|
2500 | - // This domain is not allowed |
|
2501 | - $allow = false; |
|
2502 | - $this->DebugMessage('AntiOffsiteLinking() - "'.$parsed_url['host'].'" is NOT in $this->config_nohotlink_valid_domains ('.implode(';', $this->config_nohotlink_valid_domains).')', __FILE__, __LINE__); |
|
2503 | - } else { |
|
2504 | - $this->DebugMessage('AntiOffsiteLinking() - "'.$parsed_url['host'].'" is in $this->config_nohotlink_valid_domains ('.implode(';', $this->config_nohotlink_valid_domains).')', __FILE__, __LINE__); |
|
2505 | - } |
|
2506 | - } |
|
2507 | - |
|
2508 | - if ($allow) { |
|
2509 | - $this->DebugMessage('AntiOffsiteLinking() says this is allowed', __FILE__, __LINE__); |
|
2510 | - return true; |
|
2511 | - } |
|
2512 | - |
|
2513 | - if (!phpthumb_functions::IsHexColor($this->config_error_bgcolor)) { |
|
2514 | - return $this->ErrorImage('Invalid hex color string "'.$this->config_error_bgcolor.'" for $this->config_error_bgcolor'); |
|
2515 | - } |
|
2516 | - if (!phpthumb_functions::IsHexColor($this->config_error_textcolor)) { |
|
2517 | - return $this->ErrorImage('Invalid hex color string "'.$this->config_error_textcolor.'" for $this->config_error_textcolor'); |
|
2518 | - } |
|
2519 | - if ($this->config_nooffsitelink_erase_image) { |
|
2520 | - |
|
2521 | - return $this->ErrorImage($this->config_nooffsitelink_text_message, $this->thumbnail_width, $this->thumbnail_height); |
|
2522 | - |
|
2523 | - } else { |
|
2524 | - |
|
2525 | - $this->config_nooffsitelink_watermark_src = $this->ResolveFilenameToAbsolute($this->config_nooffsitelink_watermark_src); |
|
2526 | - if (is_file($this->config_nooffsitelink_watermark_src)) { |
|
2527 | - |
|
2528 | - if (!include_once( __DIR__ .'/phpthumb.filters.php')) { |
|
2529 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.filters.php" which is required for applying watermark', __FILE__, __LINE__); |
|
2530 | - return false; |
|
2531 | - } |
|
2532 | - $watermark_img = $this->ImageCreateFromStringReplacement(file_get_contents($this->config_nooffsitelink_watermark_src)); |
|
2533 | - $phpthumbFilters = new phpthumb_filters(); |
|
2534 | - $phpthumbFilters->phpThumbObject = &$this; |
|
2535 | - $opacity = 50; |
|
2536 | - $margin = 5; |
|
2537 | - $phpthumbFilters->WatermarkOverlay($this->gdimg_output, $watermark_img, '*', $opacity, $margin); |
|
2538 | - imagedestroy($watermark_img); |
|
2539 | - unset($phpthumbFilters); |
|
2540 | - |
|
2541 | - } else { |
|
2542 | - |
|
2543 | - $nohotlink_text_array = explode("\n", wordwrap($this->config_nooffsitelink_text_message, floor($this->thumbnail_width / imagefontwidth($this->config_error_fontsize)), "\n")); |
|
2544 | - $nohotlink_text_color = phpthumb_functions::ImageHexColorAllocate($this->gdimg_output, $this->config_error_textcolor); |
|
2545 | - |
|
2546 | - $topoffset = round(($this->thumbnail_height - (count($nohotlink_text_array) * imagefontheight($this->config_error_fontsize))) / 2); |
|
2547 | - |
|
2548 | - $rowcounter = 0; |
|
2549 | - $this->DebugMessage('AntiOffsiteLinking() writing '.count($nohotlink_text_array).' lines of text "'.$this->config_nooffsitelink_text_message.'" (in #'.$this->config_error_textcolor.') on top of image', __FILE__, __LINE__); |
|
2550 | - foreach ($nohotlink_text_array as $textline) { |
|
2551 | - $leftoffset = max(0, round(($this->thumbnail_width - (strlen($textline) * imagefontwidth($this->config_error_fontsize))) / 2)); |
|
2552 | - imagestring($this->gdimg_output, $this->config_error_fontsize, $leftoffset, $topoffset + ($rowcounter++ * imagefontheight($this->config_error_fontsize)), $textline, $nohotlink_text_color); |
|
2553 | - } |
|
2554 | - |
|
2555 | - } |
|
2556 | - |
|
2557 | - } |
|
2558 | - return true; |
|
2559 | - } |
|
2560 | - |
|
2561 | - |
|
2562 | - public function AlphaChannelFlatten() { |
|
2563 | - if (!$this->is_alpha) { |
|
2564 | - // image doesn't have alpha transparency, no need to flatten |
|
2565 | - $this->DebugMessage('skipping AlphaChannelFlatten() because !$this->is_alpha', __FILE__, __LINE__); |
|
2566 | - return false; |
|
2567 | - } |
|
2568 | - switch ($this->thumbnailFormat) { |
|
2569 | - case 'png': |
|
2570 | - case 'ico': |
|
2571 | - // image has alpha transparency, but output as PNG or ICO which can handle it |
|
2572 | - $this->DebugMessage('skipping AlphaChannelFlatten() because ($this->thumbnailFormat == "'.$this->thumbnailFormat.'")', __FILE__, __LINE__); |
|
2573 | - return false; |
|
2574 | - break; |
|
2575 | - |
|
2576 | - case 'gif': |
|
2577 | - // image has alpha transparency, but output as GIF which can handle only single-color transparency |
|
2578 | - $CurrentImageColorTransparent = imagecolortransparent($this->gdimg_output); |
|
2579 | - if ($CurrentImageColorTransparent == -1) { |
|
2580 | - // no transparent color defined |
|
2581 | - |
|
2582 | - if (phpthumb_functions::gd_version() < 2.0) { |
|
2583 | - $this->DebugMessage('AlphaChannelFlatten() failed because GD version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2584 | - return false; |
|
2585 | - } |
|
2586 | - |
|
2587 | - if ($img_alpha_mixdown_dither = @imagecreatetruecolor(imagesx($this->gdimg_output), imagesy($this->gdimg_output))) { |
|
2588 | - |
|
2589 | - $dither_color = array(); |
|
2590 | - for ($i = 0; $i <= 255; $i++) { |
|
2591 | - $dither_color[$i] = imagecolorallocate($img_alpha_mixdown_dither, $i, $i, $i); |
|
2592 | - } |
|
2593 | - |
|
2594 | - // scan through current truecolor image copy alpha channel to temp image as grayscale |
|
2595 | - for ($x = 0; $x < $this->thumbnail_width; $x++) { |
|
2596 | - for ($y = 0; $y < $this->thumbnail_height; $y++) { |
|
2597 | - $PixelColor = phpthumb_functions::GetPixelColor($this->gdimg_output, $x, $y); |
|
2598 | - imagesetpixel($img_alpha_mixdown_dither, $x, $y, $dither_color[($PixelColor['alpha'] * 2)]); |
|
2599 | - } |
|
2600 | - } |
|
2601 | - |
|
2602 | - // dither alpha channel grayscale version down to 2 colors |
|
2603 | - imagetruecolortopalette($img_alpha_mixdown_dither, true, 2); |
|
2604 | - |
|
2605 | - // reduce color palette to 256-1 colors (leave one palette position for transparent color) |
|
2606 | - imagetruecolortopalette($this->gdimg_output, true, 255); |
|
2607 | - |
|
2608 | - // allocate a new color for transparent color index |
|
2609 | - $TransparentColor = imagecolorallocate($this->gdimg_output, 1, 254, 253); |
|
2610 | - imagecolortransparent($this->gdimg_output, $TransparentColor); |
|
2611 | - |
|
2612 | - // scan through alpha channel image and note pixels with >50% transparency |
|
2613 | - for ($x = 0; $x < $this->thumbnail_width; $x++) { |
|
2614 | - for ($y = 0; $y < $this->thumbnail_height; $y++) { |
|
2615 | - $AlphaChannelPixel = phpthumb_functions::GetPixelColor($img_alpha_mixdown_dither, $x, $y); |
|
2616 | - if ($AlphaChannelPixel['red'] > 127) { |
|
2617 | - imagesetpixel($this->gdimg_output, $x, $y, $TransparentColor); |
|
2618 | - } |
|
2619 | - } |
|
2620 | - } |
|
2621 | - imagedestroy($img_alpha_mixdown_dither); |
|
2622 | - |
|
2623 | - $this->DebugMessage('AlphaChannelFlatten() set image to 255+1 colors with transparency for GIF output', __FILE__, __LINE__); |
|
2624 | - return true; |
|
2625 | - |
|
2626 | - } else { |
|
2627 | - $this->DebugMessage('AlphaChannelFlatten() failed imagecreate('.imagesx($this->gdimg_output).', '.imagesy($this->gdimg_output).')', __FILE__, __LINE__); |
|
2628 | - return false; |
|
2629 | - } |
|
2630 | - |
|
2631 | - } else { |
|
2632 | - // a single transparent color already defined, leave as-is |
|
2633 | - $this->DebugMessage('skipping AlphaChannelFlatten() because ($this->thumbnailFormat == "'.$this->thumbnailFormat.'") and imagecolortransparent() returned "'.$CurrentImageColorTransparent.'"', __FILE__, __LINE__); |
|
2634 | - return true; |
|
2635 | - } |
|
2636 | - break; |
|
2637 | - } |
|
2638 | - $this->DebugMessage('continuing AlphaChannelFlatten() for output format "'.$this->thumbnailFormat.'"', __FILE__, __LINE__); |
|
2639 | - // image has alpha transparency, and is being output in a format that doesn't support it -- flatten |
|
2640 | - if ($gdimg_flatten_temp = phpthumb_functions::ImageCreateFunction($this->thumbnail_width, $this->thumbnail_height)) { |
|
2641 | - |
|
2642 | - $this->config_background_hexcolor = ($this->bg ? $this->bg : $this->config_background_hexcolor); |
|
2643 | - if (!phpthumb_functions::IsHexColor($this->config_background_hexcolor)) { |
|
2644 | - return $this->ErrorImage('Invalid hex color string "'.$this->config_background_hexcolor.'" for parameter "bg"'); |
|
2645 | - } |
|
2646 | - $background_color = phpthumb_functions::ImageHexColorAllocate($this->gdimg_output, $this->config_background_hexcolor); |
|
2647 | - imagefilledrectangle($gdimg_flatten_temp, 0, 0, $this->thumbnail_width, $this->thumbnail_height, $background_color); |
|
2648 | - imagecopy($gdimg_flatten_temp, $this->gdimg_output, 0, 0, 0, 0, $this->thumbnail_width, $this->thumbnail_height); |
|
2649 | - |
|
2650 | - imagealphablending($this->gdimg_output, true); |
|
2651 | - imagesavealpha($this->gdimg_output, false); |
|
2652 | - imagecolortransparent($this->gdimg_output, -1); |
|
2653 | - imagecopy($this->gdimg_output, $gdimg_flatten_temp, 0, 0, 0, 0, $this->thumbnail_width, $this->thumbnail_height); |
|
2654 | - |
|
2655 | - imagedestroy($gdimg_flatten_temp); |
|
2656 | - return true; |
|
2657 | - |
|
2658 | - } else { |
|
2659 | - $this->DebugMessage('ImageCreateFunction() failed', __FILE__, __LINE__); |
|
2660 | - } |
|
2661 | - return false; |
|
2662 | - } |
|
2663 | - |
|
2664 | - |
|
2665 | - public function ApplyFilters() { |
|
2666 | - if ($this->fltr && is_array($this->fltr)) { |
|
2667 | - if (!include_once( __DIR__ .'/phpthumb.filters.php')) { |
|
2668 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.filters.php" which is required for applying filters ('.implode(';', $this->fltr).')', __FILE__, __LINE__); |
|
2669 | - return false; |
|
2670 | - } |
|
2671 | - $phpthumbFilters = new phpthumb_filters(); |
|
2672 | - $phpthumbFilters->phpThumbObject = &$this; |
|
2673 | - foreach ($this->fltr as $filtercommand) { |
|
2674 | - @list($command, $parameter) = explode('|', $filtercommand, 2); |
|
2675 | - $this->DebugMessage('Attempting to process filter command "'.$command.'('.$parameter.')"', __FILE__, __LINE__); |
|
2676 | - switch ($command) { |
|
2677 | - case 'brit': // Brightness |
|
2678 | - $phpthumbFilters->Brightness($this->gdimg_output, $parameter); |
|
2679 | - break; |
|
2680 | - |
|
2681 | - case 'cont': // Contrast |
|
2682 | - $phpthumbFilters->Contrast($this->gdimg_output, $parameter); |
|
2683 | - break; |
|
2684 | - |
|
2685 | - case 'ds': // Desaturation |
|
2686 | - $phpthumbFilters->Desaturate($this->gdimg_output, $parameter, ''); |
|
2687 | - break; |
|
2688 | - |
|
2689 | - case 'sat': // Saturation |
|
2690 | - $phpthumbFilters->Saturation($this->gdimg_output, $parameter, ''); |
|
2691 | - break; |
|
2692 | - |
|
2693 | - case 'gray': // Grayscale |
|
2694 | - $phpthumbFilters->Grayscale($this->gdimg_output); |
|
2695 | - break; |
|
2696 | - |
|
2697 | - case 'clr': // Colorize |
|
2698 | - if (phpthumb_functions::gd_version() < 2) { |
|
2699 | - $this->DebugMessage('Skipping Colorize() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2700 | - break; |
|
2701 | - } |
|
2702 | - @list($amount, $color) = explode('|', $parameter, 2); |
|
2703 | - $phpthumbFilters->Colorize($this->gdimg_output, $amount, $color); |
|
2704 | - break; |
|
2705 | - |
|
2706 | - case 'sep': // Sepia |
|
2707 | - if (phpthumb_functions::gd_version() < 2) { |
|
2708 | - $this->DebugMessage('Skipping Sepia() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2709 | - break; |
|
2710 | - } |
|
2711 | - @list($amount, $color) = explode('|', $parameter, 2); |
|
2712 | - $phpthumbFilters->Sepia($this->gdimg_output, $amount, $color); |
|
2713 | - break; |
|
2714 | - |
|
2715 | - case 'gam': // Gamma correction |
|
2716 | - $phpthumbFilters->Gamma($this->gdimg_output, $parameter); |
|
2717 | - break; |
|
2718 | - |
|
2719 | - case 'neg': // Negative colors |
|
2720 | - $phpthumbFilters->Negative($this->gdimg_output); |
|
2721 | - break; |
|
2722 | - |
|
2723 | - case 'th': // Threshold |
|
2724 | - $phpthumbFilters->Threshold($this->gdimg_output, $parameter); |
|
2725 | - break; |
|
2726 | - |
|
2727 | - case 'rcd': // ReduceColorDepth |
|
2728 | - if (phpthumb_functions::gd_version() < 2) { |
|
2729 | - $this->DebugMessage('Skipping ReduceColorDepth() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2730 | - break; |
|
2731 | - } |
|
2732 | - @list($colors, $dither) = explode('|', $parameter, 2); |
|
2733 | - $colors = ($colors ? (int) $colors : 256); |
|
2734 | - $dither = ((strlen($dither) > 0) ? (bool) $dither : true); |
|
2735 | - $phpthumbFilters->ReduceColorDepth($this->gdimg_output, $colors, $dither); |
|
2736 | - break; |
|
2737 | - |
|
2738 | - case 'flip': // Flip |
|
2739 | - $phpthumbFilters->Flip($this->gdimg_output, (strpos(strtolower($parameter), 'x') !== false), (strpos(strtolower($parameter), 'y') !== false)); |
|
2740 | - break; |
|
2741 | - |
|
2742 | - case 'edge': // EdgeDetect |
|
2743 | - $phpthumbFilters->EdgeDetect($this->gdimg_output); |
|
2744 | - break; |
|
2745 | - |
|
2746 | - case 'emb': // Emboss |
|
2747 | - $phpthumbFilters->Emboss($this->gdimg_output); |
|
2748 | - break; |
|
2749 | - |
|
2750 | - case 'bvl': // Bevel |
|
2751 | - @list($width, $color1, $color2) = explode('|', $parameter, 3); |
|
2752 | - $phpthumbFilters->Bevel($this->gdimg_output, $width, $color1, $color2); |
|
2753 | - break; |
|
2754 | - |
|
2755 | - case 'lvl': // autoLevels |
|
2756 | - @list($band, $method, $threshold) = explode('|', $parameter, 3); |
|
2757 | - $band = ($band ? preg_replace('#[^RGBA\\*]#', '', strtoupper($band)) : '*'); |
|
2758 | - $method = ((strlen($method) > 0) ? (int) $method : 2); |
|
2759 | - $threshold = ((strlen($threshold) > 0) ? (float) $threshold : 0.1); |
|
2760 | - |
|
2761 | - $phpthumbFilters->HistogramStretch($this->gdimg_output, $band, $method, $threshold); |
|
2762 | - break; |
|
2763 | - |
|
2764 | - case 'wb': // WhiteBalance |
|
2765 | - $phpthumbFilters->WhiteBalance($this->gdimg_output, $parameter); |
|
2766 | - break; |
|
2767 | - |
|
2768 | - case 'hist': // Histogram overlay |
|
2769 | - if (phpthumb_functions::gd_version() < 2) { |
|
2770 | - $this->DebugMessage('Skipping HistogramOverlay() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2771 | - break; |
|
2772 | - } |
|
2773 | - @list($bands, $colors, $width, $height, $alignment, $opacity, $margin_x, $margin_y) = explode('|', $parameter, 8); |
|
2774 | - $bands = ($bands ? $bands : '*'); |
|
2775 | - $colors = ($colors ? $colors : ''); |
|
2776 | - $width = ($width ? $width : 0.25); |
|
2777 | - $height = ($height ? $height : 0.25); |
|
2778 | - $alignment = ($alignment ? $alignment : 'BR'); |
|
2779 | - $opacity = ($opacity ? $opacity : 50); |
|
2780 | - $margin_x = ($margin_x ? $margin_x : 5); |
|
2781 | - // $margin_y -- it wasn't forgotten, let the value always pass unchanged |
|
2782 | - $phpthumbFilters->HistogramOverlay($this->gdimg_output, $bands, $colors, $width, $height, $alignment, $opacity, $margin_x, $margin_y); |
|
2783 | - break; |
|
2784 | - |
|
2785 | - case 'fram': // Frame |
|
2786 | - @list($frame_width, $edge_width, $color_frame, $color1, $color2) = explode('|', $parameter, 5); |
|
2787 | - $phpthumbFilters->Frame($this->gdimg_output, $frame_width, $edge_width, $color_frame, $color1, $color2); |
|
2788 | - break; |
|
2789 | - |
|
2790 | - case 'drop': // DropShadow |
|
2791 | - if (phpthumb_functions::gd_version() < 2) { |
|
2792 | - $this->DebugMessage('Skipping DropShadow() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2793 | - return false; |
|
2794 | - } |
|
2795 | - $this->is_alpha = true; |
|
2796 | - @list($distance, $width, $color, $angle, $fade) = explode('|', $parameter, 5); |
|
2797 | - $phpthumbFilters->DropShadow($this->gdimg_output, $distance, $width, $color, $angle, $fade); |
|
2798 | - break; |
|
2799 | - |
|
2800 | - case 'mask': // Mask cropping |
|
2801 | - if (phpthumb_functions::gd_version() < 2) { |
|
2802 | - $this->DebugMessage('Skipping Mask() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2803 | - return false; |
|
2804 | - } |
|
2805 | - @list($mask_filename, $invert) = explode('|', $parameter, 2); |
|
2806 | - $mask_filename = $this->ResolveFilenameToAbsolute($mask_filename); |
|
2807 | - if (@is_readable($mask_filename) && ($fp_mask = @fopen($mask_filename, 'rb'))) { |
|
2808 | - $MaskImageData = ''; |
|
2809 | - do { |
|
2810 | - $buffer = fread($fp_mask, 8192); |
|
2811 | - $MaskImageData .= $buffer; |
|
2812 | - } while (strlen($buffer) > 0); |
|
2813 | - fclose($fp_mask); |
|
2814 | - if ($gdimg_mask = $this->ImageCreateFromStringReplacement($MaskImageData)) { |
|
2815 | - if ($invert && phpthumb_functions::version_compare_replacement(PHP_VERSION, '5.0.0', '>=') && phpthumb_functions::gd_is_bundled()) { |
|
2816 | - imagefilter($gdimg_mask, IMG_FILTER_NEGATE); |
|
2817 | - } |
|
2818 | - $this->is_alpha = true; |
|
2819 | - $phpthumbFilters->ApplyMask($gdimg_mask, $this->gdimg_output); |
|
2820 | - imagedestroy($gdimg_mask); |
|
2821 | - } else { |
|
2822 | - $this->DebugMessage('ImageCreateFromStringReplacement() failed for "'.$mask_filename.'"', __FILE__, __LINE__); |
|
2823 | - } |
|
2824 | - } else { |
|
2825 | - $this->DebugMessage('Cannot open mask file "'.$mask_filename.'"', __FILE__, __LINE__); |
|
2826 | - } |
|
2827 | - break; |
|
2828 | - |
|
2829 | - case 'elip': // Ellipse cropping |
|
2830 | - if (phpthumb_functions::gd_version() < 2) { |
|
2831 | - $this->DebugMessage('Skipping Ellipse() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2832 | - return false; |
|
2833 | - } |
|
2834 | - $this->is_alpha = true; |
|
2835 | - $phpthumbFilters->Ellipse($this->gdimg_output); |
|
2836 | - break; |
|
2837 | - |
|
2838 | - case 'ric': // RoundedImageCorners |
|
2839 | - if (phpthumb_functions::gd_version() < 2) { |
|
2840 | - $this->DebugMessage('Skipping RoundedImageCorners() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2841 | - return false; |
|
2842 | - } |
|
2843 | - @list($radius_x, $radius_y) = explode('|', $parameter, 2); |
|
2844 | - if (($radius_x < 1) || ($radius_y < 1)) { |
|
2845 | - $this->DebugMessage('Skipping RoundedImageCorners('.$radius_x.', '.$radius_y.') because x/y radius is less than 1', __FILE__, __LINE__); |
|
2846 | - break; |
|
2847 | - } |
|
2848 | - $this->is_alpha = true; |
|
2849 | - $phpthumbFilters->RoundedImageCorners($this->gdimg_output, $radius_x, $radius_y); |
|
2850 | - break; |
|
2851 | - |
|
2852 | - case 'crop': // Crop |
|
2853 | - @list($left, $right, $top, $bottom) = explode('|', $parameter, 4); |
|
2854 | - $phpthumbFilters->Crop($this->gdimg_output, $left, $right, $top, $bottom); |
|
2855 | - break; |
|
2856 | - |
|
2857 | - case 'bord': // Border |
|
2858 | - @list($border_width, $radius_x, $radius_y, $hexcolor_border) = explode('|', $parameter, 4); |
|
2859 | - $this->is_alpha = true; |
|
2860 | - $phpthumbFilters->ImageBorder($this->gdimg_output, $border_width, $radius_x, $radius_y, $hexcolor_border); |
|
2861 | - break; |
|
2862 | - |
|
2863 | - case 'over': // Overlay |
|
2864 | - @list($filename, $underlay, $margin, $opacity) = explode('|', $parameter, 4); |
|
2865 | - $underlay = (bool) ($underlay ? $underlay : false); |
|
2866 | - $margin = ((strlen($margin) > 0) ? $margin : ($underlay ? 0.1 : 0.0)); |
|
2867 | - $opacity = ((strlen($opacity) > 0) ? $opacity : 100); |
|
2868 | - if (($margin > 0) && ($margin < 1)) { |
|
2869 | - $margin = min(0.499, $margin); |
|
2870 | - } elseif (($margin > -1) && ($margin < 0)) { |
|
2871 | - $margin = max(-0.499, $margin); |
|
2872 | - } |
|
2873 | - |
|
2874 | - $filename = $this->ResolveFilenameToAbsolute($filename); |
|
2875 | - if (@is_readable($filename) && ($fp_watermark = @fopen($filename, 'rb'))) { |
|
2876 | - $WatermarkImageData = ''; |
|
2877 | - do { |
|
2878 | - $buffer = fread($fp_watermark, 8192); |
|
2879 | - $WatermarkImageData .= $buffer; |
|
2880 | - } while (strlen($buffer) > 0); |
|
2881 | - fclose($fp_watermark); |
|
2882 | - if ($img_watermark = $this->ImageCreateFromStringReplacement($WatermarkImageData)) { |
|
2883 | - if (($margin > 0) && ($margin < 1)) { |
|
2884 | - $resized_x = max(1, imagesx($this->gdimg_output) - round(2 * (imagesx($this->gdimg_output) * $margin))); |
|
2885 | - $resized_y = max(1, imagesy($this->gdimg_output) - round(2 * (imagesy($this->gdimg_output) * $margin))); |
|
2886 | - } else { |
|
2887 | - $resized_x = max(1, imagesx($this->gdimg_output) - round(2 * $margin)); |
|
2888 | - $resized_y = max(1, imagesy($this->gdimg_output) - round(2 * $margin)); |
|
2889 | - } |
|
2890 | - |
|
2891 | - if ($underlay) { |
|
2892 | - |
|
2893 | - if ($img_watermark_resized = phpthumb_functions::ImageCreateFunction(imagesx($this->gdimg_output), imagesy($this->gdimg_output))) { |
|
2894 | - imagealphablending($img_watermark_resized, false); |
|
2895 | - imagesavealpha($img_watermark_resized, true); |
|
2896 | - $this->ImageResizeFunction($img_watermark_resized, $img_watermark, 0, 0, 0, 0, imagesx($img_watermark_resized), imagesy($img_watermark_resized), imagesx($img_watermark), imagesy($img_watermark)); |
|
2897 | - if ($img_source_resized = phpthumb_functions::ImageCreateFunction($resized_x, $resized_y)) { |
|
2898 | - imagealphablending($img_source_resized, false); |
|
2899 | - imagesavealpha($img_source_resized, true); |
|
2900 | - $this->ImageResizeFunction($img_source_resized, $this->gdimg_output, 0, 0, 0, 0, imagesx($img_source_resized), imagesy($img_source_resized), imagesx($this->gdimg_output), imagesy($this->gdimg_output)); |
|
2901 | - $phpthumbFilters->WatermarkOverlay($img_watermark_resized, $img_source_resized, 'C', $opacity, $margin); |
|
2902 | - imagecopy($this->gdimg_output, $img_watermark_resized, 0, 0, 0, 0, imagesx($this->gdimg_output), imagesy($this->gdimg_output)); |
|
2903 | - } else { |
|
2904 | - $this->DebugMessage('phpthumb_functions::ImageCreateFunction('.$resized_x.', '.$resized_y.')', __FILE__, __LINE__); |
|
2905 | - } |
|
2906 | - imagedestroy($img_watermark_resized); |
|
2907 | - } else { |
|
2908 | - $this->DebugMessage('phpthumb_functions::ImageCreateFunction('.imagesx($this->gdimg_output).', '.imagesy($this->gdimg_output).')', __FILE__, __LINE__); |
|
2909 | - } |
|
2910 | - |
|
2911 | - } else { // overlay |
|
2912 | - |
|
2913 | - if ($img_watermark_resized = phpthumb_functions::ImageCreateFunction($resized_x, $resized_y)) { |
|
2914 | - imagealphablending($img_watermark_resized, false); |
|
2915 | - imagesavealpha($img_watermark_resized, true); |
|
2916 | - $this->ImageResizeFunction($img_watermark_resized, $img_watermark, 0, 0, 0, 0, imagesx($img_watermark_resized), imagesy($img_watermark_resized), imagesx($img_watermark), imagesy($img_watermark)); |
|
2917 | - $phpthumbFilters->WatermarkOverlay($this->gdimg_output, $img_watermark_resized, 'C', $opacity, $margin); |
|
2918 | - imagedestroy($img_watermark_resized); |
|
2919 | - } else { |
|
2920 | - $this->DebugMessage('phpthumb_functions::ImageCreateFunction('.$resized_x.', '.$resized_y.')', __FILE__, __LINE__); |
|
2921 | - } |
|
2922 | - |
|
2923 | - } |
|
2924 | - imagedestroy($img_watermark); |
|
2925 | - |
|
2926 | - } else { |
|
2927 | - $this->DebugMessage('ImageCreateFromStringReplacement() failed for "'.$filename.'"', __FILE__, __LINE__); |
|
2928 | - } |
|
2929 | - } else { |
|
2930 | - $this->DebugMessage('Cannot open overlay file "'.$filename.'"', __FILE__, __LINE__); |
|
2931 | - } |
|
2932 | - break; |
|
2933 | - |
|
2934 | - case 'wmi': // WaterMarkImage |
|
2935 | - @list($filename, $alignment, $opacity, $margin['x'], $margin['y'], $rotate_angle) = explode('|', $parameter, 6); |
|
2936 | - // $margin can be pixel margin or percent margin if $alignment is text, or max width/height if $alignment is position like "50x75" |
|
2937 | - $alignment = ($alignment ? $alignment : 'BR'); |
|
2938 | - $opacity = (strlen($opacity) ? (int) $opacity : 50); |
|
2939 | - $rotate_angle = (strlen($rotate_angle) ? (int) $rotate_angle : 0); |
|
2940 | - if (!preg_match('#^([0-9\\.\\-]*)x([0-9\\.\\-]*)$#i', $alignment, $matches)) { |
|
2941 | - $margins = array('x', 'y'); |
|
2942 | - foreach ($margins as $xy) { |
|
2943 | - $margin[$xy] = (strlen($margin[$xy]) ? $margin[$xy] : 5); |
|
2944 | - if (($margin[$xy] > 0) && ($margin[$xy] < 1)) { |
|
2945 | - $margin[$xy] = min(0.499, $margin[$xy]); |
|
2946 | - } elseif (($margin[$xy] > -1) && ($margin[$xy] < 0)) { |
|
2947 | - $margin[$xy] = max(-0.499, $margin[$xy]); |
|
2948 | - } |
|
2949 | - } |
|
2950 | - } |
|
2951 | - |
|
2952 | - $filename = $this->ResolveFilenameToAbsolute($filename); |
|
2953 | - if (@is_readable($filename)) { |
|
2954 | - if ($img_watermark = $this->ImageCreateFromFilename($filename)) { |
|
2955 | - if ($rotate_angle !== 0) { |
|
2956 | - $phpthumbFilters->ImprovedImageRotate($img_watermark, $rotate_angle, 'FFFFFF', null, $this); |
|
2957 | - } |
|
2958 | - if (preg_match('#^([0-9\\.\\-]*)x([0-9\\.\\-]*)$#i', $alignment, $matches)) { |
|
2959 | - $watermark_max_width = (int) ($margin[ 'x'] ? $margin[ 'x'] : imagesx($img_watermark)); |
|
2960 | - $watermark_max_height = (int) ($margin[ 'y'] ? $margin[ 'y'] : imagesy($img_watermark)); |
|
2961 | - $scale = phpthumb_functions::ScaleToFitInBox(imagesx($img_watermark), imagesy($img_watermark), $watermark_max_width, $watermark_max_height, true, true); |
|
2962 | - $this->DebugMessage('Scaling watermark by a factor of '.number_format($scale, 4), __FILE__, __LINE__); |
|
2963 | - if (($scale > 1) || ($scale < 1)) { |
|
2964 | - if ($img_watermark2 = phpthumb_functions::ImageCreateFunction($scale * imagesx($img_watermark), $scale * imagesy($img_watermark))) { |
|
2965 | - imagealphablending($img_watermark2, false); |
|
2966 | - imagesavealpha($img_watermark2, true); |
|
2967 | - $this->ImageResizeFunction($img_watermark2, $img_watermark, 0, 0, 0, 0, imagesx($img_watermark2), imagesy($img_watermark2), imagesx($img_watermark), imagesy($img_watermark)); |
|
2968 | - $img_watermark = $img_watermark2; |
|
2969 | - } else { |
|
2970 | - $this->DebugMessage('ImageCreateFunction('.($scale * imagesx($img_watermark)).', '.($scale * imagesx($img_watermark)).') failed', __FILE__, __LINE__); |
|
2971 | - } |
|
2972 | - } |
|
2973 | - $watermark_dest_x = round($matches[1] - (imagesx($img_watermark) / 2)); |
|
2974 | - $watermark_dest_y = round($matches[2] - (imagesy($img_watermark) / 2)); |
|
2975 | - $alignment = $watermark_dest_x.'x'.$watermark_dest_y; |
|
2976 | - } |
|
2977 | - $phpthumbFilters->WatermarkOverlay($this->gdimg_output, $img_watermark, $alignment, $opacity, $margin['x'], $margin['y']); |
|
2978 | - imagedestroy($img_watermark); |
|
2979 | - if (isset($img_watermark2) && is_resource($img_watermark2)) { |
|
2980 | - imagedestroy($img_watermark2); |
|
2981 | - } |
|
2982 | - } else { |
|
2983 | - $this->DebugMessage('ImageCreateFromFilename() failed for "'.$filename.'"', __FILE__, __LINE__); |
|
2984 | - } |
|
2985 | - } else { |
|
2986 | - $this->DebugMessage('!is_readable('.$filename.')', __FILE__, __LINE__); |
|
2987 | - } |
|
2988 | - break; |
|
2989 | - |
|
2990 | - case 'wmt': // WaterMarkText |
|
2991 | - @list($text, $size, $alignment, $hex_color, $ttffont, $opacity, $margin, $angle, $bg_color, $bg_opacity, $fillextend, $lineheight) = explode('|', $parameter, 12); |
|
2992 | - $text = ($text ? $text : ''); |
|
2993 | - $size = ($size ? $size : 3); |
|
2994 | - $alignment = ($alignment ? $alignment : 'BR'); |
|
2995 | - $hex_color = ($hex_color ? $hex_color : '000000'); |
|
2996 | - $ttffont = ($ttffont ? $ttffont : ''); |
|
2997 | - $opacity = (strlen($opacity) ? $opacity : 50); |
|
2998 | - $margin = (strlen($margin) ? $margin : 5); |
|
2999 | - $angle = (strlen($angle) ? $angle : 0); |
|
3000 | - $bg_color = ($bg_color ? $bg_color : false); |
|
3001 | - $bg_opacity = ($bg_opacity ? $bg_opacity : 0); |
|
3002 | - $fillextend = ($fillextend ? $fillextend : ''); |
|
3003 | - $lineheight = ($lineheight ? $lineheight : 1.0); |
|
3004 | - |
|
3005 | - if (basename($ttffont) == $ttffont) { |
|
3006 | - $ttffont = $this->realPathSafe($this->config_ttf_directory.DIRECTORY_SEPARATOR.$ttffont); |
|
3007 | - } else { |
|
3008 | - $ttffont = $this->ResolveFilenameToAbsolute($ttffont); |
|
3009 | - } |
|
3010 | - $phpthumbFilters->WatermarkText($this->gdimg_output, $text, $size, $alignment, $hex_color, $ttffont, $opacity, $margin, $angle, $bg_color, $bg_opacity, $fillextend, $lineheight); |
|
3011 | - break; |
|
3012 | - |
|
3013 | - case 'blur': // Blur |
|
3014 | - @list($radius) = explode('|', $parameter, 1); |
|
3015 | - $radius = ($radius ? $radius : 1); |
|
3016 | - if (phpthumb_functions::gd_version() >= 2) { |
|
3017 | - $phpthumbFilters->Blur($this->gdimg_output, $radius); |
|
3018 | - } else { |
|
3019 | - $this->DebugMessage('Skipping Blur() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
3020 | - } |
|
3021 | - break; |
|
3022 | - |
|
3023 | - case 'gblr': // Gaussian Blur |
|
3024 | - $phpthumbFilters->BlurGaussian($this->gdimg_output); |
|
3025 | - break; |
|
3026 | - |
|
3027 | - case 'sblr': // Selective Blur |
|
3028 | - $phpthumbFilters->BlurSelective($this->gdimg_output); |
|
3029 | - break; |
|
3030 | - |
|
3031 | - case 'mean': // MeanRemoval blur |
|
3032 | - $phpthumbFilters->MeanRemoval($this->gdimg_output); |
|
3033 | - break; |
|
3034 | - |
|
3035 | - case 'smth': // Smooth blur |
|
3036 | - $phpthumbFilters->Smooth($this->gdimg_output, $parameter); |
|
3037 | - break; |
|
3038 | - |
|
3039 | - case 'usm': // UnSharpMask sharpening |
|
3040 | - @list($amount, $radius, $threshold) = explode('|', $parameter, 3); |
|
3041 | - $amount = ($amount ? $amount : 80); |
|
3042 | - $radius = ($radius ? $radius : 0.5); |
|
3043 | - $threshold = (strlen($threshold) ? $threshold : 3); |
|
3044 | - if (phpthumb_functions::gd_version() >= 2.0) { |
|
3045 | - ob_start(); |
|
3046 | - if (!@include_once( __DIR__ .'/phpthumb.unsharp.php')) { |
|
3047 | - $include_error = ob_get_contents(); |
|
3048 | - if ($include_error) { |
|
3049 | - $this->DebugMessage('include_once("'. __DIR__ .'/phpthumb.unsharp.php") generated message: "'.$include_error.'"', __FILE__, __LINE__); |
|
3050 | - } |
|
3051 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.unsharp.php" which is required for unsharp masking', __FILE__, __LINE__); |
|
3052 | - ob_end_clean(); |
|
3053 | - return false; |
|
3054 | - } |
|
3055 | - ob_end_clean(); |
|
3056 | - phpUnsharpMask::applyUnsharpMask($this->gdimg_output, $amount, $radius, $threshold); |
|
3057 | - } else { |
|
3058 | - $this->DebugMessage('Skipping unsharp mask because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
3059 | - return false; |
|
3060 | - } |
|
3061 | - break; |
|
3062 | - |
|
3063 | - case 'size': // Resize |
|
3064 | - @list($newwidth, $newheight, $stretch) = explode('|', $parameter); |
|
3065 | - $newwidth = (!$newwidth ? imagesx($this->gdimg_output) : ((($newwidth > 0) && ($newwidth < 1)) ? round($newwidth * imagesx($this->gdimg_output)) : round($newwidth))); |
|
3066 | - $newheight = (!$newheight ? imagesy($this->gdimg_output) : ((($newheight > 0) && ($newheight < 1)) ? round($newheight * imagesy($this->gdimg_output)) : round($newheight))); |
|
3067 | - $stretch = ($stretch ? true : false); |
|
3068 | - if ($stretch) { |
|
3069 | - $scale_x = phpthumb_functions::ScaleToFitInBox(imagesx($this->gdimg_output), imagesx($this->gdimg_output), $newwidth, $newwidth, true, true); |
|
3070 | - $scale_y = phpthumb_functions::ScaleToFitInBox(imagesy($this->gdimg_output), imagesy($this->gdimg_output), $newheight, $newheight, true, true); |
|
3071 | - } else { |
|
3072 | - $scale_x = phpthumb_functions::ScaleToFitInBox(imagesx($this->gdimg_output), imagesy($this->gdimg_output), $newwidth, $newheight, true, true); |
|
3073 | - $scale_y = $scale_x; |
|
3074 | - } |
|
3075 | - $this->DebugMessage('Scaling watermark ('.($stretch ? 'with' : 'without').' stretch) by a factor of "'.number_format($scale_x, 4).' x '.number_format($scale_y, 4).'"', __FILE__, __LINE__); |
|
3076 | - if (($scale_x > 1) || ($scale_x < 1) || ($scale_y > 1) || ($scale_y < 1)) { |
|
3077 | - if ($img_temp = phpthumb_functions::ImageCreateFunction(imagesx($this->gdimg_output), imagesy($this->gdimg_output))) { |
|
3078 | - imagecopy($img_temp, $this->gdimg_output, 0, 0, 0, 0, imagesx($this->gdimg_output), imagesy($this->gdimg_output)); |
|
3079 | - if ($this->gdimg_output = phpthumb_functions::ImageCreateFunction($scale_x * imagesx($img_temp), $scale_y * imagesy($img_temp))) { |
|
3080 | - imagealphablending($this->gdimg_output, false); |
|
3081 | - imagesavealpha($this->gdimg_output, true); |
|
3082 | - $this->ImageResizeFunction($this->gdimg_output, $img_temp, 0, 0, 0, 0, imagesx($this->gdimg_output), imagesy($this->gdimg_output), imagesx($img_temp), imagesy($img_temp)); |
|
3083 | - } else { |
|
3084 | - $this->DebugMessage('ImageCreateFunction('.($scale_x * imagesx($img_temp)).', '.($scale_y * imagesy($img_temp)).') failed', __FILE__, __LINE__); |
|
3085 | - } |
|
3086 | - imagedestroy($img_temp); |
|
3087 | - } else { |
|
3088 | - $this->DebugMessage('ImageCreateFunction('.imagesx($this->gdimg_output).', '.imagesy($this->gdimg_output).') failed', __FILE__, __LINE__); |
|
3089 | - } |
|
3090 | - } |
|
3091 | - break; |
|
3092 | - |
|
3093 | - case 'rot': // ROTate |
|
3094 | - @list($angle, $bgcolor) = explode('|', $parameter, 2); |
|
3095 | - $phpthumbFilters->ImprovedImageRotate($this->gdimg_output, $angle, $bgcolor, null, $this); |
|
3096 | - break; |
|
3097 | - |
|
3098 | - case 'stc': // Source Transparent Color |
|
3099 | - @list($hexcolor, $min_limit, $max_limit) = explode('|', $parameter, 3); |
|
3100 | - if (!phpthumb_functions::IsHexColor($hexcolor)) { |
|
3101 | - $this->DebugMessage('Skipping SourceTransparentColor hex color is invalid ('.$hexcolor.')', __FILE__, __LINE__); |
|
3102 | - return false; |
|
3103 | - } |
|
3104 | - $min_limit = (strlen($min_limit) ? $min_limit : 5); |
|
3105 | - $max_limit = (strlen($max_limit) ? $max_limit : 10); |
|
3106 | - if ($gdimg_mask = $phpthumbFilters->SourceTransparentColorMask($this->gdimg_output, $hexcolor, $min_limit, $max_limit)) { |
|
3107 | - $this->is_alpha = true; |
|
3108 | - $phpthumbFilters->ApplyMask($gdimg_mask, $this->gdimg_output); |
|
3109 | - imagedestroy($gdimg_mask); |
|
3110 | - } else { |
|
3111 | - $this->DebugMessage('SourceTransparentColorMask() failed for "'.$hexcolor.','.$min_limit.','.$max_limit.'"', __FILE__, __LINE__); |
|
3112 | - } |
|
3113 | - break; |
|
3114 | - } |
|
3115 | - $this->DebugMessage('Finished processing filter command "'.$command.'('.$parameter.')"', __FILE__, __LINE__); |
|
3116 | - } |
|
3117 | - } |
|
3118 | - return true; |
|
3119 | - } |
|
3120 | - |
|
3121 | - |
|
3122 | - public function MaxFileSize() { |
|
3123 | - if (phpthumb_functions::gd_version() < 2) { |
|
3124 | - $this->DebugMessage('Skipping MaxFileSize() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
3125 | - return false; |
|
3126 | - } |
|
3127 | - if ($this->maxb > 0) { |
|
3128 | - switch ($this->thumbnailFormat) { |
|
3129 | - case 'png': |
|
3130 | - case 'gif': |
|
3131 | - $imgRenderFunction = 'image'.$this->thumbnailFormat; |
|
3132 | - |
|
3133 | - ob_start(); |
|
3134 | - $imgRenderFunction($this->gdimg_output); |
|
3135 | - $imgdata = ob_get_contents(); |
|
3136 | - ob_end_clean(); |
|
3137 | - |
|
3138 | - if (strlen($imgdata) > $this->maxb) { |
|
3139 | - for ($i = 8; $i >= 1; $i--) { |
|
3140 | - $tempIMG = imagecreatetruecolor(imagesx($this->gdimg_output), imagesy($this->gdimg_output)); |
|
3141 | - imagecopy($tempIMG, $this->gdimg_output, 0, 0, 0, 0, imagesx($this->gdimg_output), imagesy($this->gdimg_output)); |
|
3142 | - imagetruecolortopalette($tempIMG, true, pow(2, $i)); |
|
3143 | - ob_start(); |
|
3144 | - $imgRenderFunction($tempIMG); |
|
3145 | - $imgdata = ob_get_contents(); |
|
3146 | - ob_end_clean(); |
|
3147 | - |
|
3148 | - if (strlen($imgdata) <= $this->maxb) { |
|
3149 | - imagetruecolortopalette($this->gdimg_output, true, pow(2, $i)); |
|
3150 | - break; |
|
3151 | - } |
|
3152 | - } |
|
3153 | - } |
|
3154 | - break; |
|
3155 | - |
|
3156 | - case 'jpeg': |
|
3157 | - ob_start(); |
|
3158 | - imagejpeg($this->gdimg_output); |
|
3159 | - $imgdata = ob_get_contents(); |
|
3160 | - ob_end_clean(); |
|
3161 | - |
|
3162 | - if (strlen($imgdata) > $this->maxb) { |
|
3163 | - for ($i = 3; $i < 20; $i++) { |
|
3164 | - $q = round(100 * (1 - log10($i / 2))); |
|
3165 | - ob_start(); |
|
3166 | - imagejpeg($this->gdimg_output, null, $q); |
|
3167 | - $imgdata = ob_get_contents(); |
|
3168 | - ob_end_clean(); |
|
3169 | - |
|
3170 | - $this->thumbnailQuality = $q; |
|
3171 | - if (strlen($imgdata) <= $this->maxb) { |
|
3172 | - break; |
|
3173 | - } |
|
3174 | - } |
|
3175 | - } |
|
3176 | - if (strlen($imgdata) > $this->maxb) { |
|
3177 | - return false; |
|
3178 | - } |
|
3179 | - break; |
|
3180 | - |
|
3181 | - default: |
|
3182 | - return false; |
|
3183 | - } |
|
3184 | - } |
|
3185 | - return true; |
|
3186 | - } |
|
3187 | - |
|
3188 | - |
|
3189 | - public function CalculateThumbnailDimensions() { |
|
3190 | - $this->DebugMessage('CalculateThumbnailDimensions() starting with [W,H,sx,sy,sw,sh] initially set to ['.$this->source_width.','.$this->source_height.','.$this->sx.','.$this->sy.','.$this->sw.','.$this->sh.']', __FILE__, __LINE__); |
|
1810 | + $commandline .= ' -repage'; |
|
1811 | + } else { |
|
1812 | + $this->DebugMessage('Skipping "-repage" because ImageMagick (v'.$this->ImageMagickVersion().') does not support it', __FILE__, __LINE__); |
|
1813 | + } |
|
1814 | + if ($IMuseExplicitImageOutputDimensions) { |
|
1815 | + if ($this->w && !$this->h) { |
|
1816 | + $this->h = ceil($this->w / ($this->source_width / $this->source_height)); |
|
1817 | + } elseif ($this->h && !$this->w) { |
|
1818 | + $this->w = ceil($this->h * ($this->source_width / $this->source_height)); |
|
1819 | + } |
|
1820 | + } |
|
1821 | + $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement($this->w.'x'.$this->h); |
|
1822 | + } |
|
1823 | + |
|
1824 | + } else { |
|
1825 | + |
|
1826 | + if ($this->iar && ((int) $this->w > 0) && ((int) $this->h > 0)) { |
|
1827 | + |
|
1828 | + list($nw, $nh) = phpthumb_functions::TranslateWHbyAngle($this->w, $this->h, $this->ra); |
|
1829 | + $nw = ((round($nw) != 0) ? round($nw) : ''); |
|
1830 | + $nh = ((round($nh) != 0) ? round($nh) : ''); |
|
1831 | + $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement($nw.'x'.$nh.'!'); |
|
1832 | + |
|
1833 | + } elseif ($this->far && ((int) $this->w > 0) && ((int) $this->h > 0)) { |
|
1834 | + |
|
1835 | + $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement(phpthumb_functions::nonempty_min($this->w, $getimagesize[0]).'x'.phpthumb_functions::nonempty_min($this->h, $getimagesize[1])); |
|
1836 | + $commandline .= ' -gravity center'; |
|
1837 | + $commandline .= ' -background '.phpthumb_functions::escapeshellarg_replacement('#'.$this->bg); |
|
1838 | + $commandline .= ' -extent '.phpthumb_functions::escapeshellarg_replacement($this->w.'x'.$this->h); |
|
1839 | + |
|
1840 | + } else { |
|
1841 | + |
|
1842 | + $this->w = (($this->aoe && $this->w) ? $this->w : ($this->w ? phpthumb_functions::nonempty_min($this->w, $getimagesize[0]) : '')); |
|
1843 | + $this->h = (($this->aoe && $this->h) ? $this->h : ($this->h ? phpthumb_functions::nonempty_min($this->h, $getimagesize[1]) : '')); |
|
1844 | + if ($this->w || $this->h) { |
|
1845 | + if ($IMuseExplicitImageOutputDimensions) { |
|
1846 | + if ($this->w && !$this->h) { |
|
1847 | + $this->h = ceil($this->w / ($this->source_width / $this->source_height)); |
|
1848 | + } elseif ($this->h && !$this->w) { |
|
1849 | + $this->w = ceil($this->h * ($this->source_width / $this->source_height)); |
|
1850 | + } |
|
1851 | + } |
|
1852 | + list($nw, $nh) = phpthumb_functions::TranslateWHbyAngle($this->w, $this->h, $this->ra); |
|
1853 | + $nw = ((round($nw) != 0) ? round($nw) : ''); |
|
1854 | + $nh = ((round($nh) != 0) ? round($nh) : ''); |
|
1855 | + $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement($nw.'x'.$nh); |
|
1856 | + } |
|
1857 | + |
|
1858 | + } |
|
1859 | + } |
|
1860 | + } |
|
1861 | + |
|
1862 | + } else { |
|
1863 | + |
|
1864 | + $this->DebugMessage('getimagesize('.$this->sourceFilename.') failed', __FILE__, __LINE__); |
|
1865 | + if ($this->w || $this->h) { |
|
1866 | + $exactDimensionsBang = (($this->iar && ((int) $this->w > 0) && ((int) $this->h > 0)) ? '!' : ''); |
|
1867 | + if ($IMuseExplicitImageOutputDimensions) { |
|
1868 | + // unknown source aspect ratio, just put large number and hope IM figures it out |
|
1869 | + $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement(($this->w ? $this->w : '9999').'x'.($this->h ? $this->h : '9999').$exactDimensionsBang); |
|
1870 | + } else { |
|
1871 | + $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement($this->w.'x'.$this->h.$exactDimensionsBang); |
|
1872 | + } |
|
1873 | + } |
|
1874 | + |
|
1875 | + } |
|
1876 | + |
|
1877 | + if ($this->ra) { |
|
1878 | + $this->ra = (int) $this->ra; |
|
1879 | + if ($this->ImageMagickSwitchAvailable('rotate')) { |
|
1880 | + if (!preg_match('#('.implode('|', $this->AlphaCapableFormats).')#i', $outputFormat) || phpthumb_functions::version_compare_replacement($this->ImageMagickVersion(), '6.3.7', '>=')) { |
|
1881 | + $this->DebugMessage('Using ImageMagick rotate', __FILE__, __LINE__); |
|
1882 | + $commandline .= ' -rotate '.phpthumb_functions::escapeshellarg_replacement($this->ra); |
|
1883 | + if (($this->ra % 90) != 0) { |
|
1884 | + if (preg_match('#('.implode('|', $this->AlphaCapableFormats).')#i', $outputFormat)) { |
|
1885 | + // alpha-capable format |
|
1886 | + $commandline .= ' -background rgba(255,255,255,0)'; |
|
1887 | + } else { |
|
1888 | + $commandline .= ' -background '.phpthumb_functions::escapeshellarg_replacement('#'.($this->bg ? $this->bg : 'FFFFFF')); |
|
1889 | + } |
|
1890 | + } |
|
1891 | + $this->ra = 0; |
|
1892 | + } else { |
|
1893 | + $this->DebugMessage('Not using ImageMagick rotate because alpha background buggy before v6.3.7', __FILE__, __LINE__); |
|
1894 | + } |
|
1895 | + } else { |
|
1896 | + $this->DebugMessage('Not using ImageMagick rotate because not supported', __FILE__, __LINE__); |
|
1897 | + } |
|
1898 | + } |
|
1899 | + |
|
1900 | + $successfullyProcessedFilters = array(); |
|
1901 | + foreach ($this->fltr as $filterkey => $filtercommand) { |
|
1902 | + @list($command, $parameter) = explode('|', $filtercommand, 2); |
|
1903 | + switch ($command) { |
|
1904 | + case 'brit': |
|
1905 | + if ($this->ImageMagickSwitchAvailable('modulate')) { |
|
1906 | + $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement((100 + (int) $parameter).',100,100'); |
|
1907 | + $successfullyProcessedFilters[] = $filterkey; |
|
1908 | + } |
|
1909 | + break; |
|
1910 | + |
|
1911 | + case 'cont': |
|
1912 | + if ($this->ImageMagickSwitchAvailable('contrast')) { |
|
1913 | + $contDiv10 = round((int) $parameter / 10); |
|
1914 | + if ($contDiv10 > 0) { |
|
1915 | + $contDiv10 = min($contDiv10, 100); |
|
1916 | + for ($i = 0; $i < $contDiv10; $i++) { |
|
1917 | + $commandline .= ' -contrast'; // increase contrast by 10% |
|
1918 | + } |
|
1919 | + } elseif ($contDiv10 < 0) { |
|
1920 | + $contDiv10 = max($contDiv10, -100); |
|
1921 | + for ($i = $contDiv10; $i < 0; $i++) { |
|
1922 | + $commandline .= ' +contrast'; // decrease contrast by 10% |
|
1923 | + } |
|
1924 | + } else { |
|
1925 | + // do nothing |
|
1926 | + } |
|
1927 | + $successfullyProcessedFilters[] = $filterkey; |
|
1928 | + } |
|
1929 | + break; |
|
1930 | + |
|
1931 | + case 'ds': |
|
1932 | + if ($this->ImageMagickSwitchAvailable(array('colorspace', 'modulate'))) { |
|
1933 | + if ($parameter == 100) { |
|
1934 | + $commandline .= ' -colorspace GRAY'; |
|
1935 | + $commandline .= ' -modulate 100,0,100'; |
|
1936 | + } else { |
|
1937 | + $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement('100,'.(100 - (int) $parameter).',100'); |
|
1938 | + } |
|
1939 | + $successfullyProcessedFilters[] = $filterkey; |
|
1940 | + } |
|
1941 | + break; |
|
1942 | + |
|
1943 | + case 'sat': |
|
1944 | + if ($this->ImageMagickSwitchAvailable(array('colorspace', 'modulate'))) { |
|
1945 | + if ($parameter == -100) { |
|
1946 | + $commandline .= ' -colorspace GRAY'; |
|
1947 | + $commandline .= ' -modulate 100,0,100'; |
|
1948 | + } else { |
|
1949 | + $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement('100,'.(100 + (int) $parameter).',100'); |
|
1950 | + } |
|
1951 | + $successfullyProcessedFilters[] = $filterkey; |
|
1952 | + } |
|
1953 | + break; |
|
1954 | + |
|
1955 | + case 'gray': |
|
1956 | + if ($this->ImageMagickSwitchAvailable(array('colorspace', 'modulate'))) { |
|
1957 | + $commandline .= ' -colorspace GRAY'; |
|
1958 | + $commandline .= ' -modulate 100,0,100'; |
|
1959 | + $successfullyProcessedFilters[] = $filterkey; |
|
1960 | + } |
|
1961 | + break; |
|
1962 | + |
|
1963 | + case 'clr': |
|
1964 | + if ($this->ImageMagickSwitchAvailable(array('fill', 'colorize'))) { |
|
1965 | + @list($amount, $color) = explode('|', $parameter); |
|
1966 | + $commandline .= ' -fill '.phpthumb_functions::escapeshellarg_replacement('#'.preg_replace('#[^0-9A-F]#i', '', $color)); |
|
1967 | + $commandline .= ' -colorize '.phpthumb_functions::escapeshellarg_replacement(min(max((int) $amount, 0), 100)); |
|
1968 | + } |
|
1969 | + break; |
|
1970 | + |
|
1971 | + case 'sep': |
|
1972 | + if ($this->ImageMagickSwitchAvailable('sepia-tone')) { |
|
1973 | + @list($amount, $color) = explode('|', $parameter); |
|
1974 | + $amount = ($amount ? $amount : 80); |
|
1975 | + if (!$color) { |
|
1976 | + $commandline .= ' -sepia-tone '.phpthumb_functions::escapeshellarg_replacement(min(max((int) $amount, 0), 100).'%'); |
|
1977 | + $successfullyProcessedFilters[] = $filterkey; |
|
1978 | + } |
|
1979 | + } |
|
1980 | + break; |
|
1981 | + |
|
1982 | + case 'gam': |
|
1983 | + @list($amount) = explode('|', $parameter); |
|
1984 | + $amount = min(max((float) $amount, 0.001), 10); |
|
1985 | + if (number_format($amount, 3) != '1.000') { |
|
1986 | + if ($this->ImageMagickSwitchAvailable('gamma')) { |
|
1987 | + $commandline .= ' -gamma '.phpthumb_functions::escapeshellarg_replacement($amount); |
|
1988 | + $successfullyProcessedFilters[] = $filterkey; |
|
1989 | + } |
|
1990 | + } |
|
1991 | + break; |
|
1992 | + |
|
1993 | + case 'neg': |
|
1994 | + if ($this->ImageMagickSwitchAvailable('negate')) { |
|
1995 | + $commandline .= ' -negate'; |
|
1996 | + $successfullyProcessedFilters[] = $filterkey; |
|
1997 | + } |
|
1998 | + break; |
|
1999 | + |
|
2000 | + case 'th': |
|
2001 | + @list($amount) = explode('|', $parameter); |
|
2002 | + if ($this->ImageMagickSwitchAvailable(array('threshold', 'dither', 'monochrome'))) { |
|
2003 | + $commandline .= ' -threshold '.phpthumb_functions::escapeshellarg_replacement(round(min(max((int) $amount, 0), 255) / 2.55).'%'); |
|
2004 | + $commandline .= ' -dither'; |
|
2005 | + $commandline .= ' -monochrome'; |
|
2006 | + $successfullyProcessedFilters[] = $filterkey; |
|
2007 | + } |
|
2008 | + break; |
|
2009 | + |
|
2010 | + case 'rcd': |
|
2011 | + if ($this->ImageMagickSwitchAvailable(array('colors', 'dither'))) { |
|
2012 | + @list($colors, $dither) = explode('|', $parameter); |
|
2013 | + $colors = ($colors ? (int) $colors : 256); |
|
2014 | + $dither = ((strlen($dither) > 0) ? (bool) $dither : true); |
|
2015 | + $commandline .= ' -colors '.phpthumb_functions::escapeshellarg_replacement(max($colors, 8)); // ImageMagick will otherwise fail with "cannot quantize to fewer than 8 colors" |
|
2016 | + $commandline .= ($dither ? ' -dither' : ' +dither'); |
|
2017 | + $successfullyProcessedFilters[] = $filterkey; |
|
2018 | + } |
|
2019 | + break; |
|
2020 | + |
|
2021 | + case 'flip': |
|
2022 | + if ($this->ImageMagickSwitchAvailable(array('flip', 'flop'))) { |
|
2023 | + if (strpos(strtolower($parameter), 'x') !== false) { |
|
2024 | + $commandline .= ' -flop'; |
|
2025 | + } |
|
2026 | + if (strpos(strtolower($parameter), 'y') !== false) { |
|
2027 | + $commandline .= ' -flip'; |
|
2028 | + } |
|
2029 | + $successfullyProcessedFilters[] = $filterkey; |
|
2030 | + } |
|
2031 | + break; |
|
2032 | + |
|
2033 | + case 'edge': |
|
2034 | + if ($this->ImageMagickSwitchAvailable('edge')) { |
|
2035 | + $parameter = (!empty($parameter) ? $parameter : 2); |
|
2036 | + $commandline .= ' -edge '.phpthumb_functions::escapeshellarg_replacement(!empty($parameter) ? (int) $parameter : 1); |
|
2037 | + $successfullyProcessedFilters[] = $filterkey; |
|
2038 | + } |
|
2039 | + break; |
|
2040 | + |
|
2041 | + case 'emb': |
|
2042 | + if ($this->ImageMagickSwitchAvailable(array('emboss', 'negate'))) { |
|
2043 | + $parameter = (!empty($parameter) ? $parameter : 2); |
|
2044 | + $commandline .= ' -emboss '.phpthumb_functions::escapeshellarg_replacement((int) $parameter); |
|
2045 | + if ($parameter < 2) { |
|
2046 | + $commandline .= ' -negate'; // ImageMagick negates the image for some reason with '-emboss 1'; |
|
2047 | + } |
|
2048 | + $successfullyProcessedFilters[] = $filterkey; |
|
2049 | + } |
|
2050 | + break; |
|
2051 | + |
|
2052 | + case 'lvl': |
|
2053 | + @list($band, $method, $threshold) = explode('|', $parameter); |
|
2054 | + $band = ($band ? preg_replace('#[^RGBA\\*]#', '', strtoupper($band)) : '*'); |
|
2055 | + $method = ((strlen($method) > 0) ? (int) $method : 2); |
|
2056 | + $threshold = ((strlen($threshold) > 0) ? min(max((float) $threshold, 0), 100) : 0.1); |
|
2057 | + |
|
2058 | + $band = preg_replace('#[^RGBA\\*]#', '', strtoupper($band)); |
|
2059 | + |
|
2060 | + if (($method > 1) && !$this->ImageMagickSwitchAvailable(array('channel', 'contrast-stretch'))) { |
|
2061 | + // Because ImageMagick processing happens before PHP-GD filters, and because some |
|
2062 | + // clipping is involved in the "lvl" filter, if "lvl" happens before "wb" then the |
|
2063 | + // "wb" filter will have (almost) no effect. Therefore, if "wb" is enabled then |
|
2064 | + // force the "lvl" filter to be processed by GD, not ImageMagick. |
|
2065 | + foreach ($this->fltr as $fltr_key => $fltr_value) { |
|
2066 | + list($fltr_cmd) = explode('|', $fltr_value); |
|
2067 | + if ($fltr_cmd == 'wb') { |
|
2068 | + $this->DebugMessage('Setting "lvl" filter method to "0" (from "'.$method.'") because white-balance filter also enabled', __FILE__, __LINE__); |
|
2069 | + $method = 0; |
|
2070 | + } |
|
2071 | + } |
|
2072 | + } |
|
2073 | + |
|
2074 | + switch ($method) { |
|
2075 | + case 0: // internal RGB |
|
2076 | + case 1: // internal grayscale |
|
2077 | + break; |
|
2078 | + case 2: // ImageMagick "contrast-stretch" |
|
2079 | + if ($this->ImageMagickSwitchAvailable('contrast-stretch')) { |
|
2080 | + if ($band != '*') { |
|
2081 | + $commandline .= ' -channel '.phpthumb_functions::escapeshellarg_replacement(strtoupper($band)); |
|
2082 | + } |
|
2083 | + $threshold = preg_replace('#[^0-9\\.]#', '', $threshold); // should be unneccesary, but just to be double-sure |
|
2084 | + //$commandline .= ' -contrast-stretch '.phpthumb_functions::escapeshellarg_replacement($threshold.'%'); |
|
2085 | + $commandline .= ' -contrast-stretch \''.$threshold.'%\''; |
|
2086 | + if ($band != '*') { |
|
2087 | + $commandline .= ' +channel'; |
|
2088 | + } |
|
2089 | + $successfullyProcessedFilters[] = $filterkey; |
|
2090 | + } |
|
2091 | + break; |
|
2092 | + case 3: // ImageMagick "normalize" |
|
2093 | + if ($this->ImageMagickSwitchAvailable('normalize')) { |
|
2094 | + if ($band != '*') { |
|
2095 | + $commandline .= ' -channel '.phpthumb_functions::escapeshellarg_replacement(strtoupper($band)); |
|
2096 | + } |
|
2097 | + $commandline .= ' -normalize'; |
|
2098 | + if ($band != '*') { |
|
2099 | + $commandline .= ' +channel'; |
|
2100 | + } |
|
2101 | + $successfullyProcessedFilters[] = $filterkey; |
|
2102 | + } |
|
2103 | + break; |
|
2104 | + default: |
|
2105 | + $this->DebugMessage('unsupported method ('.$method.') for "lvl" filter', __FILE__, __LINE__); |
|
2106 | + break; |
|
2107 | + } |
|
2108 | + if (isset($this->fltr[$filterkey]) && ($method > 1)) { |
|
2109 | + $this->fltr[$filterkey] = $command.'|'.$band.'|0|'.$threshold; |
|
2110 | + $this->DebugMessage('filter "lvl" remapped from method "'.$method.'" to method "0" because ImageMagick support is missing', __FILE__, __LINE__); |
|
2111 | + } |
|
2112 | + break; |
|
2113 | + |
|
2114 | + case 'wb': |
|
2115 | + if ($this->ImageMagickSwitchAvailable(array('channel', 'contrast-stretch'))) { |
|
2116 | + @list($threshold) = explode('|', $parameter); |
|
2117 | + $threshold = (!empty($threshold) ? min(max((float) $threshold, 0), 100) : 0.1); |
|
2118 | + $threshold = preg_replace('#[^0-9\\.]#', '', $threshold); // should be unneccesary, but just to be double-sure |
|
2119 | + //$commandline .= ' -channel R -contrast-stretch '.phpthumb_functions::escapeshellarg_replacement($threshold.'%'); // doesn't work on Windows because most versions of PHP do not properly |
|
2120 | + //$commandline .= ' -channel G -contrast-stretch '.phpthumb_functions::escapeshellarg_replacement($threshold.'%'); // escape special characters (such as %) and just replace them with spaces |
|
2121 | + //$commandline .= ' -channel B -contrast-stretch '.phpthumb_functions::escapeshellarg_replacement($threshold.'%'); // https://bugs.php.net/bug.php?id=43261 |
|
2122 | + $commandline .= ' -channel R -contrast-stretch \''.$threshold.'%\''; |
|
2123 | + $commandline .= ' -channel G -contrast-stretch \''.$threshold.'%\''; |
|
2124 | + $commandline .= ' -channel B -contrast-stretch \''.$threshold.'%\''; |
|
2125 | + $commandline .= ' +channel'; |
|
2126 | + $successfullyProcessedFilters[] = $filterkey; |
|
2127 | + } |
|
2128 | + break; |
|
2129 | + |
|
2130 | + case 'blur': |
|
2131 | + if ($this->ImageMagickSwitchAvailable('blur')) { |
|
2132 | + @list($radius) = explode('|', $parameter); |
|
2133 | + $radius = (!empty($radius) ? min(max((int) $radius, 0), 25) : 1); |
|
2134 | + $commandline .= ' -blur '.phpthumb_functions::escapeshellarg_replacement($radius); |
|
2135 | + $successfullyProcessedFilters[] = $filterkey; |
|
2136 | + } |
|
2137 | + break; |
|
2138 | + |
|
2139 | + case 'gblr': |
|
2140 | + @list($radius) = explode('|', $parameter); |
|
2141 | + $radius = (!empty($radius) ? min(max((int) $radius, 0), 25) : 1); |
|
2142 | + // "-gaussian" changed to "-gaussian-blur" sometime around 2009 |
|
2143 | + if ($this->ImageMagickSwitchAvailable('gaussian-blur')) { |
|
2144 | + $commandline .= ' -gaussian-blur '.phpthumb_functions::escapeshellarg_replacement($radius); |
|
2145 | + $successfullyProcessedFilters[] = $filterkey; |
|
2146 | + } elseif ($this->ImageMagickSwitchAvailable('gaussian')) { |
|
2147 | + $commandline .= ' -gaussian '.phpthumb_functions::escapeshellarg_replacement($radius); |
|
2148 | + $successfullyProcessedFilters[] = $filterkey; |
|
2149 | + } |
|
2150 | + break; |
|
2151 | + |
|
2152 | + case 'usm': |
|
2153 | + if ($this->ImageMagickSwitchAvailable('unsharp')) { |
|
2154 | + @list($amount, $radius, $threshold) = explode('|', $parameter); |
|
2155 | + $amount = ($amount ? min(max((int) $amount, 0), 255) : 80); |
|
2156 | + $radius = ($radius ? min(max((int) $radius, 0), 10) : 0.5); |
|
2157 | + $threshold = (strlen($threshold) ? min(max((int) $threshold, 0), 50) : 3); |
|
2158 | + $commandline .= ' -unsharp '.phpthumb_functions::escapeshellarg_replacement(number_format(($radius * 2) - 1, 2, '.', '').'x1+'.number_format($amount / 100, 2, '.', '').'+'.number_format($threshold / 100, 2, '.', '')); |
|
2159 | + $successfullyProcessedFilters[] = $filterkey; |
|
2160 | + } |
|
2161 | + break; |
|
2162 | + |
|
2163 | + case 'bord': |
|
2164 | + if ($this->ImageMagickSwitchAvailable(array('border', 'bordercolor', 'thumbnail', 'crop'))) { |
|
2165 | + if (!$this->zc) { |
|
2166 | + @list($width, $rX, $rY, $color) = explode('|', $parameter); |
|
2167 | + $width = (int) $width; |
|
2168 | + $rX = (int) $rX; |
|
2169 | + $rY = (int) $rY; |
|
2170 | + if ($width && !$rX && !$rY) { |
|
2171 | + if (!phpthumb_functions::IsHexColor($color)) { |
|
2172 | + $color = ((!empty($this->bc) && phpthumb_functions::IsHexColor($this->bc)) ? $this->bc : '000000'); |
|
2173 | + } |
|
2174 | + $commandline .= ' -border '.phpthumb_functions::escapeshellarg_replacement((int) $width); |
|
2175 | + $commandline .= ' -bordercolor '.phpthumb_functions::escapeshellarg_replacement('#'.$color); |
|
2176 | + |
|
2177 | + if (preg_match('# \\-crop "([0-9]+)x([0-9]+)\\+0\\+0" #', $commandline, $matches)) { |
|
2178 | + $commandline = str_replace(' -crop "'.$matches[1].'x'.$matches[2].'+0+0" ', ' -crop '.phpthumb_functions::escapeshellarg_replacement(($matches[1] - (2 * $width)).'x'.($matches[2] - (2 * $width)).'+0+0').' ', $commandline); |
|
2179 | + } elseif (preg_match('# \\-'.$IMresizeParameter.' "([0-9]+)x([0-9]+)" #', $commandline, $matches)) { |
|
2180 | + $commandline = str_replace(' -'.$IMresizeParameter.' "'.$matches[1].'x'.$matches[2].'" ', ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement(($matches[1] - (2 * $width)).'x'.($matches[2] - (2 * $width))).' ', $commandline); |
|
2181 | + } |
|
2182 | + $successfullyProcessedFilters[] = $filterkey; |
|
2183 | + } |
|
2184 | + } |
|
2185 | + } |
|
2186 | + break; |
|
2187 | + |
|
2188 | + case 'crop': |
|
2189 | + break; |
|
2190 | + |
|
2191 | + case 'sblr': |
|
2192 | + break; |
|
2193 | + |
|
2194 | + case 'mean': |
|
2195 | + break; |
|
2196 | + |
|
2197 | + case 'smth': |
|
2198 | + break; |
|
2199 | + |
|
2200 | + case 'bvl': |
|
2201 | + break; |
|
2202 | + |
|
2203 | + case 'wmi': |
|
2204 | + break; |
|
2205 | + |
|
2206 | + case 'wmt': |
|
2207 | + break; |
|
2208 | + |
|
2209 | + case 'over': |
|
2210 | + break; |
|
2211 | + |
|
2212 | + case 'hist': |
|
2213 | + break; |
|
2214 | + |
|
2215 | + case 'fram': |
|
2216 | + break; |
|
2217 | + |
|
2218 | + case 'drop': |
|
2219 | + break; |
|
2220 | + |
|
2221 | + case 'mask': |
|
2222 | + break; |
|
2223 | + |
|
2224 | + case 'elip': |
|
2225 | + break; |
|
2226 | + |
|
2227 | + case 'ric': |
|
2228 | + break; |
|
2229 | + |
|
2230 | + case 'stc': |
|
2231 | + break; |
|
2232 | + |
|
2233 | + case 'size': |
|
2234 | + break; |
|
2235 | + |
|
2236 | + default: |
|
2237 | + $this->DebugMessage('Unknown $this->fltr['.$filterkey.'] ('.$filtercommand.') -- deleting filter command', __FILE__, __LINE__); |
|
2238 | + $successfullyProcessedFilters[] = $filterkey; |
|
2239 | + break; |
|
2240 | + } |
|
2241 | + if (!isset($this->fltr[$filterkey])) { |
|
2242 | + $this->DebugMessage('Processed $this->fltr['.$filterkey.'] ('.$filtercommand.') with ImageMagick', __FILE__, __LINE__); |
|
2243 | + } else { |
|
2244 | + $this->DebugMessage('Skipping $this->fltr['.$filterkey.'] ('.$filtercommand.') with ImageMagick', __FILE__, __LINE__); |
|
2245 | + } |
|
2246 | + } |
|
2247 | + $this->DebugMessage('Remaining $this->fltr after ImageMagick: ('.$this->phpThumbDebugVarDump($this->fltr).')', __FILE__, __LINE__); |
|
2248 | + if (count($this->fltr) > 0) { |
|
2249 | + $this->useRawIMoutput = false; |
|
2250 | + } |
|
2251 | + |
|
2252 | + if (preg_match('#jpe?g#i', $outputFormat) && $this->q) { |
|
2253 | + if ($this->ImageMagickSwitchAvailable(array('quality', 'interlace'))) { |
|
2254 | + $commandline .= ' -quality '.phpthumb_functions::escapeshellarg_replacement($this->thumbnailQuality); |
|
2255 | + if ($this->config_output_interlace) { |
|
2256 | + // causes weird things with animated GIF... leave for JPEG only |
|
2257 | + $commandline .= ' -interlace line '; // Use Line or Plane to create an interlaced PNG or GIF or progressive JPEG image |
|
2258 | + } |
|
2259 | + } |
|
2260 | + } |
|
2261 | + $commandline .= ' '.$outputFormat.':'.phpthumb_functions::escapeshellarg_replacement($IMtempfilename); |
|
2262 | + if (!$this->iswindows) { |
|
2263 | + $commandline .= ' 2>&1'; |
|
2264 | + } |
|
2265 | + $this->DebugMessage('ImageMagick called as ('.$commandline.')', __FILE__, __LINE__); |
|
2266 | + $IMresult = phpthumb_functions::SafeExec($commandline); |
|
2267 | + clearstatcache(); |
|
2268 | + if (!@file_exists($IMtempfilename) || !@filesize($IMtempfilename)) { |
|
2269 | + $this->FatalError('ImageMagick failed with message ('.trim($IMresult).')'); |
|
2270 | + $this->DebugMessage('ImageMagick failed with message ('.trim($IMresult).')', __FILE__, __LINE__); |
|
2271 | + if ($this->iswindows && !$IMresult) { |
|
2272 | + $this->DebugMessage('Check to make sure that PHP has read+write permissions to "'.dirname($IMtempfilename).'"', __FILE__, __LINE__); |
|
2273 | + } |
|
2274 | + |
|
2275 | + } else { |
|
2276 | + |
|
2277 | + foreach ($successfullyProcessedFilters as $dummy => $filterkey) { |
|
2278 | + unset($this->fltr[$filterkey]); |
|
2279 | + } |
|
2280 | + $this->IMresizedData = file_get_contents($IMtempfilename); |
|
2281 | + $getimagesize_imresized = @getimagesize($IMtempfilename); |
|
2282 | + $this->DebugMessage('getimagesize('.$IMtempfilename.') returned [w='.$getimagesize_imresized[0].';h='.$getimagesize_imresized[1].';f='.$getimagesize_imresized[2].']', __FILE__, __LINE__); |
|
2283 | + if (($this->config_max_source_pixels > 0) && (($getimagesize_imresized[0] * $getimagesize_imresized[1]) > $this->config_max_source_pixels)) { |
|
2284 | + $this->DebugMessage('skipping ImageMagickThumbnailToGD::'.$ImageCreateFunction.'() because IM output is too large ('.$getimagesize_imresized[0].'x'.$getimagesize_imresized[0].' = '.($getimagesize_imresized[0] * $getimagesize_imresized[1]).' > '.$this->config_max_source_pixels.')', __FILE__, __LINE__); |
|
2285 | + } elseif (function_exists(@$ImageCreateFunction) && ($this->gdimg_source = @$ImageCreateFunction($IMtempfilename))) { |
|
2286 | + $this->source_width = imagesx($this->gdimg_source); |
|
2287 | + $this->source_height = imagesy($this->gdimg_source); |
|
2288 | + $this->DebugMessage('ImageMagickThumbnailToGD::'.$ImageCreateFunction.'() succeeded, $this->gdimg_source is now ('.$this->source_width.'x'.$this->source_height.')', __FILE__, __LINE__); |
|
2289 | + $this->DebugMessage('ImageMagickThumbnailToGD() returning $this->IMresizedData ('.strlen($this->IMresizedData).' bytes)', __FILE__, __LINE__); |
|
2290 | + } else { |
|
2291 | + $this->useRawIMoutput = true; |
|
2292 | + $this->DebugMessage('$this->useRawIMoutput set to TRUE because '.@$ImageCreateFunction.'('.$IMtempfilename.') failed', __FILE__, __LINE__); |
|
2293 | + } |
|
2294 | + if (file_exists($IMtempfilename)) { |
|
2295 | + $this->DebugMessage('deleting "'.$IMtempfilename.'"', __FILE__, __LINE__); |
|
2296 | + @unlink($IMtempfilename); |
|
2297 | + } |
|
2298 | + return true; |
|
2299 | + |
|
2300 | + } |
|
2301 | + if (file_exists($IMtempfilename)) { |
|
2302 | + $this->DebugMessage('deleting "'.$IMtempfilename.'"', __FILE__, __LINE__); |
|
2303 | + @unlink($IMtempfilename); |
|
2304 | + } |
|
2305 | + |
|
2306 | + } elseif ($this->issafemode) { |
|
2307 | + $this->DebugMessage('ImageMagickThumbnailToGD() aborting because PHP safe_mode is enabled and phpThumb_tempnam() failed', __FILE__, __LINE__); |
|
2308 | + $this->useRawIMoutput = false; |
|
2309 | + } else { |
|
2310 | + if (file_exists($IMtempfilename)) { |
|
2311 | + $this->DebugMessage('deleting "'.$IMtempfilename.'"', __FILE__, __LINE__); |
|
2312 | + @unlink($IMtempfilename); |
|
2313 | + } |
|
2314 | + $this->DebugMessage('ImageMagickThumbnailToGD() aborting, phpThumb_tempnam() failed', __FILE__, __LINE__); |
|
2315 | + } |
|
2316 | + } else { |
|
2317 | + $this->DebugMessage('ImageMagickThumbnailToGD() aborting because ImageMagickCommandlineBase() failed', __FILE__, __LINE__); |
|
2318 | + } |
|
2319 | + $this->useRawIMoutput = false; |
|
2320 | + return false; |
|
2321 | + } |
|
2322 | + |
|
2323 | + |
|
2324 | + public function Rotate() { |
|
2325 | + if ($this->ra || $this->ar) { |
|
2326 | + if (!function_exists('imagerotate')) { |
|
2327 | + $this->DebugMessage('!function_exists(imagerotate)', __FILE__, __LINE__); |
|
2328 | + return false; |
|
2329 | + } |
|
2330 | + if (!include_once( __DIR__ .'/phpthumb.filters.php')) { |
|
2331 | + $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.filters.php" which is required for applying filters ('.implode(';', $this->fltr).')', __FILE__, __LINE__); |
|
2332 | + return false; |
|
2333 | + } |
|
2334 | + |
|
2335 | + $this->config_background_hexcolor = ($this->bg ? $this->bg : $this->config_background_hexcolor); |
|
2336 | + if (!phpthumb_functions::IsHexColor($this->config_background_hexcolor)) { |
|
2337 | + return $this->ErrorImage('Invalid hex color string "'.$this->config_background_hexcolor.'" for parameter "bg"'); |
|
2338 | + } |
|
2339 | + |
|
2340 | + $rotate_angle = 0; |
|
2341 | + if ($this->ra) { |
|
2342 | + |
|
2343 | + $rotate_angle = (float) $this->ra; |
|
2344 | + |
|
2345 | + } else { |
|
2346 | + |
|
2347 | + if ($this->ar == 'x') { |
|
2348 | + if (phpthumb_functions::version_compare_replacement(PHP_VERSION, '4.2.0', '>=')) { |
|
2349 | + if ($this->sourceFilename) { |
|
2350 | + if (function_exists('exif_read_data')) { |
|
2351 | + if ($exif_data = @exif_read_data($this->sourceFilename, 'IFD0')) { |
|
2352 | + // http://sylvana.net/jpegcrop/exif_orientation.html |
|
2353 | + switch (@$exif_data['Orientation']) { |
|
2354 | + case 1: |
|
2355 | + $rotate_angle = 0; |
|
2356 | + break; |
|
2357 | + case 3: |
|
2358 | + $rotate_angle = 180; |
|
2359 | + break; |
|
2360 | + case 6: |
|
2361 | + $rotate_angle = 270; |
|
2362 | + break; |
|
2363 | + case 8: |
|
2364 | + $rotate_angle = 90; |
|
2365 | + break; |
|
2366 | + |
|
2367 | + default: |
|
2368 | + $this->DebugMessage('EXIF auto-rotate failed because unknown $exif_data[Orientation] "'.@$exif_data['Orientation'].'"', __FILE__, __LINE__); |
|
2369 | + return false; |
|
2370 | + break; |
|
2371 | + } |
|
2372 | + $this->DebugMessage('EXIF auto-rotate set to '.$rotate_angle.' degrees ($exif_data[Orientation] = "'.@$exif_data['Orientation'].'")', __FILE__, __LINE__); |
|
2373 | + } else { |
|
2374 | + $this->DebugMessage('failed: exif_read_data('.$this->sourceFilename.')', __FILE__, __LINE__); |
|
2375 | + return false; |
|
2376 | + } |
|
2377 | + } else { |
|
2378 | + $this->DebugMessage('!function_exists(exif_read_data)', __FILE__, __LINE__); |
|
2379 | + return false; |
|
2380 | + } |
|
2381 | + } else { |
|
2382 | + $this->DebugMessage('Cannot auto-rotate from EXIF data because $this->sourceFilename is empty', __FILE__, __LINE__); |
|
2383 | + return false; |
|
2384 | + } |
|
2385 | + } else { |
|
2386 | + $this->DebugMessage('Cannot auto-rotate from EXIF data because PHP is less than v4.2.0 ('. PHP_VERSION .')', __FILE__, __LINE__); |
|
2387 | + return false; |
|
2388 | + } |
|
2389 | + } elseif (($this->ar == 'l') && ($this->source_height > $this->source_width)) { |
|
2390 | + $rotate_angle = 270; |
|
2391 | + } elseif (($this->ar == 'L') && ($this->source_height > $this->source_width)) { |
|
2392 | + $rotate_angle = 90; |
|
2393 | + } elseif (($this->ar == 'p') && ($this->source_width > $this->source_height)) { |
|
2394 | + $rotate_angle = 90; |
|
2395 | + } elseif (($this->ar == 'P') && ($this->source_width > $this->source_height)) { |
|
2396 | + $rotate_angle = 270; |
|
2397 | + } |
|
2398 | + |
|
2399 | + } |
|
2400 | + if ($rotate_angle % 90) { |
|
2401 | + $this->is_alpha = true; |
|
2402 | + } |
|
2403 | + phpthumb_filters::ImprovedImageRotate($this->gdimg_source, $rotate_angle, $this->config_background_hexcolor, $this->bg, $this); |
|
2404 | + $this->source_width = imagesx($this->gdimg_source); |
|
2405 | + $this->source_height = imagesy($this->gdimg_source); |
|
2406 | + } |
|
2407 | + return true; |
|
2408 | + } |
|
2409 | + |
|
2410 | + |
|
2411 | + public function FixedAspectRatio() { |
|
2412 | + // optional fixed-dimension images (regardless of aspect ratio) |
|
2413 | + |
|
2414 | + if (!$this->far) { |
|
2415 | + // do nothing |
|
2416 | + return true; |
|
2417 | + } |
|
2418 | + |
|
2419 | + if (!$this->w || !$this->h) { |
|
2420 | + return false; |
|
2421 | + } |
|
2422 | + $this->thumbnail_width = $this->w; |
|
2423 | + $this->thumbnail_height = $this->h; |
|
2424 | + $this->is_alpha = true; |
|
2425 | + if ($this->thumbnail_image_width >= $this->thumbnail_width) { |
|
2426 | + |
|
2427 | + $aspectratio = $this->thumbnail_image_height / $this->thumbnail_image_width; |
|
2428 | + if ($this->w) { |
|
2429 | + $this->thumbnail_image_height = round($this->thumbnail_image_width * $aspectratio); |
|
2430 | + $this->thumbnail_height = ($this->h ? $this->h : $this->thumbnail_image_height); |
|
2431 | + } elseif ($this->thumbnail_image_height < $this->thumbnail_height) { |
|
2432 | + $this->thumbnail_image_height = $this->thumbnail_height; |
|
2433 | + $this->thumbnail_image_width = round($this->thumbnail_image_height / $aspectratio); |
|
2434 | + } |
|
2435 | + |
|
2436 | + } else { |
|
2437 | + |
|
2438 | + $aspectratio = $this->thumbnail_image_width / $this->thumbnail_image_height; |
|
2439 | + if ($this->h) { |
|
2440 | + $this->thumbnail_image_width = round($this->thumbnail_image_height * $aspectratio); |
|
2441 | + } elseif ($this->thumbnail_image_width < $this->thumbnail_width) { |
|
2442 | + $this->thumbnail_image_width = $this->thumbnail_width; |
|
2443 | + $this->thumbnail_image_height = round($this->thumbnail_image_width / $aspectratio); |
|
2444 | + } |
|
2445 | + |
|
2446 | + } |
|
2447 | + return true; |
|
2448 | + } |
|
2449 | + |
|
2450 | + |
|
2451 | + public function OffsiteDomainIsAllowed($hostname, $allowed_domains) { |
|
2452 | + static $domain_is_allowed = array(); |
|
2453 | + $hostname = strtolower($hostname); |
|
2454 | + if (!isset($domain_is_allowed[$hostname])) { |
|
2455 | + $domain_is_allowed[$hostname] = false; |
|
2456 | + foreach ($allowed_domains as $valid_domain) { |
|
2457 | + $starpos = strpos($valid_domain, '*'); |
|
2458 | + if ($starpos !== false) { |
|
2459 | + $valid_domain = substr($valid_domain, $starpos + 1); |
|
2460 | + if (preg_match('#'.preg_quote($valid_domain).'$#', $hostname)) { |
|
2461 | + $domain_is_allowed[$hostname] = true; |
|
2462 | + break; |
|
2463 | + } |
|
2464 | + } else { |
|
2465 | + if (strtolower($valid_domain) === $hostname) { |
|
2466 | + $domain_is_allowed[$hostname] = true; |
|
2467 | + break; |
|
2468 | + } |
|
2469 | + } |
|
2470 | + } |
|
2471 | + } |
|
2472 | + return $domain_is_allowed[$hostname]; |
|
2473 | + } |
|
2474 | + |
|
2475 | + |
|
2476 | + public function AntiOffsiteLinking() { |
|
2477 | + // Optional anti-offsite hijacking of the thumbnail script |
|
2478 | + $allow = true; |
|
2479 | + if ($allow && $this->config_nooffsitelink_enabled && (@$_SERVER['HTTP_REFERER'] || $this->config_nooffsitelink_require_refer)) { |
|
2480 | + $this->DebugMessage('AntiOffsiteLinking() checking $_SERVER[HTTP_REFERER] "'.@$_SERVER['HTTP_REFERER'].'"', __FILE__, __LINE__); |
|
2481 | + foreach ($this->config_nooffsitelink_valid_domains as $key => $valid_domain) { |
|
2482 | + // $_SERVER['HTTP_HOST'] contains the port number, so strip it out here to make default configuration work |
|
2483 | + list($clean_domain) = explode(':', $valid_domain); |
|
2484 | + $this->config_nooffsitelink_valid_domains[$key] = $clean_domain; |
|
2485 | + } |
|
2486 | + $parsed_url = phpthumb_functions::ParseURLbetter(@$_SERVER['HTTP_REFERER']); |
|
2487 | + if (!$this->OffsiteDomainIsAllowed(@$parsed_url['host'], $this->config_nooffsitelink_valid_domains)) { |
|
2488 | + $allow = false; |
|
2489 | + //$this->DebugMessage('AntiOffsiteLinking() - "'.@$parsed_url['host'].'" is NOT in $this->config_nooffsitelink_valid_domains ('.implode(';', $this->config_nooffsitelink_valid_domains).')', __FILE__, __LINE__); |
|
2490 | + $this->ErrorImage('AntiOffsiteLinking() - "'.@$parsed_url['host'].'" is NOT in $this->config_nooffsitelink_valid_domains ('.implode(';', $this->config_nooffsitelink_valid_domains).')'); |
|
2491 | + } else { |
|
2492 | + $this->DebugMessage('AntiOffsiteLinking() - "'.@$parsed_url['host'].'" is in $this->config_nooffsitelink_valid_domains ('.implode(';', $this->config_nooffsitelink_valid_domains).')', __FILE__, __LINE__); |
|
2493 | + } |
|
2494 | + } |
|
2495 | + |
|
2496 | + if ($allow && $this->config_nohotlink_enabled && preg_match('#^(f|ht)tps?\://#i', $this->src)) { |
|
2497 | + $parsed_url = phpthumb_functions::ParseURLbetter($this->src); |
|
2498 | + //if (!phpthumb_functions::CaseInsensitiveInArray(@$parsed_url['host'], $this->config_nohotlink_valid_domains)) { |
|
2499 | + if (!$this->OffsiteDomainIsAllowed(@$parsed_url['host'], $this->config_nohotlink_valid_domains)) { |
|
2500 | + // This domain is not allowed |
|
2501 | + $allow = false; |
|
2502 | + $this->DebugMessage('AntiOffsiteLinking() - "'.$parsed_url['host'].'" is NOT in $this->config_nohotlink_valid_domains ('.implode(';', $this->config_nohotlink_valid_domains).')', __FILE__, __LINE__); |
|
2503 | + } else { |
|
2504 | + $this->DebugMessage('AntiOffsiteLinking() - "'.$parsed_url['host'].'" is in $this->config_nohotlink_valid_domains ('.implode(';', $this->config_nohotlink_valid_domains).')', __FILE__, __LINE__); |
|
2505 | + } |
|
2506 | + } |
|
2507 | + |
|
2508 | + if ($allow) { |
|
2509 | + $this->DebugMessage('AntiOffsiteLinking() says this is allowed', __FILE__, __LINE__); |
|
2510 | + return true; |
|
2511 | + } |
|
2512 | + |
|
2513 | + if (!phpthumb_functions::IsHexColor($this->config_error_bgcolor)) { |
|
2514 | + return $this->ErrorImage('Invalid hex color string "'.$this->config_error_bgcolor.'" for $this->config_error_bgcolor'); |
|
2515 | + } |
|
2516 | + if (!phpthumb_functions::IsHexColor($this->config_error_textcolor)) { |
|
2517 | + return $this->ErrorImage('Invalid hex color string "'.$this->config_error_textcolor.'" for $this->config_error_textcolor'); |
|
2518 | + } |
|
2519 | + if ($this->config_nooffsitelink_erase_image) { |
|
2520 | + |
|
2521 | + return $this->ErrorImage($this->config_nooffsitelink_text_message, $this->thumbnail_width, $this->thumbnail_height); |
|
2522 | + |
|
2523 | + } else { |
|
2524 | + |
|
2525 | + $this->config_nooffsitelink_watermark_src = $this->ResolveFilenameToAbsolute($this->config_nooffsitelink_watermark_src); |
|
2526 | + if (is_file($this->config_nooffsitelink_watermark_src)) { |
|
2527 | + |
|
2528 | + if (!include_once( __DIR__ .'/phpthumb.filters.php')) { |
|
2529 | + $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.filters.php" which is required for applying watermark', __FILE__, __LINE__); |
|
2530 | + return false; |
|
2531 | + } |
|
2532 | + $watermark_img = $this->ImageCreateFromStringReplacement(file_get_contents($this->config_nooffsitelink_watermark_src)); |
|
2533 | + $phpthumbFilters = new phpthumb_filters(); |
|
2534 | + $phpthumbFilters->phpThumbObject = &$this; |
|
2535 | + $opacity = 50; |
|
2536 | + $margin = 5; |
|
2537 | + $phpthumbFilters->WatermarkOverlay($this->gdimg_output, $watermark_img, '*', $opacity, $margin); |
|
2538 | + imagedestroy($watermark_img); |
|
2539 | + unset($phpthumbFilters); |
|
2540 | + |
|
2541 | + } else { |
|
2542 | + |
|
2543 | + $nohotlink_text_array = explode("\n", wordwrap($this->config_nooffsitelink_text_message, floor($this->thumbnail_width / imagefontwidth($this->config_error_fontsize)), "\n")); |
|
2544 | + $nohotlink_text_color = phpthumb_functions::ImageHexColorAllocate($this->gdimg_output, $this->config_error_textcolor); |
|
2545 | + |
|
2546 | + $topoffset = round(($this->thumbnail_height - (count($nohotlink_text_array) * imagefontheight($this->config_error_fontsize))) / 2); |
|
2547 | + |
|
2548 | + $rowcounter = 0; |
|
2549 | + $this->DebugMessage('AntiOffsiteLinking() writing '.count($nohotlink_text_array).' lines of text "'.$this->config_nooffsitelink_text_message.'" (in #'.$this->config_error_textcolor.') on top of image', __FILE__, __LINE__); |
|
2550 | + foreach ($nohotlink_text_array as $textline) { |
|
2551 | + $leftoffset = max(0, round(($this->thumbnail_width - (strlen($textline) * imagefontwidth($this->config_error_fontsize))) / 2)); |
|
2552 | + imagestring($this->gdimg_output, $this->config_error_fontsize, $leftoffset, $topoffset + ($rowcounter++ * imagefontheight($this->config_error_fontsize)), $textline, $nohotlink_text_color); |
|
2553 | + } |
|
2554 | + |
|
2555 | + } |
|
2556 | + |
|
2557 | + } |
|
2558 | + return true; |
|
2559 | + } |
|
2560 | + |
|
2561 | + |
|
2562 | + public function AlphaChannelFlatten() { |
|
2563 | + if (!$this->is_alpha) { |
|
2564 | + // image doesn't have alpha transparency, no need to flatten |
|
2565 | + $this->DebugMessage('skipping AlphaChannelFlatten() because !$this->is_alpha', __FILE__, __LINE__); |
|
2566 | + return false; |
|
2567 | + } |
|
2568 | + switch ($this->thumbnailFormat) { |
|
2569 | + case 'png': |
|
2570 | + case 'ico': |
|
2571 | + // image has alpha transparency, but output as PNG or ICO which can handle it |
|
2572 | + $this->DebugMessage('skipping AlphaChannelFlatten() because ($this->thumbnailFormat == "'.$this->thumbnailFormat.'")', __FILE__, __LINE__); |
|
2573 | + return false; |
|
2574 | + break; |
|
2575 | + |
|
2576 | + case 'gif': |
|
2577 | + // image has alpha transparency, but output as GIF which can handle only single-color transparency |
|
2578 | + $CurrentImageColorTransparent = imagecolortransparent($this->gdimg_output); |
|
2579 | + if ($CurrentImageColorTransparent == -1) { |
|
2580 | + // no transparent color defined |
|
2581 | + |
|
2582 | + if (phpthumb_functions::gd_version() < 2.0) { |
|
2583 | + $this->DebugMessage('AlphaChannelFlatten() failed because GD version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2584 | + return false; |
|
2585 | + } |
|
2586 | + |
|
2587 | + if ($img_alpha_mixdown_dither = @imagecreatetruecolor(imagesx($this->gdimg_output), imagesy($this->gdimg_output))) { |
|
2588 | + |
|
2589 | + $dither_color = array(); |
|
2590 | + for ($i = 0; $i <= 255; $i++) { |
|
2591 | + $dither_color[$i] = imagecolorallocate($img_alpha_mixdown_dither, $i, $i, $i); |
|
2592 | + } |
|
2593 | + |
|
2594 | + // scan through current truecolor image copy alpha channel to temp image as grayscale |
|
2595 | + for ($x = 0; $x < $this->thumbnail_width; $x++) { |
|
2596 | + for ($y = 0; $y < $this->thumbnail_height; $y++) { |
|
2597 | + $PixelColor = phpthumb_functions::GetPixelColor($this->gdimg_output, $x, $y); |
|
2598 | + imagesetpixel($img_alpha_mixdown_dither, $x, $y, $dither_color[($PixelColor['alpha'] * 2)]); |
|
2599 | + } |
|
2600 | + } |
|
2601 | + |
|
2602 | + // dither alpha channel grayscale version down to 2 colors |
|
2603 | + imagetruecolortopalette($img_alpha_mixdown_dither, true, 2); |
|
2604 | + |
|
2605 | + // reduce color palette to 256-1 colors (leave one palette position for transparent color) |
|
2606 | + imagetruecolortopalette($this->gdimg_output, true, 255); |
|
2607 | + |
|
2608 | + // allocate a new color for transparent color index |
|
2609 | + $TransparentColor = imagecolorallocate($this->gdimg_output, 1, 254, 253); |
|
2610 | + imagecolortransparent($this->gdimg_output, $TransparentColor); |
|
2611 | + |
|
2612 | + // scan through alpha channel image and note pixels with >50% transparency |
|
2613 | + for ($x = 0; $x < $this->thumbnail_width; $x++) { |
|
2614 | + for ($y = 0; $y < $this->thumbnail_height; $y++) { |
|
2615 | + $AlphaChannelPixel = phpthumb_functions::GetPixelColor($img_alpha_mixdown_dither, $x, $y); |
|
2616 | + if ($AlphaChannelPixel['red'] > 127) { |
|
2617 | + imagesetpixel($this->gdimg_output, $x, $y, $TransparentColor); |
|
2618 | + } |
|
2619 | + } |
|
2620 | + } |
|
2621 | + imagedestroy($img_alpha_mixdown_dither); |
|
2622 | + |
|
2623 | + $this->DebugMessage('AlphaChannelFlatten() set image to 255+1 colors with transparency for GIF output', __FILE__, __LINE__); |
|
2624 | + return true; |
|
2625 | + |
|
2626 | + } else { |
|
2627 | + $this->DebugMessage('AlphaChannelFlatten() failed imagecreate('.imagesx($this->gdimg_output).', '.imagesy($this->gdimg_output).')', __FILE__, __LINE__); |
|
2628 | + return false; |
|
2629 | + } |
|
2630 | + |
|
2631 | + } else { |
|
2632 | + // a single transparent color already defined, leave as-is |
|
2633 | + $this->DebugMessage('skipping AlphaChannelFlatten() because ($this->thumbnailFormat == "'.$this->thumbnailFormat.'") and imagecolortransparent() returned "'.$CurrentImageColorTransparent.'"', __FILE__, __LINE__); |
|
2634 | + return true; |
|
2635 | + } |
|
2636 | + break; |
|
2637 | + } |
|
2638 | + $this->DebugMessage('continuing AlphaChannelFlatten() for output format "'.$this->thumbnailFormat.'"', __FILE__, __LINE__); |
|
2639 | + // image has alpha transparency, and is being output in a format that doesn't support it -- flatten |
|
2640 | + if ($gdimg_flatten_temp = phpthumb_functions::ImageCreateFunction($this->thumbnail_width, $this->thumbnail_height)) { |
|
2641 | + |
|
2642 | + $this->config_background_hexcolor = ($this->bg ? $this->bg : $this->config_background_hexcolor); |
|
2643 | + if (!phpthumb_functions::IsHexColor($this->config_background_hexcolor)) { |
|
2644 | + return $this->ErrorImage('Invalid hex color string "'.$this->config_background_hexcolor.'" for parameter "bg"'); |
|
2645 | + } |
|
2646 | + $background_color = phpthumb_functions::ImageHexColorAllocate($this->gdimg_output, $this->config_background_hexcolor); |
|
2647 | + imagefilledrectangle($gdimg_flatten_temp, 0, 0, $this->thumbnail_width, $this->thumbnail_height, $background_color); |
|
2648 | + imagecopy($gdimg_flatten_temp, $this->gdimg_output, 0, 0, 0, 0, $this->thumbnail_width, $this->thumbnail_height); |
|
2649 | + |
|
2650 | + imagealphablending($this->gdimg_output, true); |
|
2651 | + imagesavealpha($this->gdimg_output, false); |
|
2652 | + imagecolortransparent($this->gdimg_output, -1); |
|
2653 | + imagecopy($this->gdimg_output, $gdimg_flatten_temp, 0, 0, 0, 0, $this->thumbnail_width, $this->thumbnail_height); |
|
2654 | + |
|
2655 | + imagedestroy($gdimg_flatten_temp); |
|
2656 | + return true; |
|
2657 | + |
|
2658 | + } else { |
|
2659 | + $this->DebugMessage('ImageCreateFunction() failed', __FILE__, __LINE__); |
|
2660 | + } |
|
2661 | + return false; |
|
2662 | + } |
|
2663 | + |
|
2664 | + |
|
2665 | + public function ApplyFilters() { |
|
2666 | + if ($this->fltr && is_array($this->fltr)) { |
|
2667 | + if (!include_once( __DIR__ .'/phpthumb.filters.php')) { |
|
2668 | + $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.filters.php" which is required for applying filters ('.implode(';', $this->fltr).')', __FILE__, __LINE__); |
|
2669 | + return false; |
|
2670 | + } |
|
2671 | + $phpthumbFilters = new phpthumb_filters(); |
|
2672 | + $phpthumbFilters->phpThumbObject = &$this; |
|
2673 | + foreach ($this->fltr as $filtercommand) { |
|
2674 | + @list($command, $parameter) = explode('|', $filtercommand, 2); |
|
2675 | + $this->DebugMessage('Attempting to process filter command "'.$command.'('.$parameter.')"', __FILE__, __LINE__); |
|
2676 | + switch ($command) { |
|
2677 | + case 'brit': // Brightness |
|
2678 | + $phpthumbFilters->Brightness($this->gdimg_output, $parameter); |
|
2679 | + break; |
|
2680 | + |
|
2681 | + case 'cont': // Contrast |
|
2682 | + $phpthumbFilters->Contrast($this->gdimg_output, $parameter); |
|
2683 | + break; |
|
2684 | + |
|
2685 | + case 'ds': // Desaturation |
|
2686 | + $phpthumbFilters->Desaturate($this->gdimg_output, $parameter, ''); |
|
2687 | + break; |
|
2688 | + |
|
2689 | + case 'sat': // Saturation |
|
2690 | + $phpthumbFilters->Saturation($this->gdimg_output, $parameter, ''); |
|
2691 | + break; |
|
2692 | + |
|
2693 | + case 'gray': // Grayscale |
|
2694 | + $phpthumbFilters->Grayscale($this->gdimg_output); |
|
2695 | + break; |
|
2696 | + |
|
2697 | + case 'clr': // Colorize |
|
2698 | + if (phpthumb_functions::gd_version() < 2) { |
|
2699 | + $this->DebugMessage('Skipping Colorize() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2700 | + break; |
|
2701 | + } |
|
2702 | + @list($amount, $color) = explode('|', $parameter, 2); |
|
2703 | + $phpthumbFilters->Colorize($this->gdimg_output, $amount, $color); |
|
2704 | + break; |
|
2705 | + |
|
2706 | + case 'sep': // Sepia |
|
2707 | + if (phpthumb_functions::gd_version() < 2) { |
|
2708 | + $this->DebugMessage('Skipping Sepia() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2709 | + break; |
|
2710 | + } |
|
2711 | + @list($amount, $color) = explode('|', $parameter, 2); |
|
2712 | + $phpthumbFilters->Sepia($this->gdimg_output, $amount, $color); |
|
2713 | + break; |
|
2714 | + |
|
2715 | + case 'gam': // Gamma correction |
|
2716 | + $phpthumbFilters->Gamma($this->gdimg_output, $parameter); |
|
2717 | + break; |
|
2718 | + |
|
2719 | + case 'neg': // Negative colors |
|
2720 | + $phpthumbFilters->Negative($this->gdimg_output); |
|
2721 | + break; |
|
2722 | + |
|
2723 | + case 'th': // Threshold |
|
2724 | + $phpthumbFilters->Threshold($this->gdimg_output, $parameter); |
|
2725 | + break; |
|
2726 | + |
|
2727 | + case 'rcd': // ReduceColorDepth |
|
2728 | + if (phpthumb_functions::gd_version() < 2) { |
|
2729 | + $this->DebugMessage('Skipping ReduceColorDepth() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2730 | + break; |
|
2731 | + } |
|
2732 | + @list($colors, $dither) = explode('|', $parameter, 2); |
|
2733 | + $colors = ($colors ? (int) $colors : 256); |
|
2734 | + $dither = ((strlen($dither) > 0) ? (bool) $dither : true); |
|
2735 | + $phpthumbFilters->ReduceColorDepth($this->gdimg_output, $colors, $dither); |
|
2736 | + break; |
|
2737 | + |
|
2738 | + case 'flip': // Flip |
|
2739 | + $phpthumbFilters->Flip($this->gdimg_output, (strpos(strtolower($parameter), 'x') !== false), (strpos(strtolower($parameter), 'y') !== false)); |
|
2740 | + break; |
|
2741 | + |
|
2742 | + case 'edge': // EdgeDetect |
|
2743 | + $phpthumbFilters->EdgeDetect($this->gdimg_output); |
|
2744 | + break; |
|
2745 | + |
|
2746 | + case 'emb': // Emboss |
|
2747 | + $phpthumbFilters->Emboss($this->gdimg_output); |
|
2748 | + break; |
|
2749 | + |
|
2750 | + case 'bvl': // Bevel |
|
2751 | + @list($width, $color1, $color2) = explode('|', $parameter, 3); |
|
2752 | + $phpthumbFilters->Bevel($this->gdimg_output, $width, $color1, $color2); |
|
2753 | + break; |
|
2754 | + |
|
2755 | + case 'lvl': // autoLevels |
|
2756 | + @list($band, $method, $threshold) = explode('|', $parameter, 3); |
|
2757 | + $band = ($band ? preg_replace('#[^RGBA\\*]#', '', strtoupper($band)) : '*'); |
|
2758 | + $method = ((strlen($method) > 0) ? (int) $method : 2); |
|
2759 | + $threshold = ((strlen($threshold) > 0) ? (float) $threshold : 0.1); |
|
2760 | + |
|
2761 | + $phpthumbFilters->HistogramStretch($this->gdimg_output, $band, $method, $threshold); |
|
2762 | + break; |
|
2763 | + |
|
2764 | + case 'wb': // WhiteBalance |
|
2765 | + $phpthumbFilters->WhiteBalance($this->gdimg_output, $parameter); |
|
2766 | + break; |
|
2767 | + |
|
2768 | + case 'hist': // Histogram overlay |
|
2769 | + if (phpthumb_functions::gd_version() < 2) { |
|
2770 | + $this->DebugMessage('Skipping HistogramOverlay() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2771 | + break; |
|
2772 | + } |
|
2773 | + @list($bands, $colors, $width, $height, $alignment, $opacity, $margin_x, $margin_y) = explode('|', $parameter, 8); |
|
2774 | + $bands = ($bands ? $bands : '*'); |
|
2775 | + $colors = ($colors ? $colors : ''); |
|
2776 | + $width = ($width ? $width : 0.25); |
|
2777 | + $height = ($height ? $height : 0.25); |
|
2778 | + $alignment = ($alignment ? $alignment : 'BR'); |
|
2779 | + $opacity = ($opacity ? $opacity : 50); |
|
2780 | + $margin_x = ($margin_x ? $margin_x : 5); |
|
2781 | + // $margin_y -- it wasn't forgotten, let the value always pass unchanged |
|
2782 | + $phpthumbFilters->HistogramOverlay($this->gdimg_output, $bands, $colors, $width, $height, $alignment, $opacity, $margin_x, $margin_y); |
|
2783 | + break; |
|
2784 | + |
|
2785 | + case 'fram': // Frame |
|
2786 | + @list($frame_width, $edge_width, $color_frame, $color1, $color2) = explode('|', $parameter, 5); |
|
2787 | + $phpthumbFilters->Frame($this->gdimg_output, $frame_width, $edge_width, $color_frame, $color1, $color2); |
|
2788 | + break; |
|
2789 | + |
|
2790 | + case 'drop': // DropShadow |
|
2791 | + if (phpthumb_functions::gd_version() < 2) { |
|
2792 | + $this->DebugMessage('Skipping DropShadow() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2793 | + return false; |
|
2794 | + } |
|
2795 | + $this->is_alpha = true; |
|
2796 | + @list($distance, $width, $color, $angle, $fade) = explode('|', $parameter, 5); |
|
2797 | + $phpthumbFilters->DropShadow($this->gdimg_output, $distance, $width, $color, $angle, $fade); |
|
2798 | + break; |
|
2799 | + |
|
2800 | + case 'mask': // Mask cropping |
|
2801 | + if (phpthumb_functions::gd_version() < 2) { |
|
2802 | + $this->DebugMessage('Skipping Mask() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2803 | + return false; |
|
2804 | + } |
|
2805 | + @list($mask_filename, $invert) = explode('|', $parameter, 2); |
|
2806 | + $mask_filename = $this->ResolveFilenameToAbsolute($mask_filename); |
|
2807 | + if (@is_readable($mask_filename) && ($fp_mask = @fopen($mask_filename, 'rb'))) { |
|
2808 | + $MaskImageData = ''; |
|
2809 | + do { |
|
2810 | + $buffer = fread($fp_mask, 8192); |
|
2811 | + $MaskImageData .= $buffer; |
|
2812 | + } while (strlen($buffer) > 0); |
|
2813 | + fclose($fp_mask); |
|
2814 | + if ($gdimg_mask = $this->ImageCreateFromStringReplacement($MaskImageData)) { |
|
2815 | + if ($invert && phpthumb_functions::version_compare_replacement(PHP_VERSION, '5.0.0', '>=') && phpthumb_functions::gd_is_bundled()) { |
|
2816 | + imagefilter($gdimg_mask, IMG_FILTER_NEGATE); |
|
2817 | + } |
|
2818 | + $this->is_alpha = true; |
|
2819 | + $phpthumbFilters->ApplyMask($gdimg_mask, $this->gdimg_output); |
|
2820 | + imagedestroy($gdimg_mask); |
|
2821 | + } else { |
|
2822 | + $this->DebugMessage('ImageCreateFromStringReplacement() failed for "'.$mask_filename.'"', __FILE__, __LINE__); |
|
2823 | + } |
|
2824 | + } else { |
|
2825 | + $this->DebugMessage('Cannot open mask file "'.$mask_filename.'"', __FILE__, __LINE__); |
|
2826 | + } |
|
2827 | + break; |
|
2828 | + |
|
2829 | + case 'elip': // Ellipse cropping |
|
2830 | + if (phpthumb_functions::gd_version() < 2) { |
|
2831 | + $this->DebugMessage('Skipping Ellipse() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2832 | + return false; |
|
2833 | + } |
|
2834 | + $this->is_alpha = true; |
|
2835 | + $phpthumbFilters->Ellipse($this->gdimg_output); |
|
2836 | + break; |
|
2837 | + |
|
2838 | + case 'ric': // RoundedImageCorners |
|
2839 | + if (phpthumb_functions::gd_version() < 2) { |
|
2840 | + $this->DebugMessage('Skipping RoundedImageCorners() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
2841 | + return false; |
|
2842 | + } |
|
2843 | + @list($radius_x, $radius_y) = explode('|', $parameter, 2); |
|
2844 | + if (($radius_x < 1) || ($radius_y < 1)) { |
|
2845 | + $this->DebugMessage('Skipping RoundedImageCorners('.$radius_x.', '.$radius_y.') because x/y radius is less than 1', __FILE__, __LINE__); |
|
2846 | + break; |
|
2847 | + } |
|
2848 | + $this->is_alpha = true; |
|
2849 | + $phpthumbFilters->RoundedImageCorners($this->gdimg_output, $radius_x, $radius_y); |
|
2850 | + break; |
|
2851 | + |
|
2852 | + case 'crop': // Crop |
|
2853 | + @list($left, $right, $top, $bottom) = explode('|', $parameter, 4); |
|
2854 | + $phpthumbFilters->Crop($this->gdimg_output, $left, $right, $top, $bottom); |
|
2855 | + break; |
|
2856 | + |
|
2857 | + case 'bord': // Border |
|
2858 | + @list($border_width, $radius_x, $radius_y, $hexcolor_border) = explode('|', $parameter, 4); |
|
2859 | + $this->is_alpha = true; |
|
2860 | + $phpthumbFilters->ImageBorder($this->gdimg_output, $border_width, $radius_x, $radius_y, $hexcolor_border); |
|
2861 | + break; |
|
2862 | + |
|
2863 | + case 'over': // Overlay |
|
2864 | + @list($filename, $underlay, $margin, $opacity) = explode('|', $parameter, 4); |
|
2865 | + $underlay = (bool) ($underlay ? $underlay : false); |
|
2866 | + $margin = ((strlen($margin) > 0) ? $margin : ($underlay ? 0.1 : 0.0)); |
|
2867 | + $opacity = ((strlen($opacity) > 0) ? $opacity : 100); |
|
2868 | + if (($margin > 0) && ($margin < 1)) { |
|
2869 | + $margin = min(0.499, $margin); |
|
2870 | + } elseif (($margin > -1) && ($margin < 0)) { |
|
2871 | + $margin = max(-0.499, $margin); |
|
2872 | + } |
|
2873 | + |
|
2874 | + $filename = $this->ResolveFilenameToAbsolute($filename); |
|
2875 | + if (@is_readable($filename) && ($fp_watermark = @fopen($filename, 'rb'))) { |
|
2876 | + $WatermarkImageData = ''; |
|
2877 | + do { |
|
2878 | + $buffer = fread($fp_watermark, 8192); |
|
2879 | + $WatermarkImageData .= $buffer; |
|
2880 | + } while (strlen($buffer) > 0); |
|
2881 | + fclose($fp_watermark); |
|
2882 | + if ($img_watermark = $this->ImageCreateFromStringReplacement($WatermarkImageData)) { |
|
2883 | + if (($margin > 0) && ($margin < 1)) { |
|
2884 | + $resized_x = max(1, imagesx($this->gdimg_output) - round(2 * (imagesx($this->gdimg_output) * $margin))); |
|
2885 | + $resized_y = max(1, imagesy($this->gdimg_output) - round(2 * (imagesy($this->gdimg_output) * $margin))); |
|
2886 | + } else { |
|
2887 | + $resized_x = max(1, imagesx($this->gdimg_output) - round(2 * $margin)); |
|
2888 | + $resized_y = max(1, imagesy($this->gdimg_output) - round(2 * $margin)); |
|
2889 | + } |
|
2890 | + |
|
2891 | + if ($underlay) { |
|
2892 | + |
|
2893 | + if ($img_watermark_resized = phpthumb_functions::ImageCreateFunction(imagesx($this->gdimg_output), imagesy($this->gdimg_output))) { |
|
2894 | + imagealphablending($img_watermark_resized, false); |
|
2895 | + imagesavealpha($img_watermark_resized, true); |
|
2896 | + $this->ImageResizeFunction($img_watermark_resized, $img_watermark, 0, 0, 0, 0, imagesx($img_watermark_resized), imagesy($img_watermark_resized), imagesx($img_watermark), imagesy($img_watermark)); |
|
2897 | + if ($img_source_resized = phpthumb_functions::ImageCreateFunction($resized_x, $resized_y)) { |
|
2898 | + imagealphablending($img_source_resized, false); |
|
2899 | + imagesavealpha($img_source_resized, true); |
|
2900 | + $this->ImageResizeFunction($img_source_resized, $this->gdimg_output, 0, 0, 0, 0, imagesx($img_source_resized), imagesy($img_source_resized), imagesx($this->gdimg_output), imagesy($this->gdimg_output)); |
|
2901 | + $phpthumbFilters->WatermarkOverlay($img_watermark_resized, $img_source_resized, 'C', $opacity, $margin); |
|
2902 | + imagecopy($this->gdimg_output, $img_watermark_resized, 0, 0, 0, 0, imagesx($this->gdimg_output), imagesy($this->gdimg_output)); |
|
2903 | + } else { |
|
2904 | + $this->DebugMessage('phpthumb_functions::ImageCreateFunction('.$resized_x.', '.$resized_y.')', __FILE__, __LINE__); |
|
2905 | + } |
|
2906 | + imagedestroy($img_watermark_resized); |
|
2907 | + } else { |
|
2908 | + $this->DebugMessage('phpthumb_functions::ImageCreateFunction('.imagesx($this->gdimg_output).', '.imagesy($this->gdimg_output).')', __FILE__, __LINE__); |
|
2909 | + } |
|
2910 | + |
|
2911 | + } else { // overlay |
|
2912 | + |
|
2913 | + if ($img_watermark_resized = phpthumb_functions::ImageCreateFunction($resized_x, $resized_y)) { |
|
2914 | + imagealphablending($img_watermark_resized, false); |
|
2915 | + imagesavealpha($img_watermark_resized, true); |
|
2916 | + $this->ImageResizeFunction($img_watermark_resized, $img_watermark, 0, 0, 0, 0, imagesx($img_watermark_resized), imagesy($img_watermark_resized), imagesx($img_watermark), imagesy($img_watermark)); |
|
2917 | + $phpthumbFilters->WatermarkOverlay($this->gdimg_output, $img_watermark_resized, 'C', $opacity, $margin); |
|
2918 | + imagedestroy($img_watermark_resized); |
|
2919 | + } else { |
|
2920 | + $this->DebugMessage('phpthumb_functions::ImageCreateFunction('.$resized_x.', '.$resized_y.')', __FILE__, __LINE__); |
|
2921 | + } |
|
2922 | + |
|
2923 | + } |
|
2924 | + imagedestroy($img_watermark); |
|
2925 | + |
|
2926 | + } else { |
|
2927 | + $this->DebugMessage('ImageCreateFromStringReplacement() failed for "'.$filename.'"', __FILE__, __LINE__); |
|
2928 | + } |
|
2929 | + } else { |
|
2930 | + $this->DebugMessage('Cannot open overlay file "'.$filename.'"', __FILE__, __LINE__); |
|
2931 | + } |
|
2932 | + break; |
|
2933 | + |
|
2934 | + case 'wmi': // WaterMarkImage |
|
2935 | + @list($filename, $alignment, $opacity, $margin['x'], $margin['y'], $rotate_angle) = explode('|', $parameter, 6); |
|
2936 | + // $margin can be pixel margin or percent margin if $alignment is text, or max width/height if $alignment is position like "50x75" |
|
2937 | + $alignment = ($alignment ? $alignment : 'BR'); |
|
2938 | + $opacity = (strlen($opacity) ? (int) $opacity : 50); |
|
2939 | + $rotate_angle = (strlen($rotate_angle) ? (int) $rotate_angle : 0); |
|
2940 | + if (!preg_match('#^([0-9\\.\\-]*)x([0-9\\.\\-]*)$#i', $alignment, $matches)) { |
|
2941 | + $margins = array('x', 'y'); |
|
2942 | + foreach ($margins as $xy) { |
|
2943 | + $margin[$xy] = (strlen($margin[$xy]) ? $margin[$xy] : 5); |
|
2944 | + if (($margin[$xy] > 0) && ($margin[$xy] < 1)) { |
|
2945 | + $margin[$xy] = min(0.499, $margin[$xy]); |
|
2946 | + } elseif (($margin[$xy] > -1) && ($margin[$xy] < 0)) { |
|
2947 | + $margin[$xy] = max(-0.499, $margin[$xy]); |
|
2948 | + } |
|
2949 | + } |
|
2950 | + } |
|
2951 | + |
|
2952 | + $filename = $this->ResolveFilenameToAbsolute($filename); |
|
2953 | + if (@is_readable($filename)) { |
|
2954 | + if ($img_watermark = $this->ImageCreateFromFilename($filename)) { |
|
2955 | + if ($rotate_angle !== 0) { |
|
2956 | + $phpthumbFilters->ImprovedImageRotate($img_watermark, $rotate_angle, 'FFFFFF', null, $this); |
|
2957 | + } |
|
2958 | + if (preg_match('#^([0-9\\.\\-]*)x([0-9\\.\\-]*)$#i', $alignment, $matches)) { |
|
2959 | + $watermark_max_width = (int) ($margin[ 'x'] ? $margin[ 'x'] : imagesx($img_watermark)); |
|
2960 | + $watermark_max_height = (int) ($margin[ 'y'] ? $margin[ 'y'] : imagesy($img_watermark)); |
|
2961 | + $scale = phpthumb_functions::ScaleToFitInBox(imagesx($img_watermark), imagesy($img_watermark), $watermark_max_width, $watermark_max_height, true, true); |
|
2962 | + $this->DebugMessage('Scaling watermark by a factor of '.number_format($scale, 4), __FILE__, __LINE__); |
|
2963 | + if (($scale > 1) || ($scale < 1)) { |
|
2964 | + if ($img_watermark2 = phpthumb_functions::ImageCreateFunction($scale * imagesx($img_watermark), $scale * imagesy($img_watermark))) { |
|
2965 | + imagealphablending($img_watermark2, false); |
|
2966 | + imagesavealpha($img_watermark2, true); |
|
2967 | + $this->ImageResizeFunction($img_watermark2, $img_watermark, 0, 0, 0, 0, imagesx($img_watermark2), imagesy($img_watermark2), imagesx($img_watermark), imagesy($img_watermark)); |
|
2968 | + $img_watermark = $img_watermark2; |
|
2969 | + } else { |
|
2970 | + $this->DebugMessage('ImageCreateFunction('.($scale * imagesx($img_watermark)).', '.($scale * imagesx($img_watermark)).') failed', __FILE__, __LINE__); |
|
2971 | + } |
|
2972 | + } |
|
2973 | + $watermark_dest_x = round($matches[1] - (imagesx($img_watermark) / 2)); |
|
2974 | + $watermark_dest_y = round($matches[2] - (imagesy($img_watermark) / 2)); |
|
2975 | + $alignment = $watermark_dest_x.'x'.$watermark_dest_y; |
|
2976 | + } |
|
2977 | + $phpthumbFilters->WatermarkOverlay($this->gdimg_output, $img_watermark, $alignment, $opacity, $margin['x'], $margin['y']); |
|
2978 | + imagedestroy($img_watermark); |
|
2979 | + if (isset($img_watermark2) && is_resource($img_watermark2)) { |
|
2980 | + imagedestroy($img_watermark2); |
|
2981 | + } |
|
2982 | + } else { |
|
2983 | + $this->DebugMessage('ImageCreateFromFilename() failed for "'.$filename.'"', __FILE__, __LINE__); |
|
2984 | + } |
|
2985 | + } else { |
|
2986 | + $this->DebugMessage('!is_readable('.$filename.')', __FILE__, __LINE__); |
|
2987 | + } |
|
2988 | + break; |
|
2989 | + |
|
2990 | + case 'wmt': // WaterMarkText |
|
2991 | + @list($text, $size, $alignment, $hex_color, $ttffont, $opacity, $margin, $angle, $bg_color, $bg_opacity, $fillextend, $lineheight) = explode('|', $parameter, 12); |
|
2992 | + $text = ($text ? $text : ''); |
|
2993 | + $size = ($size ? $size : 3); |
|
2994 | + $alignment = ($alignment ? $alignment : 'BR'); |
|
2995 | + $hex_color = ($hex_color ? $hex_color : '000000'); |
|
2996 | + $ttffont = ($ttffont ? $ttffont : ''); |
|
2997 | + $opacity = (strlen($opacity) ? $opacity : 50); |
|
2998 | + $margin = (strlen($margin) ? $margin : 5); |
|
2999 | + $angle = (strlen($angle) ? $angle : 0); |
|
3000 | + $bg_color = ($bg_color ? $bg_color : false); |
|
3001 | + $bg_opacity = ($bg_opacity ? $bg_opacity : 0); |
|
3002 | + $fillextend = ($fillextend ? $fillextend : ''); |
|
3003 | + $lineheight = ($lineheight ? $lineheight : 1.0); |
|
3004 | + |
|
3005 | + if (basename($ttffont) == $ttffont) { |
|
3006 | + $ttffont = $this->realPathSafe($this->config_ttf_directory.DIRECTORY_SEPARATOR.$ttffont); |
|
3007 | + } else { |
|
3008 | + $ttffont = $this->ResolveFilenameToAbsolute($ttffont); |
|
3009 | + } |
|
3010 | + $phpthumbFilters->WatermarkText($this->gdimg_output, $text, $size, $alignment, $hex_color, $ttffont, $opacity, $margin, $angle, $bg_color, $bg_opacity, $fillextend, $lineheight); |
|
3011 | + break; |
|
3012 | + |
|
3013 | + case 'blur': // Blur |
|
3014 | + @list($radius) = explode('|', $parameter, 1); |
|
3015 | + $radius = ($radius ? $radius : 1); |
|
3016 | + if (phpthumb_functions::gd_version() >= 2) { |
|
3017 | + $phpthumbFilters->Blur($this->gdimg_output, $radius); |
|
3018 | + } else { |
|
3019 | + $this->DebugMessage('Skipping Blur() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
3020 | + } |
|
3021 | + break; |
|
3022 | + |
|
3023 | + case 'gblr': // Gaussian Blur |
|
3024 | + $phpthumbFilters->BlurGaussian($this->gdimg_output); |
|
3025 | + break; |
|
3026 | + |
|
3027 | + case 'sblr': // Selective Blur |
|
3028 | + $phpthumbFilters->BlurSelective($this->gdimg_output); |
|
3029 | + break; |
|
3030 | + |
|
3031 | + case 'mean': // MeanRemoval blur |
|
3032 | + $phpthumbFilters->MeanRemoval($this->gdimg_output); |
|
3033 | + break; |
|
3034 | + |
|
3035 | + case 'smth': // Smooth blur |
|
3036 | + $phpthumbFilters->Smooth($this->gdimg_output, $parameter); |
|
3037 | + break; |
|
3038 | + |
|
3039 | + case 'usm': // UnSharpMask sharpening |
|
3040 | + @list($amount, $radius, $threshold) = explode('|', $parameter, 3); |
|
3041 | + $amount = ($amount ? $amount : 80); |
|
3042 | + $radius = ($radius ? $radius : 0.5); |
|
3043 | + $threshold = (strlen($threshold) ? $threshold : 3); |
|
3044 | + if (phpthumb_functions::gd_version() >= 2.0) { |
|
3045 | + ob_start(); |
|
3046 | + if (!@include_once( __DIR__ .'/phpthumb.unsharp.php')) { |
|
3047 | + $include_error = ob_get_contents(); |
|
3048 | + if ($include_error) { |
|
3049 | + $this->DebugMessage('include_once("'. __DIR__ .'/phpthumb.unsharp.php") generated message: "'.$include_error.'"', __FILE__, __LINE__); |
|
3050 | + } |
|
3051 | + $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.unsharp.php" which is required for unsharp masking', __FILE__, __LINE__); |
|
3052 | + ob_end_clean(); |
|
3053 | + return false; |
|
3054 | + } |
|
3055 | + ob_end_clean(); |
|
3056 | + phpUnsharpMask::applyUnsharpMask($this->gdimg_output, $amount, $radius, $threshold); |
|
3057 | + } else { |
|
3058 | + $this->DebugMessage('Skipping unsharp mask because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
3059 | + return false; |
|
3060 | + } |
|
3061 | + break; |
|
3062 | + |
|
3063 | + case 'size': // Resize |
|
3064 | + @list($newwidth, $newheight, $stretch) = explode('|', $parameter); |
|
3065 | + $newwidth = (!$newwidth ? imagesx($this->gdimg_output) : ((($newwidth > 0) && ($newwidth < 1)) ? round($newwidth * imagesx($this->gdimg_output)) : round($newwidth))); |
|
3066 | + $newheight = (!$newheight ? imagesy($this->gdimg_output) : ((($newheight > 0) && ($newheight < 1)) ? round($newheight * imagesy($this->gdimg_output)) : round($newheight))); |
|
3067 | + $stretch = ($stretch ? true : false); |
|
3068 | + if ($stretch) { |
|
3069 | + $scale_x = phpthumb_functions::ScaleToFitInBox(imagesx($this->gdimg_output), imagesx($this->gdimg_output), $newwidth, $newwidth, true, true); |
|
3070 | + $scale_y = phpthumb_functions::ScaleToFitInBox(imagesy($this->gdimg_output), imagesy($this->gdimg_output), $newheight, $newheight, true, true); |
|
3071 | + } else { |
|
3072 | + $scale_x = phpthumb_functions::ScaleToFitInBox(imagesx($this->gdimg_output), imagesy($this->gdimg_output), $newwidth, $newheight, true, true); |
|
3073 | + $scale_y = $scale_x; |
|
3074 | + } |
|
3075 | + $this->DebugMessage('Scaling watermark ('.($stretch ? 'with' : 'without').' stretch) by a factor of "'.number_format($scale_x, 4).' x '.number_format($scale_y, 4).'"', __FILE__, __LINE__); |
|
3076 | + if (($scale_x > 1) || ($scale_x < 1) || ($scale_y > 1) || ($scale_y < 1)) { |
|
3077 | + if ($img_temp = phpthumb_functions::ImageCreateFunction(imagesx($this->gdimg_output), imagesy($this->gdimg_output))) { |
|
3078 | + imagecopy($img_temp, $this->gdimg_output, 0, 0, 0, 0, imagesx($this->gdimg_output), imagesy($this->gdimg_output)); |
|
3079 | + if ($this->gdimg_output = phpthumb_functions::ImageCreateFunction($scale_x * imagesx($img_temp), $scale_y * imagesy($img_temp))) { |
|
3080 | + imagealphablending($this->gdimg_output, false); |
|
3081 | + imagesavealpha($this->gdimg_output, true); |
|
3082 | + $this->ImageResizeFunction($this->gdimg_output, $img_temp, 0, 0, 0, 0, imagesx($this->gdimg_output), imagesy($this->gdimg_output), imagesx($img_temp), imagesy($img_temp)); |
|
3083 | + } else { |
|
3084 | + $this->DebugMessage('ImageCreateFunction('.($scale_x * imagesx($img_temp)).', '.($scale_y * imagesy($img_temp)).') failed', __FILE__, __LINE__); |
|
3085 | + } |
|
3086 | + imagedestroy($img_temp); |
|
3087 | + } else { |
|
3088 | + $this->DebugMessage('ImageCreateFunction('.imagesx($this->gdimg_output).', '.imagesy($this->gdimg_output).') failed', __FILE__, __LINE__); |
|
3089 | + } |
|
3090 | + } |
|
3091 | + break; |
|
3092 | + |
|
3093 | + case 'rot': // ROTate |
|
3094 | + @list($angle, $bgcolor) = explode('|', $parameter, 2); |
|
3095 | + $phpthumbFilters->ImprovedImageRotate($this->gdimg_output, $angle, $bgcolor, null, $this); |
|
3096 | + break; |
|
3097 | + |
|
3098 | + case 'stc': // Source Transparent Color |
|
3099 | + @list($hexcolor, $min_limit, $max_limit) = explode('|', $parameter, 3); |
|
3100 | + if (!phpthumb_functions::IsHexColor($hexcolor)) { |
|
3101 | + $this->DebugMessage('Skipping SourceTransparentColor hex color is invalid ('.$hexcolor.')', __FILE__, __LINE__); |
|
3102 | + return false; |
|
3103 | + } |
|
3104 | + $min_limit = (strlen($min_limit) ? $min_limit : 5); |
|
3105 | + $max_limit = (strlen($max_limit) ? $max_limit : 10); |
|
3106 | + if ($gdimg_mask = $phpthumbFilters->SourceTransparentColorMask($this->gdimg_output, $hexcolor, $min_limit, $max_limit)) { |
|
3107 | + $this->is_alpha = true; |
|
3108 | + $phpthumbFilters->ApplyMask($gdimg_mask, $this->gdimg_output); |
|
3109 | + imagedestroy($gdimg_mask); |
|
3110 | + } else { |
|
3111 | + $this->DebugMessage('SourceTransparentColorMask() failed for "'.$hexcolor.','.$min_limit.','.$max_limit.'"', __FILE__, __LINE__); |
|
3112 | + } |
|
3113 | + break; |
|
3114 | + } |
|
3115 | + $this->DebugMessage('Finished processing filter command "'.$command.'('.$parameter.')"', __FILE__, __LINE__); |
|
3116 | + } |
|
3117 | + } |
|
3118 | + return true; |
|
3119 | + } |
|
3120 | + |
|
3121 | + |
|
3122 | + public function MaxFileSize() { |
|
3123 | + if (phpthumb_functions::gd_version() < 2) { |
|
3124 | + $this->DebugMessage('Skipping MaxFileSize() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
3125 | + return false; |
|
3126 | + } |
|
3127 | + if ($this->maxb > 0) { |
|
3128 | + switch ($this->thumbnailFormat) { |
|
3129 | + case 'png': |
|
3130 | + case 'gif': |
|
3131 | + $imgRenderFunction = 'image'.$this->thumbnailFormat; |
|
3132 | + |
|
3133 | + ob_start(); |
|
3134 | + $imgRenderFunction($this->gdimg_output); |
|
3135 | + $imgdata = ob_get_contents(); |
|
3136 | + ob_end_clean(); |
|
3137 | + |
|
3138 | + if (strlen($imgdata) > $this->maxb) { |
|
3139 | + for ($i = 8; $i >= 1; $i--) { |
|
3140 | + $tempIMG = imagecreatetruecolor(imagesx($this->gdimg_output), imagesy($this->gdimg_output)); |
|
3141 | + imagecopy($tempIMG, $this->gdimg_output, 0, 0, 0, 0, imagesx($this->gdimg_output), imagesy($this->gdimg_output)); |
|
3142 | + imagetruecolortopalette($tempIMG, true, pow(2, $i)); |
|
3143 | + ob_start(); |
|
3144 | + $imgRenderFunction($tempIMG); |
|
3145 | + $imgdata = ob_get_contents(); |
|
3146 | + ob_end_clean(); |
|
3147 | + |
|
3148 | + if (strlen($imgdata) <= $this->maxb) { |
|
3149 | + imagetruecolortopalette($this->gdimg_output, true, pow(2, $i)); |
|
3150 | + break; |
|
3151 | + } |
|
3152 | + } |
|
3153 | + } |
|
3154 | + break; |
|
3155 | + |
|
3156 | + case 'jpeg': |
|
3157 | + ob_start(); |
|
3158 | + imagejpeg($this->gdimg_output); |
|
3159 | + $imgdata = ob_get_contents(); |
|
3160 | + ob_end_clean(); |
|
3161 | + |
|
3162 | + if (strlen($imgdata) > $this->maxb) { |
|
3163 | + for ($i = 3; $i < 20; $i++) { |
|
3164 | + $q = round(100 * (1 - log10($i / 2))); |
|
3165 | + ob_start(); |
|
3166 | + imagejpeg($this->gdimg_output, null, $q); |
|
3167 | + $imgdata = ob_get_contents(); |
|
3168 | + ob_end_clean(); |
|
3169 | + |
|
3170 | + $this->thumbnailQuality = $q; |
|
3171 | + if (strlen($imgdata) <= $this->maxb) { |
|
3172 | + break; |
|
3173 | + } |
|
3174 | + } |
|
3175 | + } |
|
3176 | + if (strlen($imgdata) > $this->maxb) { |
|
3177 | + return false; |
|
3178 | + } |
|
3179 | + break; |
|
3180 | + |
|
3181 | + default: |
|
3182 | + return false; |
|
3183 | + } |
|
3184 | + } |
|
3185 | + return true; |
|
3186 | + } |
|
3187 | + |
|
3188 | + |
|
3189 | + public function CalculateThumbnailDimensions() { |
|
3190 | + $this->DebugMessage('CalculateThumbnailDimensions() starting with [W,H,sx,sy,sw,sh] initially set to ['.$this->source_width.','.$this->source_height.','.$this->sx.','.$this->sy.','.$this->sw.','.$this->sh.']', __FILE__, __LINE__); |
|
3191 | 3191 | //echo $this->source_width.'x'.$this->source_height.'<hr>'; |
3192 | - $this->thumbnailCropX = ($this->sx ? (($this->sx >= 2) ? $this->sx : round($this->sx * $this->source_width)) : 0); |
|
3192 | + $this->thumbnailCropX = ($this->sx ? (($this->sx >= 2) ? $this->sx : round($this->sx * $this->source_width)) : 0); |
|
3193 | 3193 | //echo $this->thumbnailCropX.'<br>'; |
3194 | - $this->thumbnailCropY = ($this->sy ? (($this->sy >= 2) ? $this->sy : round($this->sy * $this->source_height)) : 0); |
|
3194 | + $this->thumbnailCropY = ($this->sy ? (($this->sy >= 2) ? $this->sy : round($this->sy * $this->source_height)) : 0); |
|
3195 | 3195 | //echo $this->thumbnailCropY.'<br>'; |
3196 | - $this->thumbnailCropW = ($this->sw ? (($this->sw >= 2) ? $this->sw : round($this->sw * $this->source_width)) : $this->source_width); |
|
3196 | + $this->thumbnailCropW = ($this->sw ? (($this->sw >= 2) ? $this->sw : round($this->sw * $this->source_width)) : $this->source_width); |
|
3197 | 3197 | //echo $this->thumbnailCropW.'<br>'; |
3198 | - $this->thumbnailCropH = ($this->sh ? (($this->sh >= 2) ? $this->sh : round($this->sh * $this->source_height)) : $this->source_height); |
|
3198 | + $this->thumbnailCropH = ($this->sh ? (($this->sh >= 2) ? $this->sh : round($this->sh * $this->source_height)) : $this->source_height); |
|
3199 | 3199 | //echo $this->thumbnailCropH.'<hr>'; |
3200 | 3200 | |
3201 | - // limit source area to original image area |
|
3202 | - $this->thumbnailCropW = max(1, min($this->thumbnailCropW, $this->source_width - $this->thumbnailCropX)); |
|
3203 | - $this->thumbnailCropH = max(1, min($this->thumbnailCropH, $this->source_height - $this->thumbnailCropY)); |
|
3204 | - |
|
3205 | - $this->DebugMessage('CalculateThumbnailDimensions() starting with [x,y,w,h] initially set to ['.$this->thumbnailCropX.','.$this->thumbnailCropY.','.$this->thumbnailCropW.','.$this->thumbnailCropH.']', __FILE__, __LINE__); |
|
3206 | - |
|
3207 | - |
|
3208 | - if ($this->zc && $this->w && $this->h) { |
|
3209 | - // Zoom Crop |
|
3210 | - // retain proportional resizing we did above, but crop off larger dimension so smaller |
|
3211 | - // dimension fully fits available space |
|
3212 | - |
|
3213 | - $scaling_X = $this->source_width / $this->w; |
|
3214 | - $scaling_Y = $this->source_height / $this->h; |
|
3215 | - if ($scaling_X > $scaling_Y) { |
|
3216 | - // some of the width will need to be cropped |
|
3217 | - $allowable_width = $this->source_width / $scaling_X * $scaling_Y; |
|
3218 | - $this->thumbnailCropW = round($allowable_width); |
|
3219 | - $this->thumbnailCropX = round(($this->source_width - $allowable_width) / 2); |
|
3220 | - |
|
3221 | - } elseif ($scaling_Y > $scaling_X) { |
|
3222 | - // some of the height will need to be cropped |
|
3223 | - $allowable_height = $this->source_height / $scaling_Y * $scaling_X; |
|
3224 | - $this->thumbnailCropH = round($allowable_height); |
|
3225 | - $this->thumbnailCropY = round(($this->source_height - $allowable_height) / 2); |
|
3226 | - |
|
3227 | - } else { |
|
3228 | - // image fits perfectly, no cropping needed |
|
3229 | - } |
|
3230 | - $this->thumbnail_width = $this->w; |
|
3231 | - $this->thumbnail_height = $this->h; |
|
3232 | - $this->thumbnail_image_width = $this->thumbnail_width; |
|
3233 | - $this->thumbnail_image_height = $this->thumbnail_height; |
|
3234 | - |
|
3235 | - } elseif ($this->iar && $this->w && $this->h) { |
|
3236 | - |
|
3237 | - // Ignore Aspect Ratio |
|
3238 | - // stretch image to fit exactly 'w' x 'h' |
|
3239 | - $this->thumbnail_width = $this->w; |
|
3240 | - $this->thumbnail_height = $this->h; |
|
3241 | - $this->thumbnail_image_width = $this->thumbnail_width; |
|
3242 | - $this->thumbnail_image_height = $this->thumbnail_height; |
|
3243 | - |
|
3244 | - } else { |
|
3245 | - |
|
3246 | - $original_aspect_ratio = $this->thumbnailCropW / $this->thumbnailCropH; |
|
3247 | - if ($this->aoe) { |
|
3248 | - if ($this->w && $this->h) { |
|
3249 | - $maxwidth = min($this->w, $this->h * $original_aspect_ratio); |
|
3250 | - $maxheight = min($this->h, $this->w / $original_aspect_ratio); |
|
3251 | - } elseif ($this->w) { |
|
3252 | - $maxwidth = $this->w; |
|
3253 | - $maxheight = $this->w / $original_aspect_ratio; |
|
3254 | - } elseif ($this->h) { |
|
3255 | - $maxwidth = $this->h * $original_aspect_ratio; |
|
3256 | - $maxheight = $this->h; |
|
3257 | - } else { |
|
3258 | - $maxwidth = $this->thumbnailCropW; |
|
3259 | - $maxheight = $this->thumbnailCropH; |
|
3260 | - } |
|
3261 | - } else { |
|
3262 | - $maxwidth = phpthumb_functions::nonempty_min($this->w, $this->thumbnailCropW, $this->config_output_maxwidth); |
|
3263 | - $maxheight = phpthumb_functions::nonempty_min($this->h, $this->thumbnailCropH, $this->config_output_maxheight); |
|
3201 | + // limit source area to original image area |
|
3202 | + $this->thumbnailCropW = max(1, min($this->thumbnailCropW, $this->source_width - $this->thumbnailCropX)); |
|
3203 | + $this->thumbnailCropH = max(1, min($this->thumbnailCropH, $this->source_height - $this->thumbnailCropY)); |
|
3204 | + |
|
3205 | + $this->DebugMessage('CalculateThumbnailDimensions() starting with [x,y,w,h] initially set to ['.$this->thumbnailCropX.','.$this->thumbnailCropY.','.$this->thumbnailCropW.','.$this->thumbnailCropH.']', __FILE__, __LINE__); |
|
3206 | + |
|
3207 | + |
|
3208 | + if ($this->zc && $this->w && $this->h) { |
|
3209 | + // Zoom Crop |
|
3210 | + // retain proportional resizing we did above, but crop off larger dimension so smaller |
|
3211 | + // dimension fully fits available space |
|
3212 | + |
|
3213 | + $scaling_X = $this->source_width / $this->w; |
|
3214 | + $scaling_Y = $this->source_height / $this->h; |
|
3215 | + if ($scaling_X > $scaling_Y) { |
|
3216 | + // some of the width will need to be cropped |
|
3217 | + $allowable_width = $this->source_width / $scaling_X * $scaling_Y; |
|
3218 | + $this->thumbnailCropW = round($allowable_width); |
|
3219 | + $this->thumbnailCropX = round(($this->source_width - $allowable_width) / 2); |
|
3220 | + |
|
3221 | + } elseif ($scaling_Y > $scaling_X) { |
|
3222 | + // some of the height will need to be cropped |
|
3223 | + $allowable_height = $this->source_height / $scaling_Y * $scaling_X; |
|
3224 | + $this->thumbnailCropH = round($allowable_height); |
|
3225 | + $this->thumbnailCropY = round(($this->source_height - $allowable_height) / 2); |
|
3226 | + |
|
3227 | + } else { |
|
3228 | + // image fits perfectly, no cropping needed |
|
3229 | + } |
|
3230 | + $this->thumbnail_width = $this->w; |
|
3231 | + $this->thumbnail_height = $this->h; |
|
3232 | + $this->thumbnail_image_width = $this->thumbnail_width; |
|
3233 | + $this->thumbnail_image_height = $this->thumbnail_height; |
|
3234 | + |
|
3235 | + } elseif ($this->iar && $this->w && $this->h) { |
|
3236 | + |
|
3237 | + // Ignore Aspect Ratio |
|
3238 | + // stretch image to fit exactly 'w' x 'h' |
|
3239 | + $this->thumbnail_width = $this->w; |
|
3240 | + $this->thumbnail_height = $this->h; |
|
3241 | + $this->thumbnail_image_width = $this->thumbnail_width; |
|
3242 | + $this->thumbnail_image_height = $this->thumbnail_height; |
|
3243 | + |
|
3244 | + } else { |
|
3245 | + |
|
3246 | + $original_aspect_ratio = $this->thumbnailCropW / $this->thumbnailCropH; |
|
3247 | + if ($this->aoe) { |
|
3248 | + if ($this->w && $this->h) { |
|
3249 | + $maxwidth = min($this->w, $this->h * $original_aspect_ratio); |
|
3250 | + $maxheight = min($this->h, $this->w / $original_aspect_ratio); |
|
3251 | + } elseif ($this->w) { |
|
3252 | + $maxwidth = $this->w; |
|
3253 | + $maxheight = $this->w / $original_aspect_ratio; |
|
3254 | + } elseif ($this->h) { |
|
3255 | + $maxwidth = $this->h * $original_aspect_ratio; |
|
3256 | + $maxheight = $this->h; |
|
3257 | + } else { |
|
3258 | + $maxwidth = $this->thumbnailCropW; |
|
3259 | + $maxheight = $this->thumbnailCropH; |
|
3260 | + } |
|
3261 | + } else { |
|
3262 | + $maxwidth = phpthumb_functions::nonempty_min($this->w, $this->thumbnailCropW, $this->config_output_maxwidth); |
|
3263 | + $maxheight = phpthumb_functions::nonempty_min($this->h, $this->thumbnailCropH, $this->config_output_maxheight); |
|
3264 | 3264 | //echo $maxwidth.'x'.$maxheight.'<br>'; |
3265 | - $maxwidth = min($maxwidth, $maxheight * $original_aspect_ratio); |
|
3266 | - $maxheight = min($maxheight, $maxwidth / $original_aspect_ratio); |
|
3265 | + $maxwidth = min($maxwidth, $maxheight * $original_aspect_ratio); |
|
3266 | + $maxheight = min($maxheight, $maxwidth / $original_aspect_ratio); |
|
3267 | 3267 | //echo $maxwidth.'x'.$maxheight.'<hr>'; |
3268 | - } |
|
3269 | - |
|
3270 | - $this->thumbnail_image_width = $maxwidth; |
|
3271 | - $this->thumbnail_image_height = $maxheight; |
|
3272 | - $this->thumbnail_width = $maxwidth; |
|
3273 | - $this->thumbnail_height = $maxheight; |
|
3274 | - |
|
3275 | - $this->FixedAspectRatio(); |
|
3276 | - } |
|
3277 | - |
|
3278 | - $this->thumbnail_width = max(1, floor($this->thumbnail_width)); |
|
3279 | - $this->thumbnail_height = max(1, floor($this->thumbnail_height)); |
|
3280 | - return true; |
|
3281 | - } |
|
3282 | - |
|
3283 | - |
|
3284 | - public function CreateGDoutput() { |
|
3285 | - $this->CalculateThumbnailDimensions(); |
|
3286 | - |
|
3287 | - // create the GD image (either true-color or 256-color, depending on GD version) |
|
3288 | - $this->gdimg_output = phpthumb_functions::ImageCreateFunction($this->thumbnail_width, $this->thumbnail_height); |
|
3289 | - |
|
3290 | - // images that have transparency must have the background filled with the configured 'bg' color otherwise the transparent color will appear as black |
|
3291 | - imagesavealpha($this->gdimg_output, true); |
|
3292 | - if ($this->is_alpha && phpthumb_functions::gd_version() >= 2) { |
|
3293 | - |
|
3294 | - imagealphablending($this->gdimg_output, false); |
|
3295 | - $output_full_alpha = phpthumb_functions::ImageColorAllocateAlphaSafe($this->gdimg_output, 255, 255, 255, 127); |
|
3296 | - imagefilledrectangle($this->gdimg_output, 0, 0, $this->thumbnail_width, $this->thumbnail_height, $output_full_alpha); |
|
3297 | - |
|
3298 | - } else { |
|
3299 | - |
|
3300 | - $current_transparent_color = imagecolortransparent($this->gdimg_source); |
|
3301 | - if ($this->bg || (@$current_transparent_color >= 0)) { |
|
3302 | - |
|
3303 | - $this->config_background_hexcolor = ($this->bg ? $this->bg : $this->config_background_hexcolor); |
|
3304 | - if (!phpthumb_functions::IsHexColor($this->config_background_hexcolor)) { |
|
3305 | - return $this->ErrorImage('Invalid hex color string "'.$this->config_background_hexcolor.'" for parameter "bg"'); |
|
3306 | - } |
|
3307 | - $background_color = phpthumb_functions::ImageHexColorAllocate($this->gdimg_output, $this->config_background_hexcolor); |
|
3308 | - imagefilledrectangle($this->gdimg_output, 0, 0, $this->thumbnail_width, $this->thumbnail_height, $background_color); |
|
3309 | - |
|
3310 | - } |
|
3311 | - |
|
3312 | - } |
|
3313 | - $this->DebugMessage('CreateGDoutput() returning canvas "'.$this->thumbnail_width.'x'.$this->thumbnail_height.'"', __FILE__, __LINE__); |
|
3314 | - return true; |
|
3315 | - } |
|
3316 | - |
|
3317 | - public function SetOrientationDependantWidthHeight() { |
|
3318 | - $this->DebugMessage('SetOrientationDependantWidthHeight() starting with "'.$this->source_width.'"x"'.$this->source_height.'"', __FILE__, __LINE__); |
|
3319 | - if ($this->source_height > $this->source_width) { |
|
3320 | - // portrait |
|
3321 | - $this->w = phpthumb_functions::OneOfThese($this->wp, $this->w, $this->ws, $this->wl); |
|
3322 | - $this->h = phpthumb_functions::OneOfThese($this->hp, $this->h, $this->hs, $this->hl); |
|
3323 | - } elseif ($this->source_height < $this->source_width) { |
|
3324 | - // landscape |
|
3325 | - $this->w = phpthumb_functions::OneOfThese($this->wl, $this->w, $this->ws, $this->wp); |
|
3326 | - $this->h = phpthumb_functions::OneOfThese($this->hl, $this->h, $this->hs, $this->hp); |
|
3327 | - } else { |
|
3328 | - // square |
|
3329 | - $this->w = phpthumb_functions::OneOfThese($this->ws, $this->w, $this->wl, $this->wp); |
|
3330 | - $this->h = phpthumb_functions::OneOfThese($this->hs, $this->h, $this->hl, $this->hp); |
|
3331 | - } |
|
3332 | - //$this->w = round($this->w ? $this->w : (($this->h && $this->source_height) ? $this->h * $this->source_width / $this->source_height : $this->w)); |
|
3333 | - //$this->h = round($this->h ? $this->h : (($this->w && $this->source_width) ? $this->w * $this->source_height / $this->source_width : $this->h)); |
|
3334 | - $this->DebugMessage('SetOrientationDependantWidthHeight() setting w="'. (int) $this->w .'", h="'. (int) $this->h .'"', __FILE__, __LINE__); |
|
3335 | - return true; |
|
3336 | - } |
|
3337 | - |
|
3338 | - public function ExtractEXIFgetImageSize() { |
|
3339 | - $this->DebugMessage('starting ExtractEXIFgetImageSize()', __FILE__, __LINE__); |
|
3340 | - |
|
3341 | - if (preg_match('#^http:#i', $this->src) && !$this->sourceFilename && $this->rawImageData) { |
|
3342 | - $this->SourceDataToTempFile(); |
|
3343 | - } |
|
3344 | - if (null === $this->getimagesizeinfo) { |
|
3345 | - if ($this->sourceFilename) { |
|
3346 | - $this->getimagesizeinfo = @getimagesize($this->sourceFilename); |
|
3347 | - $this->source_width = $this->getimagesizeinfo[0]; |
|
3348 | - $this->source_height = $this->getimagesizeinfo[1]; |
|
3349 | - $this->DebugMessage('getimagesize('.$this->sourceFilename.') says image is '.$this->source_width.'x'.$this->source_height, __FILE__, __LINE__); |
|
3350 | - } else { |
|
3351 | - $this->DebugMessage('skipping getimagesize() because $this->sourceFilename is empty', __FILE__, __LINE__); |
|
3352 | - } |
|
3353 | - } else { |
|
3354 | - $this->DebugMessage('skipping getimagesize() because !is_null($this->getimagesizeinfo)', __FILE__, __LINE__); |
|
3355 | - } |
|
3356 | - |
|
3357 | - if (is_resource($this->gdimg_source)) { |
|
3358 | - |
|
3359 | - $this->source_width = imagesx($this->gdimg_source); |
|
3360 | - $this->source_height = imagesy($this->gdimg_source); |
|
3361 | - |
|
3362 | - $this->SetOrientationDependantWidthHeight(); |
|
3363 | - |
|
3364 | - } elseif ($this->rawImageData && !$this->sourceFilename) { |
|
3365 | - |
|
3366 | - if ($this->SourceImageIsTooLarge($this->source_width, $this->source_height)) { |
|
3367 | - $this->DebugMessage('NOT bypassing EXIF and getimagesize sections because source image is too large for GD ('.$this->source_width.'x'.$this->source_width.'='.($this->source_width * $this->source_height * 5).'MB)', __FILE__, __LINE__); |
|
3368 | - } else { |
|
3369 | - $this->DebugMessage('bypassing EXIF and getimagesize sections because $this->rawImageData is set, and $this->sourceFilename is not set, and source image is not too large for GD ('.$this->source_width.'x'.$this->source_width.'='.($this->source_width * $this->source_height * 5).'MB)', __FILE__, __LINE__); |
|
3370 | - } |
|
3371 | - |
|
3372 | - } |
|
3373 | - |
|
3374 | - if (!empty($this->getimagesizeinfo)) { |
|
3375 | - // great |
|
3376 | - $this->getimagesizeinfo['filesize'] = @filesize($this->sourceFilename); |
|
3377 | - } elseif (!$this->rawImageData) { |
|
3378 | - $this->DebugMessage('getimagesize("'.$this->sourceFilename.'") failed', __FILE__, __LINE__); |
|
3379 | - } |
|
3380 | - |
|
3381 | - if ($this->config_prefer_imagemagick) { |
|
3382 | - if ($this->ImageMagickThumbnailToGD()) { |
|
3383 | - return true; |
|
3384 | - } |
|
3385 | - $this->DebugMessage('ImageMagickThumbnailToGD() failed', __FILE__, __LINE__); |
|
3386 | - } |
|
3387 | - |
|
3388 | - $this->source_width = $this->getimagesizeinfo[0]; |
|
3389 | - $this->source_height = $this->getimagesizeinfo[1]; |
|
3390 | - |
|
3391 | - $this->SetOrientationDependantWidthHeight(); |
|
3392 | - |
|
3393 | - if (phpthumb_functions::version_compare_replacement(PHP_VERSION, '4.2.0', '>=') && function_exists('exif_read_data')) { |
|
3394 | - switch ($this->getimagesizeinfo[2]) { |
|
3395 | - case IMAGETYPE_JPEG: |
|
3396 | - case IMAGETYPE_TIFF_II: |
|
3397 | - case IMAGETYPE_TIFF_MM: |
|
3398 | - $this->exif_raw_data = @exif_read_data($this->sourceFilename, 0, true); |
|
3399 | - break; |
|
3400 | - } |
|
3401 | - } |
|
3402 | - if (function_exists('exif_thumbnail') && ($this->getimagesizeinfo[2] == IMAGETYPE_JPEG)) { |
|
3403 | - // Extract EXIF info from JPEGs |
|
3404 | - |
|
3405 | - $this->exif_thumbnail_width = ''; |
|
3406 | - $this->exif_thumbnail_height = ''; |
|
3407 | - $this->exif_thumbnail_type = ''; |
|
3408 | - |
|
3409 | - // The parameters width, height and imagetype are available since PHP v4.3.0 |
|
3410 | - if (phpthumb_functions::version_compare_replacement(PHP_VERSION, '4.3.0', '>=')) { |
|
3411 | - |
|
3412 | - $this->exif_thumbnail_data = @exif_thumbnail($this->sourceFilename, $this->exif_thumbnail_width, $this->exif_thumbnail_height, $this->exif_thumbnail_type); |
|
3413 | - |
|
3414 | - } else { |
|
3415 | - |
|
3416 | - // older versions of exif_thumbnail output an error message but NOT return false on failure |
|
3417 | - ob_start(); |
|
3418 | - $this->exif_thumbnail_data = exif_thumbnail($this->sourceFilename); |
|
3419 | - $exit_thumbnail_error = ob_get_contents(); |
|
3420 | - ob_end_clean(); |
|
3421 | - if (!$exit_thumbnail_error && $this->exif_thumbnail_data) { |
|
3422 | - |
|
3423 | - if ($gdimg_exif_temp = $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data, false)) { |
|
3424 | - $this->exif_thumbnail_width = imagesx($gdimg_exif_temp); |
|
3425 | - $this->exif_thumbnail_height = imagesy($gdimg_exif_temp); |
|
3426 | - $this->exif_thumbnail_type = 2; // (2 == JPEG) before PHP v4.3.0 only JPEG format EXIF thumbnails are returned |
|
3427 | - unset($gdimg_exif_temp); |
|
3428 | - } else { |
|
3429 | - return $this->ErrorImage('Failed - $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data) in '.__FILE__.' on line '.__LINE__); |
|
3430 | - } |
|
3431 | - |
|
3432 | - } |
|
3433 | - |
|
3434 | - } |
|
3435 | - |
|
3436 | - } elseif (!function_exists('exif_thumbnail')) { |
|
3437 | - |
|
3438 | - $this->DebugMessage('exif_thumbnail() does not exist, cannot extract EXIF thumbnail', __FILE__, __LINE__); |
|
3439 | - |
|
3440 | - } |
|
3441 | - |
|
3442 | - $this->DebugMessage('EXIF thumbnail extraction: (size='.strlen($this->exif_thumbnail_data).'; type="'.$this->exif_thumbnail_type.'"; '. (int) $this->exif_thumbnail_width .'x'. (int) $this->exif_thumbnail_height .')', __FILE__, __LINE__); |
|
3443 | - |
|
3444 | - // see if EXIF thumbnail can be used directly with no processing |
|
3445 | - if ($this->config_use_exif_thumbnail_for_speed && $this->exif_thumbnail_data) { |
|
3446 | - while (true) { |
|
3447 | - if (!$this->xto) { |
|
3448 | - $source_ar = $this->source_width / $this->source_height; |
|
3449 | - $exif_ar = $this->exif_thumbnail_width / $this->exif_thumbnail_height; |
|
3450 | - if (number_format($source_ar, 2) != number_format($exif_ar, 2)) { |
|
3451 | - $this->DebugMessage('not using EXIF thumbnail because $source_ar != $exif_ar ('.$source_ar.' != '.$exif_ar.')', __FILE__, __LINE__); |
|
3452 | - break; |
|
3453 | - } |
|
3454 | - if ($this->w && ($this->w != $this->exif_thumbnail_width)) { |
|
3455 | - $this->DebugMessage('not using EXIF thumbnail because $this->w != $this->exif_thumbnail_width ('.$this->w.' != '.$this->exif_thumbnail_width.')', __FILE__, __LINE__); |
|
3456 | - break; |
|
3457 | - } |
|
3458 | - if ($this->h && ($this->h != $this->exif_thumbnail_height)) { |
|
3459 | - $this->DebugMessage('not using EXIF thumbnail because $this->h != $this->exif_thumbnail_height ('.$this->h.' != '.$this->exif_thumbnail_height.')', __FILE__, __LINE__); |
|
3460 | - break; |
|
3461 | - } |
|
3462 | - $CannotBeSetParameters = array('sx', 'sy', 'sh', 'sw', 'far', 'bg', 'bc', 'fltr', 'phpThumbDebug'); |
|
3463 | - foreach ($CannotBeSetParameters as $parameter) { |
|
3464 | - if ($this->$parameter) { |
|
3465 | - break 2; |
|
3466 | - } |
|
3467 | - } |
|
3468 | - } |
|
3469 | - |
|
3470 | - $this->DebugMessage('setting $this->gdimg_source = $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data)', __FILE__, __LINE__); |
|
3471 | - $this->gdimg_source = $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data); |
|
3472 | - $this->source_width = imagesx($this->gdimg_source); |
|
3473 | - $this->source_height = imagesy($this->gdimg_source); |
|
3474 | - return true; |
|
3475 | - } |
|
3476 | - } |
|
3477 | - |
|
3478 | - if (($this->config_max_source_pixels > 0) && (($this->source_width * $this->source_height) > $this->config_max_source_pixels)) { |
|
3479 | - |
|
3480 | - // Source image is larger than would fit in available PHP memory. |
|
3481 | - // If ImageMagick is installed, use it to generate the thumbnail. |
|
3482 | - // Else, if an EXIF thumbnail is available, use that as the source image. |
|
3483 | - // Otherwise, no choice but to fail with an error message |
|
3484 | - $this->DebugMessage('image is '.$this->source_width.'x'.$this->source_height.' and therefore contains more pixels ('.($this->source_width * $this->source_height).') than $this->config_max_source_pixels setting ('.$this->config_max_source_pixels.')', __FILE__, __LINE__); |
|
3485 | - if (!$this->config_prefer_imagemagick && $this->ImageMagickThumbnailToGD()) { |
|
3486 | - // excellent, we have a thumbnailed source image |
|
3487 | - return true; |
|
3488 | - } |
|
3489 | - |
|
3490 | - } |
|
3491 | - return true; |
|
3492 | - } |
|
3493 | - |
|
3494 | - |
|
3495 | - public function SetCacheFilename() { |
|
3496 | - if (null !== $this->cache_filename) { |
|
3497 | - $this->DebugMessage('$this->cache_filename already set, skipping SetCacheFilename()', __FILE__, __LINE__); |
|
3498 | - return true; |
|
3499 | - } |
|
3500 | - if (null === $this->config_cache_directory) { |
|
3501 | - $this->setCacheDirectory(); |
|
3502 | - if (!$this->config_cache_directory) { |
|
3503 | - $this->DebugMessage('SetCacheFilename() failed because $this->config_cache_directory is empty', __FILE__, __LINE__); |
|
3504 | - return false; |
|
3505 | - } |
|
3506 | - } |
|
3507 | - $this->setOutputFormat(); |
|
3508 | - |
|
3509 | - if (!$this->sourceFilename && !$this->rawImageData && $this->src) { |
|
3510 | - $this->sourceFilename = $this->ResolveFilenameToAbsolute($this->src); |
|
3511 | - } |
|
3512 | - |
|
3513 | - if ($this->config_cache_default_only_suffix && $this->sourceFilename) { |
|
3514 | - // simplified cache filenames: |
|
3515 | - // only use default parameters in phpThumb.config.php |
|
3516 | - // substitute source filename into * in $this->config_cache_default_only_suffix |
|
3517 | - // (eg: '*_thumb' becomes 'picture_thumb.jpg') |
|
3518 | - if (strpos($this->config_cache_default_only_suffix, '*') === false) { |
|
3519 | - $this->DebugMessage('aborting simplified caching filename because no * in "'.$this->config_cache_default_only_suffix.'"', __FILE__, __LINE__); |
|
3520 | - } else { |
|
3521 | - preg_match('#(.+)(\\.[a-z0-9]+)?$#i', basename($this->sourceFilename), $matches); |
|
3522 | - $this->cache_filename = $this->config_cache_directory.DIRECTORY_SEPARATOR.rawurlencode(str_replace('*', @$matches[1], $this->config_cache_default_only_suffix)).'.'.strtolower($this->thumbnailFormat); |
|
3523 | - return true; |
|
3524 | - } |
|
3525 | - } |
|
3526 | - |
|
3527 | - $this->cache_filename = ''; |
|
3528 | - if ($this->new) { |
|
3529 | - $broad_directory_name = strtolower(md5($this->new)); |
|
3530 | - $this->cache_filename .= '_new'.$broad_directory_name; |
|
3531 | - } elseif ($this->md5s) { |
|
3532 | - // source image MD5 hash provided |
|
3533 | - $this->DebugMessage('SetCacheFilename() _raw set from $this->md5s = "'.$this->md5s.'"', __FILE__, __LINE__); |
|
3534 | - $broad_directory_name = $this->md5s; |
|
3535 | - $this->cache_filename .= '_raw'.$this->md5s; |
|
3536 | - } elseif (!$this->src && $this->rawImageData) { |
|
3537 | - $this->DebugMessage('SetCacheFilename() _raw set from md5($this->rawImageData) = "'.md5($this->rawImageData).'"', __FILE__, __LINE__); |
|
3538 | - $broad_directory_name = strtolower(md5($this->rawImageData)); |
|
3539 | - $this->cache_filename .= '_raw'.$broad_directory_name; |
|
3540 | - } else { |
|
3541 | - $this->DebugMessage('SetCacheFilename() _src set from md5($this->sourceFilename) "'.$this->sourceFilename.'" = "'.md5($this->sourceFilename).'"', __FILE__, __LINE__); |
|
3542 | - $broad_directory_name = strtolower(md5($this->sourceFilename)); |
|
3543 | - $this->cache_filename .= '_src'.$broad_directory_name; |
|
3544 | - } |
|
3545 | - if (!empty($_SERVER['HTTP_REFERER']) && $this->config_nooffsitelink_enabled) { |
|
3546 | - $parsed_url1 = @phpthumb_functions::ParseURLbetter(@$_SERVER['HTTP_REFERER']); |
|
3547 | - $parsed_url2 = @phpthumb_functions::ParseURLbetter('http://'.@$_SERVER['HTTP_HOST']); |
|
3548 | - if (@$parsed_url1['host'] && @$parsed_url2['host'] && ($parsed_url1['host'] != $parsed_url2['host'])) { |
|
3549 | - // include "_offsite" only if nooffsitelink_enabled and if referrer doesn't match the domain of the current server |
|
3550 | - $this->cache_filename .= '_offsite'; |
|
3551 | - } |
|
3552 | - } |
|
3553 | - |
|
3554 | - $ParametersString = ''; |
|
3555 | - if ($this->fltr && is_array($this->fltr)) { |
|
3556 | - $ParametersString .= '_fltr'.implode('_fltr', $this->fltr); |
|
3557 | - } |
|
3558 | - $FilenameParameters1 = array('ar', 'bg', 'bc', 'far', 'sx', 'sy', 'sw', 'sh', 'zc'); |
|
3559 | - foreach ($FilenameParameters1 as $key) { |
|
3560 | - if ($this->$key) { |
|
3561 | - $ParametersString .= '_'.$key.$this->$key; |
|
3562 | - } |
|
3563 | - } |
|
3564 | - $FilenameParameters2 = array('h', 'w', 'wl', 'wp', 'ws', 'hp', 'hs', 'xto', 'ra', 'iar', 'aoe', 'maxb', 'sfn', 'dpi'); |
|
3565 | - foreach ($FilenameParameters2 as $key) { |
|
3566 | - if ($this->$key) { |
|
3567 | - $ParametersString .= '_'.$key. (int) $this->$key; |
|
3568 | - } |
|
3569 | - } |
|
3570 | - if ($this->thumbnailFormat == 'jpeg') { |
|
3571 | - // only JPEG output has variable quality option |
|
3572 | - $ParametersString .= '_q'. (int) $this->thumbnailQuality; |
|
3573 | - } |
|
3574 | - $this->DebugMessage('SetCacheFilename() _par set from md5('.$ParametersString.')', __FILE__, __LINE__); |
|
3575 | - $this->cache_filename .= '_par'.strtolower(md5($ParametersString)); |
|
3576 | - |
|
3577 | - if ($this->md5s) { |
|
3578 | - // source image MD5 hash provided |
|
3579 | - // do not source image modification date -- |
|
3580 | - // cached image will be used even if file was modified or removed |
|
3581 | - } elseif (!$this->config_cache_source_filemtime_ignore_remote && preg_match('#^(f|ht)tps?\://#i', $this->src)) { |
|
3582 | - $this->cache_filename .= '_dat'. (int) phpthumb_functions::filedate_remote($this->src); |
|
3583 | - } elseif (!$this->config_cache_source_filemtime_ignore_local && $this->src && !$this->rawImageData) { |
|
3584 | - $this->cache_filename .= '_dat'. (int) (@filemtime($this->sourceFilename)); |
|
3585 | - } |
|
3586 | - |
|
3587 | - $this->cache_filename .= '.'.strtolower($this->thumbnailFormat); |
|
3588 | - $broad_directories = ''; |
|
3589 | - for ($i = 0; $i < $this->config_cache_directory_depth; $i++) { |
|
3590 | - $broad_directories .= DIRECTORY_SEPARATOR.substr($broad_directory_name, 0, $i + 1); |
|
3591 | - } |
|
3592 | - |
|
3593 | - $this->cache_filename = $this->config_cache_directory.$broad_directories.DIRECTORY_SEPARATOR.$this->config_cache_prefix.rawurlencode($this->cache_filename); |
|
3594 | - return true; |
|
3595 | - } |
|
3596 | - |
|
3597 | - |
|
3598 | - public function SourceImageIsTooLarge($width, $height) { |
|
3599 | - if (!$this->config_max_source_pixels) { |
|
3600 | - return false; |
|
3601 | - } |
|
3602 | - if ($this->php_memory_limit && function_exists('memory_get_usage')) { |
|
3603 | - $available_memory = $this->php_memory_limit - memory_get_usage(); |
|
3604 | - return (bool) (($width * $height * 5) > $available_memory); |
|
3605 | - } |
|
3606 | - return (bool) (($width * $height) > $this->config_max_source_pixels); |
|
3607 | - } |
|
3608 | - |
|
3609 | - public function ImageCreateFromFilename($filename) { |
|
3610 | - // try to create GD image source directly via GD, if possible, |
|
3611 | - // rather than buffering to memory and creating with imagecreatefromstring |
|
3612 | - $ImageCreateWasAttempted = false; |
|
3613 | - $gd_image = false; |
|
3614 | - |
|
3615 | - $this->DebugMessage('starting ImageCreateFromFilename('.$filename.')', __FILE__, __LINE__); |
|
3616 | - if ($filename && ($getimagesizeinfo = @getimagesize($filename))) { |
|
3617 | - if (!$this->SourceImageIsTooLarge($getimagesizeinfo[0], $getimagesizeinfo[1])) { |
|
3618 | - $ImageCreateFromFunction = array( |
|
3619 | - 1 => 'imagecreatefromgif', |
|
3620 | - 2 => 'imagecreatefromjpeg', |
|
3621 | - 3 => 'imagecreatefrompng', |
|
3622 | - 15 => 'imagecreatefromwbmp', |
|
3623 | - ); |
|
3624 | - $this->DebugMessage('ImageCreateFromFilename found ($getimagesizeinfo[2]=='.@$getimagesizeinfo[2].')', __FILE__, __LINE__); |
|
3625 | - switch (@$getimagesizeinfo[2]) { |
|
3626 | - case 1: // GIF |
|
3627 | - case 2: // JPEG |
|
3628 | - case 3: // PNG |
|
3629 | - case 15: // WBMP |
|
3630 | - $ImageCreateFromFunctionName = $ImageCreateFromFunction[$getimagesizeinfo[2]]; |
|
3631 | - if (function_exists($ImageCreateFromFunctionName)) { |
|
3632 | - $this->DebugMessage('Calling '.$ImageCreateFromFunctionName.'('.$filename.')', __FILE__, __LINE__); |
|
3633 | - $ImageCreateWasAttempted = true; |
|
3634 | - $gd_image = $ImageCreateFromFunctionName($filename); |
|
3635 | - } else { |
|
3636 | - $this->DebugMessage('NOT calling '.$ImageCreateFromFunctionName.'('.$filename.') because !function_exists('.$ImageCreateFromFunctionName.')', __FILE__, __LINE__); |
|
3637 | - } |
|
3638 | - break; |
|
3639 | - |
|
3640 | - case 4: // SWF |
|
3641 | - case 5: // PSD |
|
3642 | - case 6: // BMP |
|
3643 | - case 7: // TIFF (LE) |
|
3644 | - case 8: // TIFF (BE) |
|
3645 | - case 9: // JPC |
|
3646 | - case 10: // JP2 |
|
3647 | - case 11: // JPX |
|
3648 | - case 12: // JB2 |
|
3649 | - case 13: // SWC |
|
3650 | - case 14: // IFF |
|
3651 | - case 16: // XBM |
|
3652 | - $this->DebugMessage('No built-in image creation function for image type "'.@$getimagesizeinfo[2].'" ($getimagesizeinfo[2])', __FILE__, __LINE__); |
|
3653 | - break; |
|
3654 | - |
|
3655 | - default: |
|
3656 | - $this->DebugMessage('Unknown value for $getimagesizeinfo[2]: "'.@$getimagesizeinfo[2].'"', __FILE__, __LINE__); |
|
3657 | - break; |
|
3658 | - } |
|
3659 | - } else { |
|
3660 | - $this->DebugMessage('image is '.$getimagesizeinfo[0].'x'.$getimagesizeinfo[1].' and therefore contains more pixels ('.($getimagesizeinfo[0] * $getimagesizeinfo[1]).') than $this->config_max_source_pixels setting ('.$this->config_max_source_pixels.')', __FILE__, __LINE__); |
|
3661 | - return false; |
|
3662 | - } |
|
3663 | - } else { |
|
3664 | - $this->DebugMessage('empty $filename or getimagesize('.$filename.') failed', __FILE__, __LINE__); |
|
3665 | - } |
|
3666 | - |
|
3667 | - if (!$gd_image) { |
|
3668 | - // cannot create from filename, attempt to create source image with imagecreatefromstring, if possible |
|
3669 | - if ($ImageCreateWasAttempted) { |
|
3670 | - $this->DebugMessage($ImageCreateFromFunctionName.'() was attempted but FAILED', __FILE__, __LINE__); |
|
3671 | - } |
|
3672 | - $this->DebugMessage('Populating $rawimagedata', __FILE__, __LINE__); |
|
3673 | - $rawimagedata = ''; |
|
3674 | - if ($fp = @fopen($filename, 'rb')) { |
|
3675 | - $filesize = filesize($filename); |
|
3676 | - $blocksize = 8192; |
|
3677 | - $blockreads = ceil($filesize / $blocksize); |
|
3678 | - for ($i = 0; $i < $blockreads; $i++) { |
|
3679 | - $rawimagedata .= fread($fp, $blocksize); |
|
3680 | - } |
|
3681 | - fclose($fp); |
|
3682 | - } else { |
|
3683 | - $this->DebugMessage('cannot fopen('.$filename.')', __FILE__, __LINE__); |
|
3684 | - } |
|
3685 | - if ($rawimagedata) { |
|
3686 | - $this->DebugMessage('attempting ImageCreateFromStringReplacement($rawimagedata ('.strlen($rawimagedata).' bytes), true)', __FILE__, __LINE__); |
|
3687 | - $gd_image = $this->ImageCreateFromStringReplacement($rawimagedata, true); |
|
3688 | - } |
|
3689 | - } |
|
3690 | - return $gd_image; |
|
3691 | - } |
|
3692 | - |
|
3693 | - public function SourceImageToGD() { |
|
3694 | - if (is_resource($this->gdimg_source)) { |
|
3695 | - $this->source_width = imagesx($this->gdimg_source); |
|
3696 | - $this->source_height = imagesy($this->gdimg_source); |
|
3697 | - $this->DebugMessage('skipping SourceImageToGD() because $this->gdimg_source is already a resource ('.$this->source_width.'x'.$this->source_height.')', __FILE__, __LINE__); |
|
3698 | - return true; |
|
3699 | - } |
|
3700 | - $this->DebugMessage('starting SourceImageToGD()', __FILE__, __LINE__); |
|
3701 | - |
|
3702 | - if ($this->config_prefer_imagemagick) { |
|
3703 | - if (empty($this->sourceFilename) && !empty($this->rawImageData)) { |
|
3704 | - $this->DebugMessage('Copying raw image data to temp file and trying again with ImageMagick', __FILE__, __LINE__); |
|
3705 | - if ($tempnam = $this->phpThumb_tempnam()) { |
|
3706 | - if (file_put_contents($tempnam, $this->rawImageData)) { |
|
3707 | - $this->sourceFilename = $tempnam; |
|
3708 | - if ($this->ImageMagickThumbnailToGD()) { |
|
3709 | - // excellent, we have a thumbnailed source image |
|
3710 | - $this->DebugMessage('ImageMagickThumbnailToGD() succeeded', __FILE__, __LINE__); |
|
3711 | - } else { |
|
3712 | - $this->DebugMessage('ImageMagickThumbnailToGD() failed', __FILE__, __LINE__); |
|
3713 | - } |
|
3714 | - @chmod($tempnam, $this->getParameter('config_file_create_mask')); |
|
3715 | - } else { |
|
3716 | - $this->DebugMessage('failed to put $this->rawImageData into temp file "'.$tempnam.'"', __FILE__, __LINE__); |
|
3717 | - } |
|
3718 | - } else { |
|
3719 | - $this->DebugMessage('failed to generate temp file name', __FILE__, __LINE__); |
|
3720 | - } |
|
3721 | - } |
|
3722 | - } |
|
3723 | - if (!$this->gdimg_source && $this->rawImageData) { |
|
3724 | - |
|
3725 | - if ($this->SourceImageIsTooLarge($this->source_width, $this->source_height)) { |
|
3726 | - $memory_get_usage = (function_exists('memory_get_usage') ? memory_get_usage() : 0); |
|
3727 | - return $this->ErrorImage('Source image is too large ('.$this->source_width.'x'.$this->source_height.' = '.number_format($this->source_width * $this->source_height / 1000000, 1).'Mpx, max='.number_format($this->config_max_source_pixels / 1000000, 1).'Mpx) for GD creation (either install ImageMagick or increase PHP memory_limit to at least '.ceil(($memory_get_usage + (5 * $this->source_width * $this->source_height)) / 1048576).'M).'); |
|
3728 | - } |
|
3729 | - if ($this->md5s && ($this->md5s != md5($this->rawImageData))) { |
|
3730 | - return $this->ErrorImage('$this->md5s != md5($this->rawImageData)'."\n".'"'.$this->md5s.'" != '."\n".'"'.md5($this->rawImageData).'"'); |
|
3731 | - } |
|
3732 | - //if ($this->issafemode) { |
|
3733 | - // return $this->ErrorImage('Cannot generate thumbnails from raw image data when PHP SAFE_MODE enabled'); |
|
3734 | - //} |
|
3735 | - $this->gdimg_source = $this->ImageCreateFromStringReplacement($this->rawImageData); |
|
3736 | - if (!$this->gdimg_source) { |
|
3737 | - if (substr($this->rawImageData, 0, 2) === 'BM') { |
|
3738 | - $this->getimagesizeinfo[2] = 6; // BMP |
|
3739 | - } elseif (substr($this->rawImageData, 0, 4) === 'II'."\x2A\x00") { |
|
3740 | - $this->getimagesizeinfo[2] = 7; // TIFF (littlendian) |
|
3741 | - } elseif (substr($this->rawImageData, 0, 4) === 'MM'."\x00\x2A") { |
|
3742 | - $this->getimagesizeinfo[2] = 8; // TIFF (bigendian) |
|
3743 | - } |
|
3744 | - $this->DebugMessage('SourceImageToGD.ImageCreateFromStringReplacement() failed with unknown image type "'.substr($this->rawImageData, 0, 4).'" ('.phpthumb_functions::HexCharDisplay(substr($this->rawImageData, 0, 4)).')', __FILE__, __LINE__); |
|
3268 | + } |
|
3269 | + |
|
3270 | + $this->thumbnail_image_width = $maxwidth; |
|
3271 | + $this->thumbnail_image_height = $maxheight; |
|
3272 | + $this->thumbnail_width = $maxwidth; |
|
3273 | + $this->thumbnail_height = $maxheight; |
|
3274 | + |
|
3275 | + $this->FixedAspectRatio(); |
|
3276 | + } |
|
3277 | + |
|
3278 | + $this->thumbnail_width = max(1, floor($this->thumbnail_width)); |
|
3279 | + $this->thumbnail_height = max(1, floor($this->thumbnail_height)); |
|
3280 | + return true; |
|
3281 | + } |
|
3282 | + |
|
3283 | + |
|
3284 | + public function CreateGDoutput() { |
|
3285 | + $this->CalculateThumbnailDimensions(); |
|
3286 | + |
|
3287 | + // create the GD image (either true-color or 256-color, depending on GD version) |
|
3288 | + $this->gdimg_output = phpthumb_functions::ImageCreateFunction($this->thumbnail_width, $this->thumbnail_height); |
|
3289 | + |
|
3290 | + // images that have transparency must have the background filled with the configured 'bg' color otherwise the transparent color will appear as black |
|
3291 | + imagesavealpha($this->gdimg_output, true); |
|
3292 | + if ($this->is_alpha && phpthumb_functions::gd_version() >= 2) { |
|
3293 | + |
|
3294 | + imagealphablending($this->gdimg_output, false); |
|
3295 | + $output_full_alpha = phpthumb_functions::ImageColorAllocateAlphaSafe($this->gdimg_output, 255, 255, 255, 127); |
|
3296 | + imagefilledrectangle($this->gdimg_output, 0, 0, $this->thumbnail_width, $this->thumbnail_height, $output_full_alpha); |
|
3297 | + |
|
3298 | + } else { |
|
3299 | + |
|
3300 | + $current_transparent_color = imagecolortransparent($this->gdimg_source); |
|
3301 | + if ($this->bg || (@$current_transparent_color >= 0)) { |
|
3302 | + |
|
3303 | + $this->config_background_hexcolor = ($this->bg ? $this->bg : $this->config_background_hexcolor); |
|
3304 | + if (!phpthumb_functions::IsHexColor($this->config_background_hexcolor)) { |
|
3305 | + return $this->ErrorImage('Invalid hex color string "'.$this->config_background_hexcolor.'" for parameter "bg"'); |
|
3306 | + } |
|
3307 | + $background_color = phpthumb_functions::ImageHexColorAllocate($this->gdimg_output, $this->config_background_hexcolor); |
|
3308 | + imagefilledrectangle($this->gdimg_output, 0, 0, $this->thumbnail_width, $this->thumbnail_height, $background_color); |
|
3309 | + |
|
3310 | + } |
|
3311 | + |
|
3312 | + } |
|
3313 | + $this->DebugMessage('CreateGDoutput() returning canvas "'.$this->thumbnail_width.'x'.$this->thumbnail_height.'"', __FILE__, __LINE__); |
|
3314 | + return true; |
|
3315 | + } |
|
3316 | + |
|
3317 | + public function SetOrientationDependantWidthHeight() { |
|
3318 | + $this->DebugMessage('SetOrientationDependantWidthHeight() starting with "'.$this->source_width.'"x"'.$this->source_height.'"', __FILE__, __LINE__); |
|
3319 | + if ($this->source_height > $this->source_width) { |
|
3320 | + // portrait |
|
3321 | + $this->w = phpthumb_functions::OneOfThese($this->wp, $this->w, $this->ws, $this->wl); |
|
3322 | + $this->h = phpthumb_functions::OneOfThese($this->hp, $this->h, $this->hs, $this->hl); |
|
3323 | + } elseif ($this->source_height < $this->source_width) { |
|
3324 | + // landscape |
|
3325 | + $this->w = phpthumb_functions::OneOfThese($this->wl, $this->w, $this->ws, $this->wp); |
|
3326 | + $this->h = phpthumb_functions::OneOfThese($this->hl, $this->h, $this->hs, $this->hp); |
|
3327 | + } else { |
|
3328 | + // square |
|
3329 | + $this->w = phpthumb_functions::OneOfThese($this->ws, $this->w, $this->wl, $this->wp); |
|
3330 | + $this->h = phpthumb_functions::OneOfThese($this->hs, $this->h, $this->hl, $this->hp); |
|
3331 | + } |
|
3332 | + //$this->w = round($this->w ? $this->w : (($this->h && $this->source_height) ? $this->h * $this->source_width / $this->source_height : $this->w)); |
|
3333 | + //$this->h = round($this->h ? $this->h : (($this->w && $this->source_width) ? $this->w * $this->source_height / $this->source_width : $this->h)); |
|
3334 | + $this->DebugMessage('SetOrientationDependantWidthHeight() setting w="'. (int) $this->w .'", h="'. (int) $this->h .'"', __FILE__, __LINE__); |
|
3335 | + return true; |
|
3336 | + } |
|
3337 | + |
|
3338 | + public function ExtractEXIFgetImageSize() { |
|
3339 | + $this->DebugMessage('starting ExtractEXIFgetImageSize()', __FILE__, __LINE__); |
|
3340 | + |
|
3341 | + if (preg_match('#^http:#i', $this->src) && !$this->sourceFilename && $this->rawImageData) { |
|
3342 | + $this->SourceDataToTempFile(); |
|
3343 | + } |
|
3344 | + if (null === $this->getimagesizeinfo) { |
|
3345 | + if ($this->sourceFilename) { |
|
3346 | + $this->getimagesizeinfo = @getimagesize($this->sourceFilename); |
|
3347 | + $this->source_width = $this->getimagesizeinfo[0]; |
|
3348 | + $this->source_height = $this->getimagesizeinfo[1]; |
|
3349 | + $this->DebugMessage('getimagesize('.$this->sourceFilename.') says image is '.$this->source_width.'x'.$this->source_height, __FILE__, __LINE__); |
|
3350 | + } else { |
|
3351 | + $this->DebugMessage('skipping getimagesize() because $this->sourceFilename is empty', __FILE__, __LINE__); |
|
3352 | + } |
|
3353 | + } else { |
|
3354 | + $this->DebugMessage('skipping getimagesize() because !is_null($this->getimagesizeinfo)', __FILE__, __LINE__); |
|
3355 | + } |
|
3356 | + |
|
3357 | + if (is_resource($this->gdimg_source)) { |
|
3358 | + |
|
3359 | + $this->source_width = imagesx($this->gdimg_source); |
|
3360 | + $this->source_height = imagesy($this->gdimg_source); |
|
3361 | + |
|
3362 | + $this->SetOrientationDependantWidthHeight(); |
|
3363 | + |
|
3364 | + } elseif ($this->rawImageData && !$this->sourceFilename) { |
|
3365 | + |
|
3366 | + if ($this->SourceImageIsTooLarge($this->source_width, $this->source_height)) { |
|
3367 | + $this->DebugMessage('NOT bypassing EXIF and getimagesize sections because source image is too large for GD ('.$this->source_width.'x'.$this->source_width.'='.($this->source_width * $this->source_height * 5).'MB)', __FILE__, __LINE__); |
|
3368 | + } else { |
|
3369 | + $this->DebugMessage('bypassing EXIF and getimagesize sections because $this->rawImageData is set, and $this->sourceFilename is not set, and source image is not too large for GD ('.$this->source_width.'x'.$this->source_width.'='.($this->source_width * $this->source_height * 5).'MB)', __FILE__, __LINE__); |
|
3370 | + } |
|
3371 | + |
|
3372 | + } |
|
3373 | + |
|
3374 | + if (!empty($this->getimagesizeinfo)) { |
|
3375 | + // great |
|
3376 | + $this->getimagesizeinfo['filesize'] = @filesize($this->sourceFilename); |
|
3377 | + } elseif (!$this->rawImageData) { |
|
3378 | + $this->DebugMessage('getimagesize("'.$this->sourceFilename.'") failed', __FILE__, __LINE__); |
|
3379 | + } |
|
3380 | + |
|
3381 | + if ($this->config_prefer_imagemagick) { |
|
3382 | + if ($this->ImageMagickThumbnailToGD()) { |
|
3383 | + return true; |
|
3384 | + } |
|
3385 | + $this->DebugMessage('ImageMagickThumbnailToGD() failed', __FILE__, __LINE__); |
|
3386 | + } |
|
3387 | + |
|
3388 | + $this->source_width = $this->getimagesizeinfo[0]; |
|
3389 | + $this->source_height = $this->getimagesizeinfo[1]; |
|
3390 | + |
|
3391 | + $this->SetOrientationDependantWidthHeight(); |
|
3392 | + |
|
3393 | + if (phpthumb_functions::version_compare_replacement(PHP_VERSION, '4.2.0', '>=') && function_exists('exif_read_data')) { |
|
3394 | + switch ($this->getimagesizeinfo[2]) { |
|
3395 | + case IMAGETYPE_JPEG: |
|
3396 | + case IMAGETYPE_TIFF_II: |
|
3397 | + case IMAGETYPE_TIFF_MM: |
|
3398 | + $this->exif_raw_data = @exif_read_data($this->sourceFilename, 0, true); |
|
3399 | + break; |
|
3400 | + } |
|
3401 | + } |
|
3402 | + if (function_exists('exif_thumbnail') && ($this->getimagesizeinfo[2] == IMAGETYPE_JPEG)) { |
|
3403 | + // Extract EXIF info from JPEGs |
|
3404 | + |
|
3405 | + $this->exif_thumbnail_width = ''; |
|
3406 | + $this->exif_thumbnail_height = ''; |
|
3407 | + $this->exif_thumbnail_type = ''; |
|
3408 | + |
|
3409 | + // The parameters width, height and imagetype are available since PHP v4.3.0 |
|
3410 | + if (phpthumb_functions::version_compare_replacement(PHP_VERSION, '4.3.0', '>=')) { |
|
3411 | + |
|
3412 | + $this->exif_thumbnail_data = @exif_thumbnail($this->sourceFilename, $this->exif_thumbnail_width, $this->exif_thumbnail_height, $this->exif_thumbnail_type); |
|
3413 | + |
|
3414 | + } else { |
|
3415 | + |
|
3416 | + // older versions of exif_thumbnail output an error message but NOT return false on failure |
|
3417 | + ob_start(); |
|
3418 | + $this->exif_thumbnail_data = exif_thumbnail($this->sourceFilename); |
|
3419 | + $exit_thumbnail_error = ob_get_contents(); |
|
3420 | + ob_end_clean(); |
|
3421 | + if (!$exit_thumbnail_error && $this->exif_thumbnail_data) { |
|
3422 | + |
|
3423 | + if ($gdimg_exif_temp = $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data, false)) { |
|
3424 | + $this->exif_thumbnail_width = imagesx($gdimg_exif_temp); |
|
3425 | + $this->exif_thumbnail_height = imagesy($gdimg_exif_temp); |
|
3426 | + $this->exif_thumbnail_type = 2; // (2 == JPEG) before PHP v4.3.0 only JPEG format EXIF thumbnails are returned |
|
3427 | + unset($gdimg_exif_temp); |
|
3428 | + } else { |
|
3429 | + return $this->ErrorImage('Failed - $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data) in '.__FILE__.' on line '.__LINE__); |
|
3430 | + } |
|
3431 | + |
|
3432 | + } |
|
3433 | + |
|
3434 | + } |
|
3435 | + |
|
3436 | + } elseif (!function_exists('exif_thumbnail')) { |
|
3437 | + |
|
3438 | + $this->DebugMessage('exif_thumbnail() does not exist, cannot extract EXIF thumbnail', __FILE__, __LINE__); |
|
3439 | + |
|
3440 | + } |
|
3441 | + |
|
3442 | + $this->DebugMessage('EXIF thumbnail extraction: (size='.strlen($this->exif_thumbnail_data).'; type="'.$this->exif_thumbnail_type.'"; '. (int) $this->exif_thumbnail_width .'x'. (int) $this->exif_thumbnail_height .')', __FILE__, __LINE__); |
|
3443 | + |
|
3444 | + // see if EXIF thumbnail can be used directly with no processing |
|
3445 | + if ($this->config_use_exif_thumbnail_for_speed && $this->exif_thumbnail_data) { |
|
3446 | + while (true) { |
|
3447 | + if (!$this->xto) { |
|
3448 | + $source_ar = $this->source_width / $this->source_height; |
|
3449 | + $exif_ar = $this->exif_thumbnail_width / $this->exif_thumbnail_height; |
|
3450 | + if (number_format($source_ar, 2) != number_format($exif_ar, 2)) { |
|
3451 | + $this->DebugMessage('not using EXIF thumbnail because $source_ar != $exif_ar ('.$source_ar.' != '.$exif_ar.')', __FILE__, __LINE__); |
|
3452 | + break; |
|
3453 | + } |
|
3454 | + if ($this->w && ($this->w != $this->exif_thumbnail_width)) { |
|
3455 | + $this->DebugMessage('not using EXIF thumbnail because $this->w != $this->exif_thumbnail_width ('.$this->w.' != '.$this->exif_thumbnail_width.')', __FILE__, __LINE__); |
|
3456 | + break; |
|
3457 | + } |
|
3458 | + if ($this->h && ($this->h != $this->exif_thumbnail_height)) { |
|
3459 | + $this->DebugMessage('not using EXIF thumbnail because $this->h != $this->exif_thumbnail_height ('.$this->h.' != '.$this->exif_thumbnail_height.')', __FILE__, __LINE__); |
|
3460 | + break; |
|
3461 | + } |
|
3462 | + $CannotBeSetParameters = array('sx', 'sy', 'sh', 'sw', 'far', 'bg', 'bc', 'fltr', 'phpThumbDebug'); |
|
3463 | + foreach ($CannotBeSetParameters as $parameter) { |
|
3464 | + if ($this->$parameter) { |
|
3465 | + break 2; |
|
3466 | + } |
|
3467 | + } |
|
3468 | + } |
|
3469 | + |
|
3470 | + $this->DebugMessage('setting $this->gdimg_source = $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data)', __FILE__, __LINE__); |
|
3471 | + $this->gdimg_source = $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data); |
|
3472 | + $this->source_width = imagesx($this->gdimg_source); |
|
3473 | + $this->source_height = imagesy($this->gdimg_source); |
|
3474 | + return true; |
|
3475 | + } |
|
3476 | + } |
|
3477 | + |
|
3478 | + if (($this->config_max_source_pixels > 0) && (($this->source_width * $this->source_height) > $this->config_max_source_pixels)) { |
|
3479 | + |
|
3480 | + // Source image is larger than would fit in available PHP memory. |
|
3481 | + // If ImageMagick is installed, use it to generate the thumbnail. |
|
3482 | + // Else, if an EXIF thumbnail is available, use that as the source image. |
|
3483 | + // Otherwise, no choice but to fail with an error message |
|
3484 | + $this->DebugMessage('image is '.$this->source_width.'x'.$this->source_height.' and therefore contains more pixels ('.($this->source_width * $this->source_height).') than $this->config_max_source_pixels setting ('.$this->config_max_source_pixels.')', __FILE__, __LINE__); |
|
3485 | + if (!$this->config_prefer_imagemagick && $this->ImageMagickThumbnailToGD()) { |
|
3486 | + // excellent, we have a thumbnailed source image |
|
3487 | + return true; |
|
3488 | + } |
|
3489 | + |
|
3490 | + } |
|
3491 | + return true; |
|
3492 | + } |
|
3493 | + |
|
3494 | + |
|
3495 | + public function SetCacheFilename() { |
|
3496 | + if (null !== $this->cache_filename) { |
|
3497 | + $this->DebugMessage('$this->cache_filename already set, skipping SetCacheFilename()', __FILE__, __LINE__); |
|
3498 | + return true; |
|
3499 | + } |
|
3500 | + if (null === $this->config_cache_directory) { |
|
3501 | + $this->setCacheDirectory(); |
|
3502 | + if (!$this->config_cache_directory) { |
|
3503 | + $this->DebugMessage('SetCacheFilename() failed because $this->config_cache_directory is empty', __FILE__, __LINE__); |
|
3504 | + return false; |
|
3505 | + } |
|
3506 | + } |
|
3507 | + $this->setOutputFormat(); |
|
3508 | + |
|
3509 | + if (!$this->sourceFilename && !$this->rawImageData && $this->src) { |
|
3510 | + $this->sourceFilename = $this->ResolveFilenameToAbsolute($this->src); |
|
3511 | + } |
|
3512 | + |
|
3513 | + if ($this->config_cache_default_only_suffix && $this->sourceFilename) { |
|
3514 | + // simplified cache filenames: |
|
3515 | + // only use default parameters in phpThumb.config.php |
|
3516 | + // substitute source filename into * in $this->config_cache_default_only_suffix |
|
3517 | + // (eg: '*_thumb' becomes 'picture_thumb.jpg') |
|
3518 | + if (strpos($this->config_cache_default_only_suffix, '*') === false) { |
|
3519 | + $this->DebugMessage('aborting simplified caching filename because no * in "'.$this->config_cache_default_only_suffix.'"', __FILE__, __LINE__); |
|
3520 | + } else { |
|
3521 | + preg_match('#(.+)(\\.[a-z0-9]+)?$#i', basename($this->sourceFilename), $matches); |
|
3522 | + $this->cache_filename = $this->config_cache_directory.DIRECTORY_SEPARATOR.rawurlencode(str_replace('*', @$matches[1], $this->config_cache_default_only_suffix)).'.'.strtolower($this->thumbnailFormat); |
|
3523 | + return true; |
|
3524 | + } |
|
3525 | + } |
|
3526 | + |
|
3527 | + $this->cache_filename = ''; |
|
3528 | + if ($this->new) { |
|
3529 | + $broad_directory_name = strtolower(md5($this->new)); |
|
3530 | + $this->cache_filename .= '_new'.$broad_directory_name; |
|
3531 | + } elseif ($this->md5s) { |
|
3532 | + // source image MD5 hash provided |
|
3533 | + $this->DebugMessage('SetCacheFilename() _raw set from $this->md5s = "'.$this->md5s.'"', __FILE__, __LINE__); |
|
3534 | + $broad_directory_name = $this->md5s; |
|
3535 | + $this->cache_filename .= '_raw'.$this->md5s; |
|
3536 | + } elseif (!$this->src && $this->rawImageData) { |
|
3537 | + $this->DebugMessage('SetCacheFilename() _raw set from md5($this->rawImageData) = "'.md5($this->rawImageData).'"', __FILE__, __LINE__); |
|
3538 | + $broad_directory_name = strtolower(md5($this->rawImageData)); |
|
3539 | + $this->cache_filename .= '_raw'.$broad_directory_name; |
|
3540 | + } else { |
|
3541 | + $this->DebugMessage('SetCacheFilename() _src set from md5($this->sourceFilename) "'.$this->sourceFilename.'" = "'.md5($this->sourceFilename).'"', __FILE__, __LINE__); |
|
3542 | + $broad_directory_name = strtolower(md5($this->sourceFilename)); |
|
3543 | + $this->cache_filename .= '_src'.$broad_directory_name; |
|
3544 | + } |
|
3545 | + if (!empty($_SERVER['HTTP_REFERER']) && $this->config_nooffsitelink_enabled) { |
|
3546 | + $parsed_url1 = @phpthumb_functions::ParseURLbetter(@$_SERVER['HTTP_REFERER']); |
|
3547 | + $parsed_url2 = @phpthumb_functions::ParseURLbetter('http://'.@$_SERVER['HTTP_HOST']); |
|
3548 | + if (@$parsed_url1['host'] && @$parsed_url2['host'] && ($parsed_url1['host'] != $parsed_url2['host'])) { |
|
3549 | + // include "_offsite" only if nooffsitelink_enabled and if referrer doesn't match the domain of the current server |
|
3550 | + $this->cache_filename .= '_offsite'; |
|
3551 | + } |
|
3552 | + } |
|
3553 | + |
|
3554 | + $ParametersString = ''; |
|
3555 | + if ($this->fltr && is_array($this->fltr)) { |
|
3556 | + $ParametersString .= '_fltr'.implode('_fltr', $this->fltr); |
|
3557 | + } |
|
3558 | + $FilenameParameters1 = array('ar', 'bg', 'bc', 'far', 'sx', 'sy', 'sw', 'sh', 'zc'); |
|
3559 | + foreach ($FilenameParameters1 as $key) { |
|
3560 | + if ($this->$key) { |
|
3561 | + $ParametersString .= '_'.$key.$this->$key; |
|
3562 | + } |
|
3563 | + } |
|
3564 | + $FilenameParameters2 = array('h', 'w', 'wl', 'wp', 'ws', 'hp', 'hs', 'xto', 'ra', 'iar', 'aoe', 'maxb', 'sfn', 'dpi'); |
|
3565 | + foreach ($FilenameParameters2 as $key) { |
|
3566 | + if ($this->$key) { |
|
3567 | + $ParametersString .= '_'.$key. (int) $this->$key; |
|
3568 | + } |
|
3569 | + } |
|
3570 | + if ($this->thumbnailFormat == 'jpeg') { |
|
3571 | + // only JPEG output has variable quality option |
|
3572 | + $ParametersString .= '_q'. (int) $this->thumbnailQuality; |
|
3573 | + } |
|
3574 | + $this->DebugMessage('SetCacheFilename() _par set from md5('.$ParametersString.')', __FILE__, __LINE__); |
|
3575 | + $this->cache_filename .= '_par'.strtolower(md5($ParametersString)); |
|
3576 | + |
|
3577 | + if ($this->md5s) { |
|
3578 | + // source image MD5 hash provided |
|
3579 | + // do not source image modification date -- |
|
3580 | + // cached image will be used even if file was modified or removed |
|
3581 | + } elseif (!$this->config_cache_source_filemtime_ignore_remote && preg_match('#^(f|ht)tps?\://#i', $this->src)) { |
|
3582 | + $this->cache_filename .= '_dat'. (int) phpthumb_functions::filedate_remote($this->src); |
|
3583 | + } elseif (!$this->config_cache_source_filemtime_ignore_local && $this->src && !$this->rawImageData) { |
|
3584 | + $this->cache_filename .= '_dat'. (int) (@filemtime($this->sourceFilename)); |
|
3585 | + } |
|
3586 | + |
|
3587 | + $this->cache_filename .= '.'.strtolower($this->thumbnailFormat); |
|
3588 | + $broad_directories = ''; |
|
3589 | + for ($i = 0; $i < $this->config_cache_directory_depth; $i++) { |
|
3590 | + $broad_directories .= DIRECTORY_SEPARATOR.substr($broad_directory_name, 0, $i + 1); |
|
3591 | + } |
|
3592 | + |
|
3593 | + $this->cache_filename = $this->config_cache_directory.$broad_directories.DIRECTORY_SEPARATOR.$this->config_cache_prefix.rawurlencode($this->cache_filename); |
|
3594 | + return true; |
|
3595 | + } |
|
3596 | + |
|
3597 | + |
|
3598 | + public function SourceImageIsTooLarge($width, $height) { |
|
3599 | + if (!$this->config_max_source_pixels) { |
|
3600 | + return false; |
|
3601 | + } |
|
3602 | + if ($this->php_memory_limit && function_exists('memory_get_usage')) { |
|
3603 | + $available_memory = $this->php_memory_limit - memory_get_usage(); |
|
3604 | + return (bool) (($width * $height * 5) > $available_memory); |
|
3605 | + } |
|
3606 | + return (bool) (($width * $height) > $this->config_max_source_pixels); |
|
3607 | + } |
|
3608 | + |
|
3609 | + public function ImageCreateFromFilename($filename) { |
|
3610 | + // try to create GD image source directly via GD, if possible, |
|
3611 | + // rather than buffering to memory and creating with imagecreatefromstring |
|
3612 | + $ImageCreateWasAttempted = false; |
|
3613 | + $gd_image = false; |
|
3614 | + |
|
3615 | + $this->DebugMessage('starting ImageCreateFromFilename('.$filename.')', __FILE__, __LINE__); |
|
3616 | + if ($filename && ($getimagesizeinfo = @getimagesize($filename))) { |
|
3617 | + if (!$this->SourceImageIsTooLarge($getimagesizeinfo[0], $getimagesizeinfo[1])) { |
|
3618 | + $ImageCreateFromFunction = array( |
|
3619 | + 1 => 'imagecreatefromgif', |
|
3620 | + 2 => 'imagecreatefromjpeg', |
|
3621 | + 3 => 'imagecreatefrompng', |
|
3622 | + 15 => 'imagecreatefromwbmp', |
|
3623 | + ); |
|
3624 | + $this->DebugMessage('ImageCreateFromFilename found ($getimagesizeinfo[2]=='.@$getimagesizeinfo[2].')', __FILE__, __LINE__); |
|
3625 | + switch (@$getimagesizeinfo[2]) { |
|
3626 | + case 1: // GIF |
|
3627 | + case 2: // JPEG |
|
3628 | + case 3: // PNG |
|
3629 | + case 15: // WBMP |
|
3630 | + $ImageCreateFromFunctionName = $ImageCreateFromFunction[$getimagesizeinfo[2]]; |
|
3631 | + if (function_exists($ImageCreateFromFunctionName)) { |
|
3632 | + $this->DebugMessage('Calling '.$ImageCreateFromFunctionName.'('.$filename.')', __FILE__, __LINE__); |
|
3633 | + $ImageCreateWasAttempted = true; |
|
3634 | + $gd_image = $ImageCreateFromFunctionName($filename); |
|
3635 | + } else { |
|
3636 | + $this->DebugMessage('NOT calling '.$ImageCreateFromFunctionName.'('.$filename.') because !function_exists('.$ImageCreateFromFunctionName.')', __FILE__, __LINE__); |
|
3637 | + } |
|
3638 | + break; |
|
3639 | + |
|
3640 | + case 4: // SWF |
|
3641 | + case 5: // PSD |
|
3642 | + case 6: // BMP |
|
3643 | + case 7: // TIFF (LE) |
|
3644 | + case 8: // TIFF (BE) |
|
3645 | + case 9: // JPC |
|
3646 | + case 10: // JP2 |
|
3647 | + case 11: // JPX |
|
3648 | + case 12: // JB2 |
|
3649 | + case 13: // SWC |
|
3650 | + case 14: // IFF |
|
3651 | + case 16: // XBM |
|
3652 | + $this->DebugMessage('No built-in image creation function for image type "'.@$getimagesizeinfo[2].'" ($getimagesizeinfo[2])', __FILE__, __LINE__); |
|
3653 | + break; |
|
3654 | + |
|
3655 | + default: |
|
3656 | + $this->DebugMessage('Unknown value for $getimagesizeinfo[2]: "'.@$getimagesizeinfo[2].'"', __FILE__, __LINE__); |
|
3657 | + break; |
|
3658 | + } |
|
3659 | + } else { |
|
3660 | + $this->DebugMessage('image is '.$getimagesizeinfo[0].'x'.$getimagesizeinfo[1].' and therefore contains more pixels ('.($getimagesizeinfo[0] * $getimagesizeinfo[1]).') than $this->config_max_source_pixels setting ('.$this->config_max_source_pixels.')', __FILE__, __LINE__); |
|
3661 | + return false; |
|
3662 | + } |
|
3663 | + } else { |
|
3664 | + $this->DebugMessage('empty $filename or getimagesize('.$filename.') failed', __FILE__, __LINE__); |
|
3665 | + } |
|
3666 | + |
|
3667 | + if (!$gd_image) { |
|
3668 | + // cannot create from filename, attempt to create source image with imagecreatefromstring, if possible |
|
3669 | + if ($ImageCreateWasAttempted) { |
|
3670 | + $this->DebugMessage($ImageCreateFromFunctionName.'() was attempted but FAILED', __FILE__, __LINE__); |
|
3671 | + } |
|
3672 | + $this->DebugMessage('Populating $rawimagedata', __FILE__, __LINE__); |
|
3673 | + $rawimagedata = ''; |
|
3674 | + if ($fp = @fopen($filename, 'rb')) { |
|
3675 | + $filesize = filesize($filename); |
|
3676 | + $blocksize = 8192; |
|
3677 | + $blockreads = ceil($filesize / $blocksize); |
|
3678 | + for ($i = 0; $i < $blockreads; $i++) { |
|
3679 | + $rawimagedata .= fread($fp, $blocksize); |
|
3680 | + } |
|
3681 | + fclose($fp); |
|
3682 | + } else { |
|
3683 | + $this->DebugMessage('cannot fopen('.$filename.')', __FILE__, __LINE__); |
|
3684 | + } |
|
3685 | + if ($rawimagedata) { |
|
3686 | + $this->DebugMessage('attempting ImageCreateFromStringReplacement($rawimagedata ('.strlen($rawimagedata).' bytes), true)', __FILE__, __LINE__); |
|
3687 | + $gd_image = $this->ImageCreateFromStringReplacement($rawimagedata, true); |
|
3688 | + } |
|
3689 | + } |
|
3690 | + return $gd_image; |
|
3691 | + } |
|
3692 | + |
|
3693 | + public function SourceImageToGD() { |
|
3694 | + if (is_resource($this->gdimg_source)) { |
|
3695 | + $this->source_width = imagesx($this->gdimg_source); |
|
3696 | + $this->source_height = imagesy($this->gdimg_source); |
|
3697 | + $this->DebugMessage('skipping SourceImageToGD() because $this->gdimg_source is already a resource ('.$this->source_width.'x'.$this->source_height.')', __FILE__, __LINE__); |
|
3698 | + return true; |
|
3699 | + } |
|
3700 | + $this->DebugMessage('starting SourceImageToGD()', __FILE__, __LINE__); |
|
3701 | + |
|
3702 | + if ($this->config_prefer_imagemagick) { |
|
3703 | + if (empty($this->sourceFilename) && !empty($this->rawImageData)) { |
|
3704 | + $this->DebugMessage('Copying raw image data to temp file and trying again with ImageMagick', __FILE__, __LINE__); |
|
3705 | + if ($tempnam = $this->phpThumb_tempnam()) { |
|
3706 | + if (file_put_contents($tempnam, $this->rawImageData)) { |
|
3707 | + $this->sourceFilename = $tempnam; |
|
3708 | + if ($this->ImageMagickThumbnailToGD()) { |
|
3709 | + // excellent, we have a thumbnailed source image |
|
3710 | + $this->DebugMessage('ImageMagickThumbnailToGD() succeeded', __FILE__, __LINE__); |
|
3711 | + } else { |
|
3712 | + $this->DebugMessage('ImageMagickThumbnailToGD() failed', __FILE__, __LINE__); |
|
3713 | + } |
|
3714 | + @chmod($tempnam, $this->getParameter('config_file_create_mask')); |
|
3715 | + } else { |
|
3716 | + $this->DebugMessage('failed to put $this->rawImageData into temp file "'.$tempnam.'"', __FILE__, __LINE__); |
|
3717 | + } |
|
3718 | + } else { |
|
3719 | + $this->DebugMessage('failed to generate temp file name', __FILE__, __LINE__); |
|
3720 | + } |
|
3721 | + } |
|
3722 | + } |
|
3723 | + if (!$this->gdimg_source && $this->rawImageData) { |
|
3724 | + |
|
3725 | + if ($this->SourceImageIsTooLarge($this->source_width, $this->source_height)) { |
|
3726 | + $memory_get_usage = (function_exists('memory_get_usage') ? memory_get_usage() : 0); |
|
3727 | + return $this->ErrorImage('Source image is too large ('.$this->source_width.'x'.$this->source_height.' = '.number_format($this->source_width * $this->source_height / 1000000, 1).'Mpx, max='.number_format($this->config_max_source_pixels / 1000000, 1).'Mpx) for GD creation (either install ImageMagick or increase PHP memory_limit to at least '.ceil(($memory_get_usage + (5 * $this->source_width * $this->source_height)) / 1048576).'M).'); |
|
3728 | + } |
|
3729 | + if ($this->md5s && ($this->md5s != md5($this->rawImageData))) { |
|
3730 | + return $this->ErrorImage('$this->md5s != md5($this->rawImageData)'."\n".'"'.$this->md5s.'" != '."\n".'"'.md5($this->rawImageData).'"'); |
|
3731 | + } |
|
3732 | + //if ($this->issafemode) { |
|
3733 | + // return $this->ErrorImage('Cannot generate thumbnails from raw image data when PHP SAFE_MODE enabled'); |
|
3734 | + //} |
|
3735 | + $this->gdimg_source = $this->ImageCreateFromStringReplacement($this->rawImageData); |
|
3736 | + if (!$this->gdimg_source) { |
|
3737 | + if (substr($this->rawImageData, 0, 2) === 'BM') { |
|
3738 | + $this->getimagesizeinfo[2] = 6; // BMP |
|
3739 | + } elseif (substr($this->rawImageData, 0, 4) === 'II'."\x2A\x00") { |
|
3740 | + $this->getimagesizeinfo[2] = 7; // TIFF (littlendian) |
|
3741 | + } elseif (substr($this->rawImageData, 0, 4) === 'MM'."\x00\x2A") { |
|
3742 | + $this->getimagesizeinfo[2] = 8; // TIFF (bigendian) |
|
3743 | + } |
|
3744 | + $this->DebugMessage('SourceImageToGD.ImageCreateFromStringReplacement() failed with unknown image type "'.substr($this->rawImageData, 0, 4).'" ('.phpthumb_functions::HexCharDisplay(substr($this->rawImageData, 0, 4)).')', __FILE__, __LINE__); |
|
3745 | 3745 | // return $this->ErrorImage('Unknown image type identified by "'.substr($this->rawImageData, 0, 4).'" ('.phpthumb_functions::HexCharDisplay(substr($this->rawImageData, 0, 4)).') in SourceImageToGD()['.__LINE__.']'); |
3746 | - } |
|
3747 | - |
|
3748 | - } elseif (!$this->gdimg_source && $this->sourceFilename) { |
|
3749 | - |
|
3750 | - if ($this->md5s && ($this->md5s != phpthumb_functions::md5_file_safe($this->sourceFilename))) { |
|
3751 | - return $this->ErrorImage('$this->md5s != md5(sourceFilename)'."\n".'"'.$this->md5s.'" != '."\n".'"'.phpthumb_functions::md5_file_safe($this->sourceFilename).'"'); |
|
3752 | - } |
|
3753 | - switch (@$this->getimagesizeinfo[2]) { |
|
3754 | - case 1: |
|
3755 | - case 3: |
|
3756 | - // GIF or PNG input file may have transparency |
|
3757 | - $this->is_alpha = true; |
|
3758 | - break; |
|
3759 | - } |
|
3760 | - if (!$this->SourceImageIsTooLarge($this->source_width, $this->source_height)) { |
|
3761 | - $this->gdimg_source = $this->ImageCreateFromFilename($this->sourceFilename); |
|
3762 | - } |
|
3763 | - |
|
3764 | - } |
|
3765 | - |
|
3766 | - while (true) { |
|
3767 | - if ($this->gdimg_source) { |
|
3768 | - $this->DebugMessage('Not using EXIF thumbnail data because $this->gdimg_source is already set', __FILE__, __LINE__); |
|
3769 | - break; |
|
3770 | - } |
|
3771 | - if (!$this->exif_thumbnail_data) { |
|
3772 | - $this->DebugMessage('Not using EXIF thumbnail data because $this->exif_thumbnail_data is empty', __FILE__, __LINE__); |
|
3773 | - break; |
|
3774 | - } |
|
3775 | - if (ini_get('safe_mode')) { |
|
3776 | - if (!$this->SourceImageIsTooLarge($this->source_width, $this->source_height)) { |
|
3777 | - $this->DebugMessage('Using EXIF thumbnail data because source image too large and safe_mode enabled', __FILE__, __LINE__); |
|
3778 | - $this->aoe = true; |
|
3779 | - } else { |
|
3780 | - break; |
|
3781 | - } |
|
3782 | - } else { |
|
3783 | - if (!$this->config_use_exif_thumbnail_for_speed) { |
|
3784 | - $this->DebugMessage('Not using EXIF thumbnail data because $this->config_use_exif_thumbnail_for_speed is FALSE', __FILE__, __LINE__); |
|
3785 | - break; |
|
3786 | - } |
|
3787 | - if (($this->thumbnailCropX != 0) || ($this->thumbnailCropY != 0)) { |
|
3788 | - $this->DebugMessage('Not using EXIF thumbnail data because source cropping is enabled ('.$this->thumbnailCropX.','.$this->thumbnailCropY.')', __FILE__, __LINE__); |
|
3789 | - break; |
|
3790 | - } |
|
3791 | - if (($this->w > $this->exif_thumbnail_width) || ($this->h > $this->exif_thumbnail_height)) { |
|
3792 | - $this->DebugMessage('Not using EXIF thumbnail data because EXIF thumbnail is too small ('.$this->exif_thumbnail_width.'x'.$this->exif_thumbnail_height.' vs '.$this->w.'x'.$this->h.')', __FILE__, __LINE__); |
|
3793 | - break; |
|
3794 | - } |
|
3795 | - $source_ar = $this->source_width / $this->source_height; |
|
3796 | - $exif_ar = $this->exif_thumbnail_width / $this->exif_thumbnail_height; |
|
3797 | - if (number_format($source_ar, 2) != number_format($exif_ar, 2)) { |
|
3798 | - $this->DebugMessage('not using EXIF thumbnail because $source_ar != $exif_ar ('.$source_ar.' != '.$exif_ar.')', __FILE__, __LINE__); |
|
3799 | - break; |
|
3800 | - } |
|
3801 | - } |
|
3802 | - |
|
3803 | - // EXIF thumbnail exists, and is equal to or larger than destination thumbnail, and will be use as source image |
|
3804 | - $this->DebugMessage('Trying to use EXIF thumbnail as source image', __FILE__, __LINE__); |
|
3805 | - |
|
3806 | - if ($gdimg_exif_temp = $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data, false)) { |
|
3807 | - |
|
3808 | - $this->DebugMessage('Successfully using EXIF thumbnail as source image', __FILE__, __LINE__); |
|
3809 | - $this->gdimg_source = $gdimg_exif_temp; |
|
3810 | - $this->source_width = $this->exif_thumbnail_width; |
|
3811 | - $this->source_height = $this->exif_thumbnail_height; |
|
3812 | - $this->thumbnailCropW = $this->source_width; |
|
3813 | - $this->thumbnailCropH = $this->source_height; |
|
3814 | - return true; |
|
3815 | - |
|
3816 | - } else { |
|
3817 | - $this->DebugMessage('$this->ImageCreateFromStringReplacement($this->exif_thumbnail_data, false) failed', __FILE__, __LINE__); |
|
3818 | - } |
|
3819 | - |
|
3820 | - break; |
|
3821 | - } |
|
3822 | - |
|
3823 | - if (!$this->gdimg_source) { |
|
3824 | - $this->DebugMessage('$this->gdimg_source is still empty', __FILE__, __LINE__); |
|
3825 | - |
|
3826 | - $this->DebugMessage('ImageMagickThumbnailToGD() failed', __FILE__, __LINE__); |
|
3827 | - |
|
3828 | - $imageHeader = ''; |
|
3829 | - $gd_info = gd_info(); |
|
3830 | - $GDreadSupport = false; |
|
3831 | - switch (@$this->getimagesizeinfo[2]) { |
|
3832 | - case 1: |
|
3833 | - $imageHeader = 'Content-Type: image/gif'; |
|
3834 | - $GDreadSupport = (bool) @$gd_info['GIF Read Support']; |
|
3835 | - break; |
|
3836 | - case 2: |
|
3837 | - $imageHeader = 'Content-Type: image/jpeg'; |
|
3838 | - $GDreadSupport = (bool) @$gd_info['JPG Support']; |
|
3839 | - break; |
|
3840 | - case 3: |
|
3841 | - $imageHeader = 'Content-Type: image/png'; |
|
3842 | - $GDreadSupport = (bool) @$gd_info['PNG Support']; |
|
3843 | - break; |
|
3844 | - } |
|
3845 | - if ($imageHeader) { |
|
3846 | - // cannot create image for whatever reason (maybe imagecreatefromjpeg et al are not available?) |
|
3847 | - // and ImageMagick is not available either, no choice but to output original (not resized/modified) data and exit |
|
3848 | - if ($this->config_error_die_on_source_failure) { |
|
3849 | - $errormessages = array(); |
|
3850 | - $errormessages[] = 'All attempts to create GD image source failed.'; |
|
3851 | - if ($this->fatalerror) { |
|
3852 | - $errormessages[] = $this->fatalerror; |
|
3853 | - } |
|
3854 | - if ($this->issafemode) { |
|
3855 | - $errormessages[] = 'Safe Mode enabled, therefore ImageMagick is unavailable. (disable Safe Mode if possible)'; |
|
3856 | - } elseif (!$this->ImageMagickVersion()) { |
|
3857 | - $errormessages[] = 'ImageMagick is not installed (it is highly recommended that you install it).'; |
|
3858 | - } |
|
3859 | - if ($this->SourceImageIsTooLarge($this->getimagesizeinfo[0], $this->getimagesizeinfo[1])) { |
|
3860 | - $memory_get_usage = (function_exists('memory_get_usage') ? memory_get_usage() : 0); |
|
3861 | - $errormessages[] = 'Source image is too large ('.$this->getimagesizeinfo[0].'x'.$this->getimagesizeinfo[1].' = '.number_format($this->getimagesizeinfo[0] * $this->getimagesizeinfo[1] / 1000000, 1).'Mpx, max='.number_format($this->config_max_source_pixels / 1000000, 1).'Mpx) for GD creation (either install ImageMagick or increase PHP memory_limit to at least '.ceil(($memory_get_usage + (5 * $this->getimagesizeinfo[0] * $this->getimagesizeinfo[1])) / 1048576).'M).'; |
|
3862 | - } elseif (!$GDreadSupport) { |
|
3863 | - $errormessages[] = 'GD does not have read support for "'.$imageHeader.'".'; |
|
3864 | - } else { |
|
3865 | - $errormessages[] = 'Source image probably corrupt.'; |
|
3866 | - } |
|
3867 | - $this->ErrorImage(implode("\n", $errormessages)); |
|
3868 | - |
|
3869 | - } else { |
|
3870 | - $this->DebugMessage('All attempts to create GD image source failed ('.(ini_get('safe_mode') ? 'Safe Mode enabled, ImageMagick unavailable and source image probably too large for GD': ($GDreadSupport ? 'source image probably corrupt' : 'GD does not have read support for "'.$imageHeader.'"')).'), cannot generate thumbnail'); |
|
3871 | - //$this->DebugMessage('All attempts to create GD image source failed ('.($GDreadSupport ? 'source image probably corrupt' : 'GD does not have read support for "'.$imageHeader.'"').'), outputing raw image', __FILE__, __LINE__); |
|
3872 | - //if (!$this->phpThumbDebug) { |
|
3873 | - // header($imageHeader); |
|
3874 | - // echo $this->rawImageData; |
|
3875 | - // exit; |
|
3876 | - //} |
|
3877 | - return false; |
|
3878 | - } |
|
3879 | - } |
|
3880 | - |
|
3881 | - //switch (substr($this->rawImageData, 0, 2)) { |
|
3882 | - // case 'BM': |
|
3883 | - switch (@$this->getimagesizeinfo[2]) { |
|
3884 | - case 6: |
|
3885 | - ob_start(); |
|
3886 | - if (!@include_once( __DIR__ .'/phpthumb.bmp.php')) { |
|
3887 | - ob_end_clean(); |
|
3888 | - return $this->ErrorImage('include_once('. __DIR__ .'/phpthumb.bmp.php) failed'); |
|
3889 | - } |
|
3890 | - ob_end_clean(); |
|
3891 | - if ($fp = @fopen($this->sourceFilename, 'rb')) { |
|
3892 | - $this->rawImageData = ''; |
|
3893 | - while (!feof($fp)) { |
|
3894 | - $this->rawImageData .= fread($fp, 32768); |
|
3895 | - } |
|
3896 | - fclose($fp); |
|
3897 | - } |
|
3898 | - $phpthumb_bmp = new phpthumb_bmp(); |
|
3899 | - $this->gdimg_source = $phpthumb_bmp->phpthumb_bmp2gd($this->rawImageData, (phpthumb_functions::gd_version() >= 2.0)); |
|
3900 | - unset($phpthumb_bmp); |
|
3901 | - if ($this->gdimg_source) { |
|
3902 | - $this->DebugMessage('$phpthumb_bmp->phpthumb_bmp2gd() succeeded', __FILE__, __LINE__); |
|
3903 | - } else { |
|
3904 | - return $this->ErrorImage($this->ImageMagickVersion() ? 'ImageMagick failed on BMP source conversion' : 'phpthumb_bmp2gd() failed'); |
|
3905 | - } |
|
3906 | - break; |
|
3907 | - //} |
|
3908 | - //switch (substr($this->rawImageData, 0, 4)) { |
|
3909 | - // case 'II'."\x2A\x00": |
|
3910 | - // case 'MM'."\x00\x2A": |
|
3911 | - case 7: |
|
3912 | - case 8: |
|
3913 | - return $this->ErrorImage($this->ImageMagickVersion() ? 'ImageMagick failed on TIFF source conversion' : 'ImageMagick is unavailable and phpThumb() does not support TIFF source images without it'); |
|
3914 | - break; |
|
3915 | - |
|
3916 | - //case "\xD7\xCD\xC6\x9A": |
|
3917 | - // return $this->ErrorImage($this->ImageMagickVersion() ? 'ImageMagick failed on WMF source conversion' : 'ImageMagick is unavailable and phpThumb() does not support WMF source images without it'); |
|
3918 | - // break; |
|
3919 | - } |
|
3920 | - |
|
3921 | - if (!$this->gdimg_source) { |
|
3922 | - if ($this->rawImageData) { |
|
3923 | - $HeaderFourBytes = substr($this->rawImageData, 0, 4); |
|
3924 | - } elseif ($this->sourceFilename) { |
|
3925 | - if ($fp = @fopen($this->sourceFilename, 'rb')) { |
|
3926 | - $HeaderFourBytes = fread($fp, 4); |
|
3927 | - fclose($fp); |
|
3928 | - } else { |
|
3929 | - return $this->ErrorImage('failed to open "'.$this->sourceFilename.'" SourceImageToGD() ['.__LINE__.']'); |
|
3930 | - } |
|
3931 | - } else { |
|
3932 | - return $this->ErrorImage('Unable to create image, neither filename nor image data suppplied in SourceImageToGD() ['.__LINE__.']'); |
|
3933 | - } |
|
3934 | - if (!$this->ImageMagickVersion() && !phpthumb_functions::gd_version()) { |
|
3935 | - return $this->ErrorImage('Neither GD nor ImageMagick seem to be installed on this server. At least one (preferably GD), or better both, MUST be installed for phpThumb to work.'); |
|
3936 | - } elseif ($HeaderFourBytes == "\xD7\xCD\xC6\x9A") { // WMF |
|
3937 | - return $this->ErrorImage($this->ImageMagickVersion() ? 'ImageMagick failed on WMF source conversion' : 'ImageMagick is unavailable and phpThumb() does not support WMF source images without it'); |
|
3938 | - } elseif ($HeaderFourBytes == '%PDF') { // "%PDF" |
|
3939 | - return $this->ErrorImage($this->ImageMagickVersion() ? 'ImageMagick and GhostScript are both required for PDF source images; GhostScript may not be properly configured' : 'ImageMagick and/or GhostScript are unavailable and phpThumb() does not support PDF source images without them'); |
|
3940 | - } elseif (substr($HeaderFourBytes, 0, 3) == "\xFF\xD8\xFF") { // JPEG |
|
3941 | - return $this->ErrorImage('Image (JPEG) is too large for PHP-GD memory_limit, please install ImageMagick or increase php.ini memory_limit setting'); |
|
3942 | - } elseif ($HeaderFourBytes == '%PNG') { // "%PNG" |
|
3943 | - return $this->ErrorImage('Image (PNG) is too large for PHP-GD memory_limit, please install ImageMagick or increase php.ini memory_limit setting'); |
|
3944 | - } elseif (substr($HeaderFourBytes, 0, 3) == 'GIF') { // GIF |
|
3945 | - return $this->ErrorImage('Image (GIF) is too large for PHP-GD memory_limit, please install ImageMagick or increase php.ini memory_limit setting'); |
|
3946 | - } |
|
3947 | - return $this->ErrorImage('Unknown image type identified by "'.$HeaderFourBytes.'" ('.phpthumb_functions::HexCharDisplay($HeaderFourBytes).') in SourceImageToGD() ['.__LINE__.']'); |
|
3948 | - } |
|
3949 | - } |
|
3950 | - |
|
3951 | - if (!$this->gdimg_source) { |
|
3952 | - if ($gdimg_exif_temp = $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data, false)) { |
|
3953 | - $this->DebugMessage('All other attempts failed, but successfully using EXIF thumbnail as source image', __FILE__, __LINE__); |
|
3954 | - $this->gdimg_source = $gdimg_exif_temp; |
|
3955 | - // override allow-enlarging setting if EXIF thumbnail is the only source available |
|
3956 | - // otherwise thumbnails larger than the EXIF thumbnail will be created at EXIF size |
|
3957 | - $this->aoe = true; |
|
3958 | - return true; |
|
3959 | - } |
|
3960 | - return false; |
|
3961 | - } |
|
3962 | - |
|
3963 | - $this->source_width = imagesx($this->gdimg_source); |
|
3964 | - $this->source_height = imagesy($this->gdimg_source); |
|
3965 | - return true; |
|
3966 | - } |
|
3967 | - |
|
3968 | - |
|
3969 | - public function phpThumbDebugVarDump($var) { |
|
3970 | - if (null === $var) { |
|
3971 | - return 'NULL'; |
|
3972 | - } elseif (is_bool($var)) { |
|
3973 | - return ($var ? 'TRUE' : 'FALSE'); |
|
3974 | - } elseif (is_string($var)) { |
|
3975 | - return 'string('.strlen($var).')'.str_repeat(' ', max(0, 3 - strlen(strlen($var)))).' "'.$var.'"'; |
|
3976 | - } elseif (is_int($var)) { |
|
3977 | - return 'integer '.$var; |
|
3978 | - } elseif (is_float($var)) { |
|
3979 | - return 'float '.$var; |
|
3980 | - } elseif (is_array($var)) { |
|
3981 | - ob_start(); |
|
3982 | - var_dump($var); |
|
3983 | - $vardumpoutput = ob_get_contents(); |
|
3984 | - ob_end_clean(); |
|
3985 | - return strtr($vardumpoutput, "\n\r\t", ' '); |
|
3986 | - } |
|
3987 | - return gettype($var); |
|
3988 | - } |
|
3989 | - |
|
3990 | - public function phpThumbDebug($level='') { |
|
3991 | - if ($level && ($this->phpThumbDebug !== $level)) { |
|
3992 | - return true; |
|
3993 | - } |
|
3994 | - if ($this->config_disable_debug) { |
|
3995 | - return $this->ErrorImage('phpThumbDebug disabled'); |
|
3996 | - } |
|
3997 | - |
|
3998 | - $FunctionsExistance = array('exif_thumbnail', 'gd_info', 'image_type_to_mime_type', 'getimagesize', 'imagecopyresampled', 'imagecopyresized', 'imagecreate', 'imagecreatefromstring', 'imagecreatetruecolor', 'imageistruecolor', 'imagerotate', 'imagetypes', 'version_compare', 'imagecreatefromgif', 'imagecreatefromjpeg', 'imagecreatefrompng', 'imagecreatefromwbmp', 'imagecreatefromxbm', 'imagecreatefromxpm', 'imagecreatefromstring', 'imagecreatefromgd', 'imagecreatefromgd2', 'imagecreatefromgd2part', 'imagejpeg', 'imagegif', 'imagepng', 'imagewbmp'); |
|
3999 | - $ParameterNames = array('src', 'new', 'w', 'h', 'f', 'q', 'sx', 'sy', 'sw', 'sh', 'far', 'bg', 'bc', 'file', 'goto', 'err', 'xto', 'ra', 'ar', 'aoe', 'iar', 'maxb'); |
|
4000 | - $ConfigVariableNames = array('document_root', 'temp_directory', 'output_format', 'output_maxwidth', 'output_maxheight', 'error_message_image_default', 'error_bgcolor', 'error_textcolor', 'error_fontsize', 'error_die_on_error', 'error_silent_die_on_error', 'error_die_on_source_failure', 'nohotlink_enabled', 'nohotlink_valid_domains', 'nohotlink_erase_image', 'nohotlink_text_message', 'nooffsitelink_enabled', 'nooffsitelink_valid_domains', 'nooffsitelink_require_refer', 'nooffsitelink_erase_image', 'nooffsitelink_text_message', 'high_security_enabled', 'allow_src_above_docroot', 'allow_src_above_phpthumb', 'max_source_pixels', 'use_exif_thumbnail_for_speed', 'border_hexcolor', 'background_hexcolor', 'ttf_directory', 'disable_pathinfo_parsing', 'disable_imagecopyresampled'); |
|
4001 | - $OtherVariableNames = array('phpThumbDebug', 'thumbnailQuality', 'thumbnailFormat', 'gdimg_output', 'gdimg_source', 'sourceFilename', 'source_width', 'source_height', 'thumbnailCropX', 'thumbnailCropY', 'thumbnailCropW', 'thumbnailCropH', 'exif_thumbnail_width', 'exif_thumbnail_height', 'exif_thumbnail_type', 'thumbnail_width', 'thumbnail_height', 'thumbnail_image_width', 'thumbnail_image_height'); |
|
4002 | - |
|
4003 | - $DebugOutput = array(); |
|
4004 | - $DebugOutput[] = 'phpThumb() version = '.$this->phpthumb_version; |
|
4005 | - $DebugOutput[] = 'phpversion() = '.@PHP_VERSION; |
|
4006 | - $DebugOutput[] = 'PHP_OS = '.PHP_OS; |
|
4007 | - $DebugOutput[] = '$_SERVER[SERVER_SOFTWARE] = '.@$_SERVER['SERVER_SOFTWARE']; |
|
4008 | - $DebugOutput[] = '__FILE__ = '.__FILE__; |
|
4009 | - $DebugOutput[] = 'realpath(.) = '.@realpath('.'); |
|
4010 | - $DebugOutput[] = '$_SERVER[PHP_SELF] = '.@$_SERVER['PHP_SELF']; |
|
4011 | - $DebugOutput[] = '$_SERVER[HOST_NAME] = '.@$_SERVER['HOST_NAME']; |
|
4012 | - $DebugOutput[] = '$_SERVER[HTTP_REFERER] = '.@$_SERVER['HTTP_REFERER']; |
|
4013 | - $DebugOutput[] = '$_SERVER[QUERY_STRING] = '.@$_SERVER['QUERY_STRING']; |
|
4014 | - $DebugOutput[] = '$_SERVER[PATH_INFO] = '.@$_SERVER['PATH_INFO']; |
|
4015 | - $DebugOutput[] = '$_SERVER[DOCUMENT_ROOT] = '.@$_SERVER['DOCUMENT_ROOT']; |
|
4016 | - $DebugOutput[] = 'getenv(DOCUMENT_ROOT) = '.@getenv('DOCUMENT_ROOT'); |
|
4017 | - $DebugOutput[] = ''; |
|
4018 | - |
|
4019 | - $DebugOutput[] = 'get_magic_quotes_gpc() = '.$this->phpThumbDebugVarDump(@get_magic_quotes_gpc()); |
|
4020 | - $DebugOutput[] = 'get_magic_quotes_runtime() = '.$this->phpThumbDebugVarDump(@get_magic_quotes_runtime()); |
|
4021 | - $DebugOutput[] = 'error_reporting() = '.$this->phpThumbDebugVarDump(error_reporting()); |
|
4022 | - $DebugOutput[] = 'ini_get(error_reporting) = '.$this->phpThumbDebugVarDump(@ini_get('error_reporting')); |
|
4023 | - $DebugOutput[] = 'ini_get(display_errors) = '.$this->phpThumbDebugVarDump(@ini_get('display_errors')); |
|
4024 | - $DebugOutput[] = 'ini_get(allow_url_fopen) = '.$this->phpThumbDebugVarDump(@ini_get('allow_url_fopen')); |
|
4025 | - $DebugOutput[] = 'ini_get(disable_functions) = '.$this->phpThumbDebugVarDump(@ini_get('disable_functions')); |
|
4026 | - $DebugOutput[] = 'get_cfg_var(disable_functions) = '.$this->phpThumbDebugVarDump(@get_cfg_var('disable_functions')); |
|
4027 | - $DebugOutput[] = 'ini_get(safe_mode) = '.$this->phpThumbDebugVarDump(@ini_get('safe_mode')); |
|
4028 | - $DebugOutput[] = 'ini_get(open_basedir) = '.$this->phpThumbDebugVarDump(@ini_get('open_basedir')); |
|
4029 | - $DebugOutput[] = 'ini_get(max_execution_time) = '.$this->phpThumbDebugVarDump(@ini_get('max_execution_time')); |
|
4030 | - $DebugOutput[] = 'ini_get(memory_limit) = '.$this->phpThumbDebugVarDump(@ini_get('memory_limit')); |
|
4031 | - $DebugOutput[] = 'get_cfg_var(memory_limit) = '.$this->phpThumbDebugVarDump(@get_cfg_var('memory_limit')); |
|
4032 | - $DebugOutput[] = 'memory_get_usage() = '.(function_exists('memory_get_usage') ? $this->phpThumbDebugVarDump(@memory_get_usage()) : 'n/a'); |
|
4033 | - $DebugOutput[] = ''; |
|
4034 | - |
|
4035 | - $DebugOutput[] = '$this->config_prefer_imagemagick = '.$this->phpThumbDebugVarDump($this->config_prefer_imagemagick); |
|
4036 | - $DebugOutput[] = '$this->config_imagemagick_path = '.$this->phpThumbDebugVarDump($this->config_imagemagick_path); |
|
4037 | - $DebugOutput[] = '$this->ImageMagickWhichConvert() = '.$this->ImageMagickWhichConvert(); |
|
4038 | - $IMpathUsed = ($this->config_imagemagick_path ? $this->config_imagemagick_path : $this->ImageMagickWhichConvert()); |
|
4039 | - $DebugOutput[] = '[actual ImageMagick path used] = '.$this->phpThumbDebugVarDump($IMpathUsed); |
|
4040 | - $DebugOutput[] = 'file_exists([actual ImageMagick path used]) = '.$this->phpThumbDebugVarDump(@file_exists($IMpathUsed)); |
|
4041 | - $DebugOutput[] = 'ImageMagickVersion(false) = '.$this->ImageMagickVersion(false); |
|
4042 | - $DebugOutput[] = 'ImageMagickVersion(true) = '.$this->ImageMagickVersion(true); |
|
4043 | - $DebugOutput[] = ''; |
|
4044 | - |
|
4045 | - $DebugOutput[] = '$this->config_cache_directory = '.$this->phpThumbDebugVarDump($this->config_cache_directory); |
|
4046 | - $DebugOutput[] = '$this->config_cache_directory_depth = '.$this->phpThumbDebugVarDump($this->config_cache_directory_depth); |
|
4047 | - $DebugOutput[] = '$this->config_cache_disable_warning = '.$this->phpThumbDebugVarDump($this->config_cache_disable_warning); |
|
4048 | - $DebugOutput[] = '$this->config_cache_maxage = '.$this->phpThumbDebugVarDump($this->config_cache_maxage); |
|
4049 | - $DebugOutput[] = '$this->config_cache_maxsize = '.$this->phpThumbDebugVarDump($this->config_cache_maxsize); |
|
4050 | - $DebugOutput[] = '$this->config_cache_maxfiles = '.$this->phpThumbDebugVarDump($this->config_cache_maxfiles); |
|
4051 | - $DebugOutput[] = '$this->config_cache_force_passthru = '.$this->phpThumbDebugVarDump($this->config_cache_force_passthru); |
|
4052 | - $DebugOutput[] = '$this->cache_filename = '.$this->phpThumbDebugVarDump($this->cache_filename); |
|
4053 | - $DebugOutput[] = 'is_readable($this->config_cache_directory) = '.$this->phpThumbDebugVarDump(@is_readable($this->config_cache_directory)); |
|
4054 | - $DebugOutput[] = 'is_writable($this->config_cache_directory) = '.$this->phpThumbDebugVarDump(@is_writable($this->config_cache_directory)); |
|
4055 | - $DebugOutput[] = 'is_readable($this->cache_filename) = '.$this->phpThumbDebugVarDump(@is_readable($this->cache_filename)); |
|
4056 | - $DebugOutput[] = 'is_writable($this->cache_filename) = '.(@file_exists($this->cache_filename) ? $this->phpThumbDebugVarDump(@is_writable($this->cache_filename)) : 'n/a'); |
|
4057 | - $DebugOutput[] = ''; |
|
4058 | - |
|
4059 | - foreach ($ConfigVariableNames as $varname) { |
|
4060 | - $varname = 'config_'.$varname; |
|
4061 | - $value = $this->$varname; |
|
4062 | - $DebugOutput[] = '$this->'.str_pad($varname, 37, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4063 | - } |
|
4064 | - $DebugOutput[] = ''; |
|
4065 | - foreach ($OtherVariableNames as $varname) { |
|
4066 | - $value = $this->$varname; |
|
4067 | - $DebugOutput[] = '$this->'.str_pad($varname, 27, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4068 | - } |
|
4069 | - $DebugOutput[] = 'strlen($this->rawImageData) = '.strlen(@$this->rawImageData); |
|
4070 | - $DebugOutput[] = 'strlen($this->exif_thumbnail_data) = '.strlen(@$this->exif_thumbnail_data); |
|
4071 | - $DebugOutput[] = ''; |
|
4072 | - |
|
4073 | - foreach ($ParameterNames as $varname) { |
|
4074 | - $value = $this->$varname; |
|
4075 | - $DebugOutput[] = '$this->'.str_pad($varname, 4, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4076 | - } |
|
4077 | - $DebugOutput[] = ''; |
|
4078 | - |
|
4079 | - foreach ($FunctionsExistance as $functionname) { |
|
4080 | - $DebugOutput[] = 'builtin_function_exists('.$functionname.')'.str_repeat(' ', 23 - strlen($functionname)).' = '.$this->phpThumbDebugVarDump(phpthumb_functions::builtin_function_exists($functionname)); |
|
4081 | - } |
|
4082 | - $DebugOutput[] = ''; |
|
4083 | - |
|
4084 | - $gd_info = gd_info(); |
|
4085 | - foreach ($gd_info as $key => $value) { |
|
4086 | - $DebugOutput[] = 'gd_info.'.str_pad($key, 34, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4087 | - } |
|
4088 | - $DebugOutput[] = ''; |
|
4089 | - |
|
4090 | - $exif_info = phpthumb_functions::exif_info(); |
|
4091 | - foreach ($exif_info as $key => $value) { |
|
4092 | - $DebugOutput[] = 'exif_info.'.str_pad($key, 26, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4093 | - } |
|
4094 | - $DebugOutput[] = ''; |
|
4095 | - |
|
4096 | - if ($ApacheLookupURIarray = phpthumb_functions::ApacheLookupURIarray(dirname(@$_SERVER['PHP_SELF']))) { |
|
4097 | - foreach ($ApacheLookupURIarray as $key => $value) { |
|
4098 | - $DebugOutput[] = 'ApacheLookupURIarray.'.str_pad($key, 15, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4099 | - } |
|
4100 | - } else { |
|
4101 | - $DebugOutput[] = 'ApacheLookupURIarray() -- FAILED'; |
|
4102 | - } |
|
4103 | - $DebugOutput[] = ''; |
|
4104 | - |
|
4105 | - if (isset($_GET) && is_array($_GET)) { |
|
4106 | - foreach ($_GET as $key => $value) { |
|
4107 | - $DebugOutput[] = '$_GET['.$key.']'.str_repeat(' ', 30 - strlen($key)).'= '.$this->phpThumbDebugVarDump($value); |
|
4108 | - } |
|
4109 | - } |
|
4110 | - if (isset($_POST) && is_array($_POST)) { |
|
4111 | - foreach ($_POST as $key => $value) { |
|
4112 | - $DebugOutput[] = '$_POST['.$key.']'.str_repeat(' ', 29 - strlen($key)).'= '.$this->phpThumbDebugVarDump($value); |
|
4113 | - } |
|
4114 | - } |
|
4115 | - $DebugOutput[] = ''; |
|
4116 | - |
|
4117 | - $DebugOutput[] = '$this->debugmessages:'; |
|
4118 | - foreach ($this->debugmessages as $errorstring) { |
|
4119 | - $DebugOutput[] = ' * '.$errorstring; |
|
4120 | - } |
|
4121 | - $DebugOutput[] = ''; |
|
4122 | - |
|
4123 | - $DebugOutput[] = '$this->debugtiming:'; |
|
4124 | - foreach ($this->debugtiming as $timestamp => $timingstring) { |
|
4125 | - $DebugOutput[] = ' * '.$timestamp.' '.$timingstring; |
|
4126 | - } |
|
4127 | - $DebugOutput[] = ' * Total processing time: '.number_format(max(array_keys($this->debugtiming)) - min(array_keys($this->debugtiming)), 6); |
|
4128 | - |
|
4129 | - $this->f = (isset($_GET['f']) ? $_GET['f'] : $this->f); // debug modes 0-2 don't recognize text mode otherwise |
|
4130 | - return $this->ErrorImage(implode("\n", $DebugOutput), 700, 500, true); |
|
4131 | - } |
|
4132 | - |
|
4133 | - public function FatalError($text) { |
|
4134 | - if (null === $this->fatalerror) { |
|
4135 | - $this->fatalerror = $text; |
|
4136 | - } |
|
4137 | - return true; |
|
4138 | - } |
|
4139 | - |
|
4140 | - public function ErrorImage($text, $width=0, $height=0, $forcedisplay=false) { |
|
4141 | - $width = ($width ? $width : $this->config_error_image_width); |
|
4142 | - $height = ($height ? $height : $this->config_error_image_height); |
|
4143 | - |
|
4144 | - $text = 'phpThumb() v'.$this->phpthumb_version."\n".'http://phpthumb.sourceforge.net'."\n\n".($this->config_disable_debug ? 'Error messages disabled.'."\n\n".'edit phpThumb.config.php and (temporarily) set'."\n".'$PHPTHUMB_CONFIG[\'disable_debug\'] = false;'."\n".'to view the details of this error' : $text); |
|
4145 | - |
|
4146 | - $this->FatalError($text); |
|
4147 | - $this->DebugMessage($text, __FILE__, __LINE__); |
|
4148 | - $this->purgeTempFiles(); |
|
4149 | - if ($this->config_error_silent_die_on_error) { |
|
4150 | - exit; |
|
4151 | - } |
|
4152 | - if ($this->phpThumbDebug && !$forcedisplay) { |
|
4153 | - return false; |
|
4154 | - } |
|
4155 | - if (!$this->config_error_die_on_error && !$forcedisplay) { |
|
4156 | - return false; |
|
4157 | - } |
|
4158 | - if ($this->err || $this->config_error_message_image_default) { |
|
4159 | - // Show generic custom error image instead of error message |
|
4160 | - // for use on production sites where you don't want debug messages |
|
4161 | - if (($this->err == 'showerror') || $this->phpThumbDebug) { |
|
4162 | - // fall through and actually show error message even if default error image is set |
|
4163 | - } else { |
|
4164 | - header('Location: '.($this->err ? $this->err : $this->config_error_message_image_default)); |
|
4165 | - exit; |
|
4166 | - } |
|
4167 | - } |
|
4168 | - $this->setOutputFormat(); |
|
4169 | - if (!$this->thumbnailFormat || !$this->config_disable_debug || (phpthumb_functions::gd_version() < 1)) { |
|
4170 | - $this->thumbnailFormat = 'text'; |
|
4171 | - } |
|
4172 | - if (@$this->thumbnailFormat == 'text') { |
|
4173 | - // bypass all GD functions and output text error message |
|
4174 | - if (!headers_sent()) { |
|
4175 | - header('Content-type: text/plain'); |
|
4176 | - echo $text; |
|
4177 | - } else { |
|
4178 | - echo '<pre>'.htmlspecialchars($text).'</pre>'; |
|
4179 | - } |
|
4180 | - exit; |
|
4181 | - } |
|
4182 | - |
|
4183 | - $FontWidth = imagefontwidth($this->config_error_fontsize); |
|
4184 | - $FontHeight = imagefontheight($this->config_error_fontsize); |
|
4185 | - |
|
4186 | - $LinesOfText = explode("\n", @wordwrap($text, floor($width / $FontWidth), "\n", true)); |
|
4187 | - $height = max($height, count($LinesOfText) * $FontHeight); |
|
4188 | - |
|
4189 | - $headers_file = ''; |
|
4190 | - $headers_line = ''; |
|
4191 | - if (phpthumb_functions::version_compare_replacement(PHP_VERSION, '4.3.0', '>=') && headers_sent($headers_file, $headers_line)) { |
|
4192 | - |
|
4193 | - echo "\n".'**Headers already sent in file "'.$headers_file.'" on line "'.$headers_line.'", dumping error message as text:**<br><pre>'."\n\n".$text."\n".'</pre>'; |
|
4194 | - |
|
4195 | - } elseif (headers_sent()) { |
|
4196 | - |
|
4197 | - echo "\n".'**Headers already sent, dumping error message as text:**<br><pre>'."\n\n".$text."\n".'</pre>'; |
|
4198 | - |
|
4199 | - } elseif ($gdimg_error = imagecreate($width, $height)) { |
|
4200 | - |
|
4201 | - $background_color = phpthumb_functions::ImageHexColorAllocate($gdimg_error, $this->config_error_bgcolor, true); |
|
4202 | - $text_color = phpthumb_functions::ImageHexColorAllocate($gdimg_error, $this->config_error_textcolor, true); |
|
4203 | - imagefilledrectangle($gdimg_error, 0, 0, $width, $height, $background_color); |
|
4204 | - $lineYoffset = 0; |
|
4205 | - foreach ($LinesOfText as $line) { |
|
4206 | - imagestring($gdimg_error, $this->config_error_fontsize, 2, $lineYoffset, $line, $text_color); |
|
4207 | - $lineYoffset += $FontHeight; |
|
4208 | - } |
|
4209 | - if (function_exists('imagetypes')) { |
|
4210 | - $imagetypes = imagetypes(); |
|
4211 | - if ($imagetypes & IMG_PNG) { |
|
4212 | - header('Content-Type: image/png'); |
|
4213 | - imagepng($gdimg_error); |
|
4214 | - } elseif ($imagetypes & IMG_GIF) { |
|
4215 | - header('Content-Type: image/gif'); |
|
4216 | - imagegif($gdimg_error); |
|
4217 | - } elseif ($imagetypes & IMG_JPG) { |
|
4218 | - header('Content-Type: image/jpeg'); |
|
4219 | - imagejpeg($gdimg_error); |
|
4220 | - } elseif ($imagetypes & IMG_WBMP) { |
|
4221 | - header('Content-Type: image/vnd.wap.wbmp'); |
|
4222 | - imagewbmp($gdimg_error); |
|
4223 | - } |
|
4224 | - } |
|
4225 | - imagedestroy($gdimg_error); |
|
4226 | - |
|
4227 | - } |
|
4228 | - if (!headers_sent()) { |
|
4229 | - echo "\n".'**Failed to send graphical error image, dumping error message as text:**<br>'."\n\n".$text; |
|
4230 | - } |
|
4231 | - exit; |
|
4232 | - } |
|
4233 | - |
|
4234 | - public function ImageCreateFromStringReplacement(&$RawImageData, $DieOnErrors=false) { |
|
4235 | - // there are serious bugs in the non-bundled versions of GD which may cause |
|
4236 | - // PHP to segfault when calling imagecreatefromstring() - avoid if at all possible |
|
4237 | - // when not using a bundled version of GD2 |
|
4238 | - if (!phpthumb_functions::gd_version()) { |
|
4239 | - if ($DieOnErrors) { |
|
4240 | - if (!headers_sent()) { |
|
4241 | - // base64-encoded error image in GIF format |
|
4242 | - $ERROR_NOGD = 'R0lGODlhIAAgALMAAAAAABQUFCQkJDY2NkZGRldXV2ZmZnJycoaGhpSUlKWlpbe3t8XFxdXV1eTk5P7+/iwAAAAAIAAgAAAE/vDJSau9WILtTAACUinDNijZtAHfCojS4W5H+qxD8xibIDE9h0OwWaRWDIljJSkUJYsN4bihMB8th3IToAKs1VtYM75cyV8sZ8vygtOE5yMKmGbO4jRdICQCjHdlZzwzNW4qZSQmKDaNjhUMBX4BBAlmMywFSRWEmAI6b5gAlhNxokGhooAIK5o/pi9vEw4Lfj4OLTAUpj6IabMtCwlSFw0DCKBoFqwAB04AjI54PyZ+yY3TD0ss2YcVmN/gvpcu4TOyFivWqYJlbAHPpOntvxNAACcmGHjZzAZqzSzcq5fNjxFmAFw9iFRunD1epU6tsIPmFCAJnWYE0FURk7wJDA0MTKpEzoWAAskiAAA7'; |
|
4243 | - header('Content-Type: image/gif'); |
|
4244 | - echo base64_decode($ERROR_NOGD); |
|
4245 | - } else { |
|
4246 | - echo '*** ERROR: No PHP-GD support available ***'; |
|
4247 | - } |
|
4248 | - exit; |
|
4249 | - } else { |
|
4250 | - $this->DebugMessage('ImageCreateFromStringReplacement() failed: gd_version says "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
4251 | - return false; |
|
4252 | - } |
|
4253 | - } |
|
4254 | - if (phpthumb_functions::gd_is_bundled()) { |
|
4255 | - $this->DebugMessage('ImageCreateFromStringReplacement() calling built-in imagecreatefromstring()', __FILE__, __LINE__); |
|
4256 | - return @imagecreatefromstring($RawImageData); |
|
4257 | - } |
|
4258 | - if ($this->issafemode) { |
|
4259 | - $this->DebugMessage('ImageCreateFromStringReplacement() failed: cannot create temp file in SAFE_MODE', __FILE__, __LINE__); |
|
4260 | - return false; |
|
4261 | - } |
|
4262 | - |
|
4263 | - switch (substr($RawImageData, 0, 3)) { |
|
4264 | - case 'GIF': |
|
4265 | - $ICFSreplacementFunctionName = 'imagecreatefromgif'; |
|
4266 | - break; |
|
4267 | - case "\xFF\xD8\xFF": |
|
4268 | - $ICFSreplacementFunctionName = 'imagecreatefromjpeg'; |
|
4269 | - break; |
|
4270 | - case "\x89".'PN': |
|
4271 | - $ICFSreplacementFunctionName = 'imagecreatefrompng'; |
|
4272 | - break; |
|
4273 | - default: |
|
4274 | - $this->DebugMessage('ImageCreateFromStringReplacement() failed: unknown fileformat signature "'.phpthumb_functions::HexCharDisplay(substr($RawImageData, 0, 3)).'"', __FILE__, __LINE__); |
|
4275 | - return false; |
|
4276 | - break; |
|
4277 | - } |
|
4278 | - $ErrorMessage = ''; |
|
4279 | - if ($tempnam = $this->phpThumb_tempnam()) { |
|
4280 | - if ($fp_tempnam = @fopen($tempnam, 'wb')) { |
|
4281 | - fwrite($fp_tempnam, $RawImageData); |
|
4282 | - fclose($fp_tempnam); |
|
4283 | - @chmod($tempnam, $this->getParameter('config_file_create_mask')); |
|
4284 | - if (($ICFSreplacementFunctionName == 'imagecreatefromgif') && !function_exists($ICFSreplacementFunctionName)) { |
|
4285 | - |
|
4286 | - // Need to create from GIF file, but imagecreatefromgif does not exist |
|
4287 | - ob_start(); |
|
4288 | - if (!@include_once( __DIR__ .'/phpthumb.gif.php')) { |
|
4289 | - $ErrorMessage = 'Failed to include required file "'. __DIR__ .'/phpthumb.gif.php" in '.__FILE__.' on line '.__LINE__; |
|
4290 | - $this->DebugMessage($ErrorMessage, __FILE__, __LINE__); |
|
4291 | - } |
|
4292 | - ob_end_clean(); |
|
4293 | - // gif_loadFileToGDimageResource() cannot read from raw data, write to file first |
|
4294 | - if ($tempfilename = $this->phpThumb_tempnam()) { |
|
4295 | - if ($fp_tempfile = @fopen($tempfilename, 'wb')) { |
|
4296 | - fwrite($fp_tempfile, $RawImageData); |
|
4297 | - fclose($fp_tempfile); |
|
4298 | - $gdimg_source = gif_loadFileToGDimageResource($tempfilename); |
|
4299 | - $this->DebugMessage('gif_loadFileToGDimageResource('.$tempfilename.') completed', __FILE__, __LINE__); |
|
4300 | - $this->DebugMessage('deleting "'.$tempfilename.'"', __FILE__, __LINE__); |
|
4301 | - unlink($tempfilename); |
|
4302 | - return $gdimg_source; |
|
4303 | - } else { |
|
4304 | - $ErrorMessage = 'Failed to open tempfile in '.__FILE__.' on line '.__LINE__; |
|
4305 | - $this->DebugMessage($ErrorMessage, __FILE__, __LINE__); |
|
4306 | - } |
|
4307 | - } else { |
|
4308 | - $ErrorMessage = 'Failed to open generate tempfile name in '.__FILE__.' on line '.__LINE__; |
|
4309 | - $this->DebugMessage($ErrorMessage, __FILE__, __LINE__); |
|
4310 | - } |
|
4311 | - |
|
4312 | - } elseif (function_exists($ICFSreplacementFunctionName) && ($gdimg_source = @$ICFSreplacementFunctionName($tempnam))) { |
|
4313 | - |
|
4314 | - // great |
|
4315 | - $this->DebugMessage($ICFSreplacementFunctionName.'('.$tempnam.') succeeded', __FILE__, __LINE__); |
|
4316 | - $this->DebugMessage('deleting "'.$tempnam.'"', __FILE__, __LINE__); |
|
4317 | - unlink($tempnam); |
|
4318 | - return $gdimg_source; |
|
4319 | - |
|
4320 | - } else { |
|
4321 | - |
|
4322 | - // GD functions not available, or failed to create image |
|
4323 | - $this->DebugMessage($ICFSreplacementFunctionName.'('.$tempnam.') '.(function_exists($ICFSreplacementFunctionName) ? 'failed' : 'does not exist'), __FILE__, __LINE__); |
|
4324 | - if (isset($_GET['phpThumbDebug'])) { |
|
4325 | - $this->phpThumbDebug(); |
|
4326 | - } |
|
4327 | - |
|
4328 | - } |
|
4329 | - } else { |
|
4330 | - $ErrorMessage = 'Failed to fopen('.$tempnam.', "wb") in '.__FILE__.' on line '.__LINE__."\n".'You may need to set $PHPTHUMB_CONFIG[temp_directory] in phpThumb.config.php'; |
|
4331 | - if ($this->issafemode) { |
|
4332 | - $ErrorMessage = 'ImageCreateFromStringReplacement() failed in '.__FILE__.' on line '.__LINE__.': cannot create temp file in SAFE_MODE'; |
|
4333 | - } |
|
4334 | - $this->DebugMessage($ErrorMessage, __FILE__, __LINE__); |
|
4335 | - } |
|
4336 | - $this->DebugMessage('deleting "'.$tempnam.'"', __FILE__, __LINE__); |
|
4337 | - @unlink($tempnam); |
|
4338 | - } else { |
|
4339 | - $ErrorMessage = 'Failed to generate phpThumb_tempnam() in '.__FILE__.' on line '.__LINE__."\n".'You may need to set $PHPTHUMB_CONFIG[temp_directory] in phpThumb.config.php'; |
|
4340 | - if ($this->issafemode) { |
|
4341 | - $ErrorMessage = 'ImageCreateFromStringReplacement() failed in '.__FILE__.' on line '.__LINE__.': cannot create temp file in SAFE_MODE'; |
|
4342 | - } |
|
4343 | - } |
|
4344 | - if ($DieOnErrors && $ErrorMessage) { |
|
4345 | - return $this->ErrorImage($ErrorMessage); |
|
4346 | - } |
|
4347 | - return false; |
|
4348 | - } |
|
4349 | - |
|
4350 | - public function ImageResizeFunction(&$dst_im, &$src_im, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH) { |
|
4351 | - $this->DebugMessage('ImageResizeFunction($o, $s, '.$dstX.', '.$dstY.', '.$srcX.', '.$srcY.', '.$dstW.', '.$dstH.', '.$srcW.', '.$srcH.')', __FILE__, __LINE__); |
|
4352 | - if (($dstW == $srcW) && ($dstH == $srcH)) { |
|
4353 | - return imagecopy($dst_im, $src_im, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH); |
|
4354 | - } |
|
4355 | - if (phpthumb_functions::gd_version() >= 2.0) { |
|
4356 | - if ($this->config_disable_imagecopyresampled) { |
|
4357 | - return phpthumb_functions::ImageCopyResampleBicubic($dst_im, $src_im, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH); |
|
4358 | - } |
|
4359 | - return imagecopyresampled($dst_im, $src_im, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH); |
|
4360 | - } |
|
4361 | - return imagecopyresized($dst_im, $src_im, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH); |
|
4362 | - } |
|
4363 | - |
|
4364 | - public function InitializeTempDirSetting() { |
|
4365 | - $this->config_temp_directory = ($this->config_temp_directory ? $this->config_temp_directory : $this->realPathSafe((function_exists('sys_get_temp_dir') ? sys_get_temp_dir() : ''))); // sys_get_temp_dir added in PHP v5.2.1 |
|
4366 | - $this->config_temp_directory = ($this->config_temp_directory ? $this->config_temp_directory : $this->realPathSafe(ini_get('upload_tmp_dir'))); |
|
4367 | - $this->config_temp_directory = ($this->config_temp_directory ? $this->config_temp_directory : $this->realPathSafe(getenv('TMPDIR'))); |
|
4368 | - $this->config_temp_directory = ($this->config_temp_directory ? $this->config_temp_directory : $this->realPathSafe(getenv('TMP'))); |
|
4369 | - return true; |
|
4370 | - } |
|
4371 | - |
|
4372 | - public function phpThumb_tempnam() { |
|
4373 | - $this->InitializeTempDirSetting(); |
|
4374 | - $tempnam = $this->realPathSafe(tempnam($this->config_temp_directory, 'pThumb')); |
|
4375 | - $this->tempFilesToDelete[$tempnam] = $tempnam; |
|
4376 | - $this->DebugMessage('phpThumb_tempnam() returning "'.$tempnam.'"', __FILE__, __LINE__); |
|
4377 | - return $tempnam; |
|
4378 | - } |
|
4379 | - |
|
4380 | - public function DebugMessage($message, $file='', $line='') { |
|
4381 | - $this->debugmessages[] = $message.($file ? ' in file "'.(basename($file) ? basename($file) : $file).'"' : '').($line ? ' on line '.$line : ''); |
|
4382 | - return true; |
|
4383 | - } |
|
4384 | - |
|
4385 | - public function DebugTimingMessage($message, $file='', $line='', $timestamp=0) { |
|
4386 | - if (!$timestamp) { |
|
4387 | - $timestamp = array_sum(explode(' ', microtime())); |
|
4388 | - } |
|
4389 | - $this->debugtiming[number_format($timestamp, 6, '.', '')] = ': '.$message.($file ? ' in file "'.(basename($file) ? basename($file) : $file).'"' : '').($line ? ' on line '.$line : ''); |
|
4390 | - return true; |
|
4391 | - } |
|
3746 | + } |
|
3747 | + |
|
3748 | + } elseif (!$this->gdimg_source && $this->sourceFilename) { |
|
3749 | + |
|
3750 | + if ($this->md5s && ($this->md5s != phpthumb_functions::md5_file_safe($this->sourceFilename))) { |
|
3751 | + return $this->ErrorImage('$this->md5s != md5(sourceFilename)'."\n".'"'.$this->md5s.'" != '."\n".'"'.phpthumb_functions::md5_file_safe($this->sourceFilename).'"'); |
|
3752 | + } |
|
3753 | + switch (@$this->getimagesizeinfo[2]) { |
|
3754 | + case 1: |
|
3755 | + case 3: |
|
3756 | + // GIF or PNG input file may have transparency |
|
3757 | + $this->is_alpha = true; |
|
3758 | + break; |
|
3759 | + } |
|
3760 | + if (!$this->SourceImageIsTooLarge($this->source_width, $this->source_height)) { |
|
3761 | + $this->gdimg_source = $this->ImageCreateFromFilename($this->sourceFilename); |
|
3762 | + } |
|
3763 | + |
|
3764 | + } |
|
3765 | + |
|
3766 | + while (true) { |
|
3767 | + if ($this->gdimg_source) { |
|
3768 | + $this->DebugMessage('Not using EXIF thumbnail data because $this->gdimg_source is already set', __FILE__, __LINE__); |
|
3769 | + break; |
|
3770 | + } |
|
3771 | + if (!$this->exif_thumbnail_data) { |
|
3772 | + $this->DebugMessage('Not using EXIF thumbnail data because $this->exif_thumbnail_data is empty', __FILE__, __LINE__); |
|
3773 | + break; |
|
3774 | + } |
|
3775 | + if (ini_get('safe_mode')) { |
|
3776 | + if (!$this->SourceImageIsTooLarge($this->source_width, $this->source_height)) { |
|
3777 | + $this->DebugMessage('Using EXIF thumbnail data because source image too large and safe_mode enabled', __FILE__, __LINE__); |
|
3778 | + $this->aoe = true; |
|
3779 | + } else { |
|
3780 | + break; |
|
3781 | + } |
|
3782 | + } else { |
|
3783 | + if (!$this->config_use_exif_thumbnail_for_speed) { |
|
3784 | + $this->DebugMessage('Not using EXIF thumbnail data because $this->config_use_exif_thumbnail_for_speed is FALSE', __FILE__, __LINE__); |
|
3785 | + break; |
|
3786 | + } |
|
3787 | + if (($this->thumbnailCropX != 0) || ($this->thumbnailCropY != 0)) { |
|
3788 | + $this->DebugMessage('Not using EXIF thumbnail data because source cropping is enabled ('.$this->thumbnailCropX.','.$this->thumbnailCropY.')', __FILE__, __LINE__); |
|
3789 | + break; |
|
3790 | + } |
|
3791 | + if (($this->w > $this->exif_thumbnail_width) || ($this->h > $this->exif_thumbnail_height)) { |
|
3792 | + $this->DebugMessage('Not using EXIF thumbnail data because EXIF thumbnail is too small ('.$this->exif_thumbnail_width.'x'.$this->exif_thumbnail_height.' vs '.$this->w.'x'.$this->h.')', __FILE__, __LINE__); |
|
3793 | + break; |
|
3794 | + } |
|
3795 | + $source_ar = $this->source_width / $this->source_height; |
|
3796 | + $exif_ar = $this->exif_thumbnail_width / $this->exif_thumbnail_height; |
|
3797 | + if (number_format($source_ar, 2) != number_format($exif_ar, 2)) { |
|
3798 | + $this->DebugMessage('not using EXIF thumbnail because $source_ar != $exif_ar ('.$source_ar.' != '.$exif_ar.')', __FILE__, __LINE__); |
|
3799 | + break; |
|
3800 | + } |
|
3801 | + } |
|
3802 | + |
|
3803 | + // EXIF thumbnail exists, and is equal to or larger than destination thumbnail, and will be use as source image |
|
3804 | + $this->DebugMessage('Trying to use EXIF thumbnail as source image', __FILE__, __LINE__); |
|
3805 | + |
|
3806 | + if ($gdimg_exif_temp = $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data, false)) { |
|
3807 | + |
|
3808 | + $this->DebugMessage('Successfully using EXIF thumbnail as source image', __FILE__, __LINE__); |
|
3809 | + $this->gdimg_source = $gdimg_exif_temp; |
|
3810 | + $this->source_width = $this->exif_thumbnail_width; |
|
3811 | + $this->source_height = $this->exif_thumbnail_height; |
|
3812 | + $this->thumbnailCropW = $this->source_width; |
|
3813 | + $this->thumbnailCropH = $this->source_height; |
|
3814 | + return true; |
|
3815 | + |
|
3816 | + } else { |
|
3817 | + $this->DebugMessage('$this->ImageCreateFromStringReplacement($this->exif_thumbnail_data, false) failed', __FILE__, __LINE__); |
|
3818 | + } |
|
3819 | + |
|
3820 | + break; |
|
3821 | + } |
|
3822 | + |
|
3823 | + if (!$this->gdimg_source) { |
|
3824 | + $this->DebugMessage('$this->gdimg_source is still empty', __FILE__, __LINE__); |
|
3825 | + |
|
3826 | + $this->DebugMessage('ImageMagickThumbnailToGD() failed', __FILE__, __LINE__); |
|
3827 | + |
|
3828 | + $imageHeader = ''; |
|
3829 | + $gd_info = gd_info(); |
|
3830 | + $GDreadSupport = false; |
|
3831 | + switch (@$this->getimagesizeinfo[2]) { |
|
3832 | + case 1: |
|
3833 | + $imageHeader = 'Content-Type: image/gif'; |
|
3834 | + $GDreadSupport = (bool) @$gd_info['GIF Read Support']; |
|
3835 | + break; |
|
3836 | + case 2: |
|
3837 | + $imageHeader = 'Content-Type: image/jpeg'; |
|
3838 | + $GDreadSupport = (bool) @$gd_info['JPG Support']; |
|
3839 | + break; |
|
3840 | + case 3: |
|
3841 | + $imageHeader = 'Content-Type: image/png'; |
|
3842 | + $GDreadSupport = (bool) @$gd_info['PNG Support']; |
|
3843 | + break; |
|
3844 | + } |
|
3845 | + if ($imageHeader) { |
|
3846 | + // cannot create image for whatever reason (maybe imagecreatefromjpeg et al are not available?) |
|
3847 | + // and ImageMagick is not available either, no choice but to output original (not resized/modified) data and exit |
|
3848 | + if ($this->config_error_die_on_source_failure) { |
|
3849 | + $errormessages = array(); |
|
3850 | + $errormessages[] = 'All attempts to create GD image source failed.'; |
|
3851 | + if ($this->fatalerror) { |
|
3852 | + $errormessages[] = $this->fatalerror; |
|
3853 | + } |
|
3854 | + if ($this->issafemode) { |
|
3855 | + $errormessages[] = 'Safe Mode enabled, therefore ImageMagick is unavailable. (disable Safe Mode if possible)'; |
|
3856 | + } elseif (!$this->ImageMagickVersion()) { |
|
3857 | + $errormessages[] = 'ImageMagick is not installed (it is highly recommended that you install it).'; |
|
3858 | + } |
|
3859 | + if ($this->SourceImageIsTooLarge($this->getimagesizeinfo[0], $this->getimagesizeinfo[1])) { |
|
3860 | + $memory_get_usage = (function_exists('memory_get_usage') ? memory_get_usage() : 0); |
|
3861 | + $errormessages[] = 'Source image is too large ('.$this->getimagesizeinfo[0].'x'.$this->getimagesizeinfo[1].' = '.number_format($this->getimagesizeinfo[0] * $this->getimagesizeinfo[1] / 1000000, 1).'Mpx, max='.number_format($this->config_max_source_pixels / 1000000, 1).'Mpx) for GD creation (either install ImageMagick or increase PHP memory_limit to at least '.ceil(($memory_get_usage + (5 * $this->getimagesizeinfo[0] * $this->getimagesizeinfo[1])) / 1048576).'M).'; |
|
3862 | + } elseif (!$GDreadSupport) { |
|
3863 | + $errormessages[] = 'GD does not have read support for "'.$imageHeader.'".'; |
|
3864 | + } else { |
|
3865 | + $errormessages[] = 'Source image probably corrupt.'; |
|
3866 | + } |
|
3867 | + $this->ErrorImage(implode("\n", $errormessages)); |
|
3868 | + |
|
3869 | + } else { |
|
3870 | + $this->DebugMessage('All attempts to create GD image source failed ('.(ini_get('safe_mode') ? 'Safe Mode enabled, ImageMagick unavailable and source image probably too large for GD': ($GDreadSupport ? 'source image probably corrupt' : 'GD does not have read support for "'.$imageHeader.'"')).'), cannot generate thumbnail'); |
|
3871 | + //$this->DebugMessage('All attempts to create GD image source failed ('.($GDreadSupport ? 'source image probably corrupt' : 'GD does not have read support for "'.$imageHeader.'"').'), outputing raw image', __FILE__, __LINE__); |
|
3872 | + //if (!$this->phpThumbDebug) { |
|
3873 | + // header($imageHeader); |
|
3874 | + // echo $this->rawImageData; |
|
3875 | + // exit; |
|
3876 | + //} |
|
3877 | + return false; |
|
3878 | + } |
|
3879 | + } |
|
3880 | + |
|
3881 | + //switch (substr($this->rawImageData, 0, 2)) { |
|
3882 | + // case 'BM': |
|
3883 | + switch (@$this->getimagesizeinfo[2]) { |
|
3884 | + case 6: |
|
3885 | + ob_start(); |
|
3886 | + if (!@include_once( __DIR__ .'/phpthumb.bmp.php')) { |
|
3887 | + ob_end_clean(); |
|
3888 | + return $this->ErrorImage('include_once('. __DIR__ .'/phpthumb.bmp.php) failed'); |
|
3889 | + } |
|
3890 | + ob_end_clean(); |
|
3891 | + if ($fp = @fopen($this->sourceFilename, 'rb')) { |
|
3892 | + $this->rawImageData = ''; |
|
3893 | + while (!feof($fp)) { |
|
3894 | + $this->rawImageData .= fread($fp, 32768); |
|
3895 | + } |
|
3896 | + fclose($fp); |
|
3897 | + } |
|
3898 | + $phpthumb_bmp = new phpthumb_bmp(); |
|
3899 | + $this->gdimg_source = $phpthumb_bmp->phpthumb_bmp2gd($this->rawImageData, (phpthumb_functions::gd_version() >= 2.0)); |
|
3900 | + unset($phpthumb_bmp); |
|
3901 | + if ($this->gdimg_source) { |
|
3902 | + $this->DebugMessage('$phpthumb_bmp->phpthumb_bmp2gd() succeeded', __FILE__, __LINE__); |
|
3903 | + } else { |
|
3904 | + return $this->ErrorImage($this->ImageMagickVersion() ? 'ImageMagick failed on BMP source conversion' : 'phpthumb_bmp2gd() failed'); |
|
3905 | + } |
|
3906 | + break; |
|
3907 | + //} |
|
3908 | + //switch (substr($this->rawImageData, 0, 4)) { |
|
3909 | + // case 'II'."\x2A\x00": |
|
3910 | + // case 'MM'."\x00\x2A": |
|
3911 | + case 7: |
|
3912 | + case 8: |
|
3913 | + return $this->ErrorImage($this->ImageMagickVersion() ? 'ImageMagick failed on TIFF source conversion' : 'ImageMagick is unavailable and phpThumb() does not support TIFF source images without it'); |
|
3914 | + break; |
|
3915 | + |
|
3916 | + //case "\xD7\xCD\xC6\x9A": |
|
3917 | + // return $this->ErrorImage($this->ImageMagickVersion() ? 'ImageMagick failed on WMF source conversion' : 'ImageMagick is unavailable and phpThumb() does not support WMF source images without it'); |
|
3918 | + // break; |
|
3919 | + } |
|
3920 | + |
|
3921 | + if (!$this->gdimg_source) { |
|
3922 | + if ($this->rawImageData) { |
|
3923 | + $HeaderFourBytes = substr($this->rawImageData, 0, 4); |
|
3924 | + } elseif ($this->sourceFilename) { |
|
3925 | + if ($fp = @fopen($this->sourceFilename, 'rb')) { |
|
3926 | + $HeaderFourBytes = fread($fp, 4); |
|
3927 | + fclose($fp); |
|
3928 | + } else { |
|
3929 | + return $this->ErrorImage('failed to open "'.$this->sourceFilename.'" SourceImageToGD() ['.__LINE__.']'); |
|
3930 | + } |
|
3931 | + } else { |
|
3932 | + return $this->ErrorImage('Unable to create image, neither filename nor image data suppplied in SourceImageToGD() ['.__LINE__.']'); |
|
3933 | + } |
|
3934 | + if (!$this->ImageMagickVersion() && !phpthumb_functions::gd_version()) { |
|
3935 | + return $this->ErrorImage('Neither GD nor ImageMagick seem to be installed on this server. At least one (preferably GD), or better both, MUST be installed for phpThumb to work.'); |
|
3936 | + } elseif ($HeaderFourBytes == "\xD7\xCD\xC6\x9A") { // WMF |
|
3937 | + return $this->ErrorImage($this->ImageMagickVersion() ? 'ImageMagick failed on WMF source conversion' : 'ImageMagick is unavailable and phpThumb() does not support WMF source images without it'); |
|
3938 | + } elseif ($HeaderFourBytes == '%PDF') { // "%PDF" |
|
3939 | + return $this->ErrorImage($this->ImageMagickVersion() ? 'ImageMagick and GhostScript are both required for PDF source images; GhostScript may not be properly configured' : 'ImageMagick and/or GhostScript are unavailable and phpThumb() does not support PDF source images without them'); |
|
3940 | + } elseif (substr($HeaderFourBytes, 0, 3) == "\xFF\xD8\xFF") { // JPEG |
|
3941 | + return $this->ErrorImage('Image (JPEG) is too large for PHP-GD memory_limit, please install ImageMagick or increase php.ini memory_limit setting'); |
|
3942 | + } elseif ($HeaderFourBytes == '%PNG') { // "%PNG" |
|
3943 | + return $this->ErrorImage('Image (PNG) is too large for PHP-GD memory_limit, please install ImageMagick or increase php.ini memory_limit setting'); |
|
3944 | + } elseif (substr($HeaderFourBytes, 0, 3) == 'GIF') { // GIF |
|
3945 | + return $this->ErrorImage('Image (GIF) is too large for PHP-GD memory_limit, please install ImageMagick or increase php.ini memory_limit setting'); |
|
3946 | + } |
|
3947 | + return $this->ErrorImage('Unknown image type identified by "'.$HeaderFourBytes.'" ('.phpthumb_functions::HexCharDisplay($HeaderFourBytes).') in SourceImageToGD() ['.__LINE__.']'); |
|
3948 | + } |
|
3949 | + } |
|
3950 | + |
|
3951 | + if (!$this->gdimg_source) { |
|
3952 | + if ($gdimg_exif_temp = $this->ImageCreateFromStringReplacement($this->exif_thumbnail_data, false)) { |
|
3953 | + $this->DebugMessage('All other attempts failed, but successfully using EXIF thumbnail as source image', __FILE__, __LINE__); |
|
3954 | + $this->gdimg_source = $gdimg_exif_temp; |
|
3955 | + // override allow-enlarging setting if EXIF thumbnail is the only source available |
|
3956 | + // otherwise thumbnails larger than the EXIF thumbnail will be created at EXIF size |
|
3957 | + $this->aoe = true; |
|
3958 | + return true; |
|
3959 | + } |
|
3960 | + return false; |
|
3961 | + } |
|
3962 | + |
|
3963 | + $this->source_width = imagesx($this->gdimg_source); |
|
3964 | + $this->source_height = imagesy($this->gdimg_source); |
|
3965 | + return true; |
|
3966 | + } |
|
3967 | + |
|
3968 | + |
|
3969 | + public function phpThumbDebugVarDump($var) { |
|
3970 | + if (null === $var) { |
|
3971 | + return 'NULL'; |
|
3972 | + } elseif (is_bool($var)) { |
|
3973 | + return ($var ? 'TRUE' : 'FALSE'); |
|
3974 | + } elseif (is_string($var)) { |
|
3975 | + return 'string('.strlen($var).')'.str_repeat(' ', max(0, 3 - strlen(strlen($var)))).' "'.$var.'"'; |
|
3976 | + } elseif (is_int($var)) { |
|
3977 | + return 'integer '.$var; |
|
3978 | + } elseif (is_float($var)) { |
|
3979 | + return 'float '.$var; |
|
3980 | + } elseif (is_array($var)) { |
|
3981 | + ob_start(); |
|
3982 | + var_dump($var); |
|
3983 | + $vardumpoutput = ob_get_contents(); |
|
3984 | + ob_end_clean(); |
|
3985 | + return strtr($vardumpoutput, "\n\r\t", ' '); |
|
3986 | + } |
|
3987 | + return gettype($var); |
|
3988 | + } |
|
3989 | + |
|
3990 | + public function phpThumbDebug($level='') { |
|
3991 | + if ($level && ($this->phpThumbDebug !== $level)) { |
|
3992 | + return true; |
|
3993 | + } |
|
3994 | + if ($this->config_disable_debug) { |
|
3995 | + return $this->ErrorImage('phpThumbDebug disabled'); |
|
3996 | + } |
|
3997 | + |
|
3998 | + $FunctionsExistance = array('exif_thumbnail', 'gd_info', 'image_type_to_mime_type', 'getimagesize', 'imagecopyresampled', 'imagecopyresized', 'imagecreate', 'imagecreatefromstring', 'imagecreatetruecolor', 'imageistruecolor', 'imagerotate', 'imagetypes', 'version_compare', 'imagecreatefromgif', 'imagecreatefromjpeg', 'imagecreatefrompng', 'imagecreatefromwbmp', 'imagecreatefromxbm', 'imagecreatefromxpm', 'imagecreatefromstring', 'imagecreatefromgd', 'imagecreatefromgd2', 'imagecreatefromgd2part', 'imagejpeg', 'imagegif', 'imagepng', 'imagewbmp'); |
|
3999 | + $ParameterNames = array('src', 'new', 'w', 'h', 'f', 'q', 'sx', 'sy', 'sw', 'sh', 'far', 'bg', 'bc', 'file', 'goto', 'err', 'xto', 'ra', 'ar', 'aoe', 'iar', 'maxb'); |
|
4000 | + $ConfigVariableNames = array('document_root', 'temp_directory', 'output_format', 'output_maxwidth', 'output_maxheight', 'error_message_image_default', 'error_bgcolor', 'error_textcolor', 'error_fontsize', 'error_die_on_error', 'error_silent_die_on_error', 'error_die_on_source_failure', 'nohotlink_enabled', 'nohotlink_valid_domains', 'nohotlink_erase_image', 'nohotlink_text_message', 'nooffsitelink_enabled', 'nooffsitelink_valid_domains', 'nooffsitelink_require_refer', 'nooffsitelink_erase_image', 'nooffsitelink_text_message', 'high_security_enabled', 'allow_src_above_docroot', 'allow_src_above_phpthumb', 'max_source_pixels', 'use_exif_thumbnail_for_speed', 'border_hexcolor', 'background_hexcolor', 'ttf_directory', 'disable_pathinfo_parsing', 'disable_imagecopyresampled'); |
|
4001 | + $OtherVariableNames = array('phpThumbDebug', 'thumbnailQuality', 'thumbnailFormat', 'gdimg_output', 'gdimg_source', 'sourceFilename', 'source_width', 'source_height', 'thumbnailCropX', 'thumbnailCropY', 'thumbnailCropW', 'thumbnailCropH', 'exif_thumbnail_width', 'exif_thumbnail_height', 'exif_thumbnail_type', 'thumbnail_width', 'thumbnail_height', 'thumbnail_image_width', 'thumbnail_image_height'); |
|
4002 | + |
|
4003 | + $DebugOutput = array(); |
|
4004 | + $DebugOutput[] = 'phpThumb() version = '.$this->phpthumb_version; |
|
4005 | + $DebugOutput[] = 'phpversion() = '.@PHP_VERSION; |
|
4006 | + $DebugOutput[] = 'PHP_OS = '.PHP_OS; |
|
4007 | + $DebugOutput[] = '$_SERVER[SERVER_SOFTWARE] = '.@$_SERVER['SERVER_SOFTWARE']; |
|
4008 | + $DebugOutput[] = '__FILE__ = '.__FILE__; |
|
4009 | + $DebugOutput[] = 'realpath(.) = '.@realpath('.'); |
|
4010 | + $DebugOutput[] = '$_SERVER[PHP_SELF] = '.@$_SERVER['PHP_SELF']; |
|
4011 | + $DebugOutput[] = '$_SERVER[HOST_NAME] = '.@$_SERVER['HOST_NAME']; |
|
4012 | + $DebugOutput[] = '$_SERVER[HTTP_REFERER] = '.@$_SERVER['HTTP_REFERER']; |
|
4013 | + $DebugOutput[] = '$_SERVER[QUERY_STRING] = '.@$_SERVER['QUERY_STRING']; |
|
4014 | + $DebugOutput[] = '$_SERVER[PATH_INFO] = '.@$_SERVER['PATH_INFO']; |
|
4015 | + $DebugOutput[] = '$_SERVER[DOCUMENT_ROOT] = '.@$_SERVER['DOCUMENT_ROOT']; |
|
4016 | + $DebugOutput[] = 'getenv(DOCUMENT_ROOT) = '.@getenv('DOCUMENT_ROOT'); |
|
4017 | + $DebugOutput[] = ''; |
|
4018 | + |
|
4019 | + $DebugOutput[] = 'get_magic_quotes_gpc() = '.$this->phpThumbDebugVarDump(@get_magic_quotes_gpc()); |
|
4020 | + $DebugOutput[] = 'get_magic_quotes_runtime() = '.$this->phpThumbDebugVarDump(@get_magic_quotes_runtime()); |
|
4021 | + $DebugOutput[] = 'error_reporting() = '.$this->phpThumbDebugVarDump(error_reporting()); |
|
4022 | + $DebugOutput[] = 'ini_get(error_reporting) = '.$this->phpThumbDebugVarDump(@ini_get('error_reporting')); |
|
4023 | + $DebugOutput[] = 'ini_get(display_errors) = '.$this->phpThumbDebugVarDump(@ini_get('display_errors')); |
|
4024 | + $DebugOutput[] = 'ini_get(allow_url_fopen) = '.$this->phpThumbDebugVarDump(@ini_get('allow_url_fopen')); |
|
4025 | + $DebugOutput[] = 'ini_get(disable_functions) = '.$this->phpThumbDebugVarDump(@ini_get('disable_functions')); |
|
4026 | + $DebugOutput[] = 'get_cfg_var(disable_functions) = '.$this->phpThumbDebugVarDump(@get_cfg_var('disable_functions')); |
|
4027 | + $DebugOutput[] = 'ini_get(safe_mode) = '.$this->phpThumbDebugVarDump(@ini_get('safe_mode')); |
|
4028 | + $DebugOutput[] = 'ini_get(open_basedir) = '.$this->phpThumbDebugVarDump(@ini_get('open_basedir')); |
|
4029 | + $DebugOutput[] = 'ini_get(max_execution_time) = '.$this->phpThumbDebugVarDump(@ini_get('max_execution_time')); |
|
4030 | + $DebugOutput[] = 'ini_get(memory_limit) = '.$this->phpThumbDebugVarDump(@ini_get('memory_limit')); |
|
4031 | + $DebugOutput[] = 'get_cfg_var(memory_limit) = '.$this->phpThumbDebugVarDump(@get_cfg_var('memory_limit')); |
|
4032 | + $DebugOutput[] = 'memory_get_usage() = '.(function_exists('memory_get_usage') ? $this->phpThumbDebugVarDump(@memory_get_usage()) : 'n/a'); |
|
4033 | + $DebugOutput[] = ''; |
|
4034 | + |
|
4035 | + $DebugOutput[] = '$this->config_prefer_imagemagick = '.$this->phpThumbDebugVarDump($this->config_prefer_imagemagick); |
|
4036 | + $DebugOutput[] = '$this->config_imagemagick_path = '.$this->phpThumbDebugVarDump($this->config_imagemagick_path); |
|
4037 | + $DebugOutput[] = '$this->ImageMagickWhichConvert() = '.$this->ImageMagickWhichConvert(); |
|
4038 | + $IMpathUsed = ($this->config_imagemagick_path ? $this->config_imagemagick_path : $this->ImageMagickWhichConvert()); |
|
4039 | + $DebugOutput[] = '[actual ImageMagick path used] = '.$this->phpThumbDebugVarDump($IMpathUsed); |
|
4040 | + $DebugOutput[] = 'file_exists([actual ImageMagick path used]) = '.$this->phpThumbDebugVarDump(@file_exists($IMpathUsed)); |
|
4041 | + $DebugOutput[] = 'ImageMagickVersion(false) = '.$this->ImageMagickVersion(false); |
|
4042 | + $DebugOutput[] = 'ImageMagickVersion(true) = '.$this->ImageMagickVersion(true); |
|
4043 | + $DebugOutput[] = ''; |
|
4044 | + |
|
4045 | + $DebugOutput[] = '$this->config_cache_directory = '.$this->phpThumbDebugVarDump($this->config_cache_directory); |
|
4046 | + $DebugOutput[] = '$this->config_cache_directory_depth = '.$this->phpThumbDebugVarDump($this->config_cache_directory_depth); |
|
4047 | + $DebugOutput[] = '$this->config_cache_disable_warning = '.$this->phpThumbDebugVarDump($this->config_cache_disable_warning); |
|
4048 | + $DebugOutput[] = '$this->config_cache_maxage = '.$this->phpThumbDebugVarDump($this->config_cache_maxage); |
|
4049 | + $DebugOutput[] = '$this->config_cache_maxsize = '.$this->phpThumbDebugVarDump($this->config_cache_maxsize); |
|
4050 | + $DebugOutput[] = '$this->config_cache_maxfiles = '.$this->phpThumbDebugVarDump($this->config_cache_maxfiles); |
|
4051 | + $DebugOutput[] = '$this->config_cache_force_passthru = '.$this->phpThumbDebugVarDump($this->config_cache_force_passthru); |
|
4052 | + $DebugOutput[] = '$this->cache_filename = '.$this->phpThumbDebugVarDump($this->cache_filename); |
|
4053 | + $DebugOutput[] = 'is_readable($this->config_cache_directory) = '.$this->phpThumbDebugVarDump(@is_readable($this->config_cache_directory)); |
|
4054 | + $DebugOutput[] = 'is_writable($this->config_cache_directory) = '.$this->phpThumbDebugVarDump(@is_writable($this->config_cache_directory)); |
|
4055 | + $DebugOutput[] = 'is_readable($this->cache_filename) = '.$this->phpThumbDebugVarDump(@is_readable($this->cache_filename)); |
|
4056 | + $DebugOutput[] = 'is_writable($this->cache_filename) = '.(@file_exists($this->cache_filename) ? $this->phpThumbDebugVarDump(@is_writable($this->cache_filename)) : 'n/a'); |
|
4057 | + $DebugOutput[] = ''; |
|
4058 | + |
|
4059 | + foreach ($ConfigVariableNames as $varname) { |
|
4060 | + $varname = 'config_'.$varname; |
|
4061 | + $value = $this->$varname; |
|
4062 | + $DebugOutput[] = '$this->'.str_pad($varname, 37, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4063 | + } |
|
4064 | + $DebugOutput[] = ''; |
|
4065 | + foreach ($OtherVariableNames as $varname) { |
|
4066 | + $value = $this->$varname; |
|
4067 | + $DebugOutput[] = '$this->'.str_pad($varname, 27, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4068 | + } |
|
4069 | + $DebugOutput[] = 'strlen($this->rawImageData) = '.strlen(@$this->rawImageData); |
|
4070 | + $DebugOutput[] = 'strlen($this->exif_thumbnail_data) = '.strlen(@$this->exif_thumbnail_data); |
|
4071 | + $DebugOutput[] = ''; |
|
4072 | + |
|
4073 | + foreach ($ParameterNames as $varname) { |
|
4074 | + $value = $this->$varname; |
|
4075 | + $DebugOutput[] = '$this->'.str_pad($varname, 4, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4076 | + } |
|
4077 | + $DebugOutput[] = ''; |
|
4078 | + |
|
4079 | + foreach ($FunctionsExistance as $functionname) { |
|
4080 | + $DebugOutput[] = 'builtin_function_exists('.$functionname.')'.str_repeat(' ', 23 - strlen($functionname)).' = '.$this->phpThumbDebugVarDump(phpthumb_functions::builtin_function_exists($functionname)); |
|
4081 | + } |
|
4082 | + $DebugOutput[] = ''; |
|
4083 | + |
|
4084 | + $gd_info = gd_info(); |
|
4085 | + foreach ($gd_info as $key => $value) { |
|
4086 | + $DebugOutput[] = 'gd_info.'.str_pad($key, 34, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4087 | + } |
|
4088 | + $DebugOutput[] = ''; |
|
4089 | + |
|
4090 | + $exif_info = phpthumb_functions::exif_info(); |
|
4091 | + foreach ($exif_info as $key => $value) { |
|
4092 | + $DebugOutput[] = 'exif_info.'.str_pad($key, 26, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4093 | + } |
|
4094 | + $DebugOutput[] = ''; |
|
4095 | + |
|
4096 | + if ($ApacheLookupURIarray = phpthumb_functions::ApacheLookupURIarray(dirname(@$_SERVER['PHP_SELF']))) { |
|
4097 | + foreach ($ApacheLookupURIarray as $key => $value) { |
|
4098 | + $DebugOutput[] = 'ApacheLookupURIarray.'.str_pad($key, 15, ' ', STR_PAD_RIGHT).' = '.$this->phpThumbDebugVarDump($value); |
|
4099 | + } |
|
4100 | + } else { |
|
4101 | + $DebugOutput[] = 'ApacheLookupURIarray() -- FAILED'; |
|
4102 | + } |
|
4103 | + $DebugOutput[] = ''; |
|
4104 | + |
|
4105 | + if (isset($_GET) && is_array($_GET)) { |
|
4106 | + foreach ($_GET as $key => $value) { |
|
4107 | + $DebugOutput[] = '$_GET['.$key.']'.str_repeat(' ', 30 - strlen($key)).'= '.$this->phpThumbDebugVarDump($value); |
|
4108 | + } |
|
4109 | + } |
|
4110 | + if (isset($_POST) && is_array($_POST)) { |
|
4111 | + foreach ($_POST as $key => $value) { |
|
4112 | + $DebugOutput[] = '$_POST['.$key.']'.str_repeat(' ', 29 - strlen($key)).'= '.$this->phpThumbDebugVarDump($value); |
|
4113 | + } |
|
4114 | + } |
|
4115 | + $DebugOutput[] = ''; |
|
4116 | + |
|
4117 | + $DebugOutput[] = '$this->debugmessages:'; |
|
4118 | + foreach ($this->debugmessages as $errorstring) { |
|
4119 | + $DebugOutput[] = ' * '.$errorstring; |
|
4120 | + } |
|
4121 | + $DebugOutput[] = ''; |
|
4122 | + |
|
4123 | + $DebugOutput[] = '$this->debugtiming:'; |
|
4124 | + foreach ($this->debugtiming as $timestamp => $timingstring) { |
|
4125 | + $DebugOutput[] = ' * '.$timestamp.' '.$timingstring; |
|
4126 | + } |
|
4127 | + $DebugOutput[] = ' * Total processing time: '.number_format(max(array_keys($this->debugtiming)) - min(array_keys($this->debugtiming)), 6); |
|
4128 | + |
|
4129 | + $this->f = (isset($_GET['f']) ? $_GET['f'] : $this->f); // debug modes 0-2 don't recognize text mode otherwise |
|
4130 | + return $this->ErrorImage(implode("\n", $DebugOutput), 700, 500, true); |
|
4131 | + } |
|
4132 | + |
|
4133 | + public function FatalError($text) { |
|
4134 | + if (null === $this->fatalerror) { |
|
4135 | + $this->fatalerror = $text; |
|
4136 | + } |
|
4137 | + return true; |
|
4138 | + } |
|
4139 | + |
|
4140 | + public function ErrorImage($text, $width=0, $height=0, $forcedisplay=false) { |
|
4141 | + $width = ($width ? $width : $this->config_error_image_width); |
|
4142 | + $height = ($height ? $height : $this->config_error_image_height); |
|
4143 | + |
|
4144 | + $text = 'phpThumb() v'.$this->phpthumb_version."\n".'http://phpthumb.sourceforge.net'."\n\n".($this->config_disable_debug ? 'Error messages disabled.'."\n\n".'edit phpThumb.config.php and (temporarily) set'."\n".'$PHPTHUMB_CONFIG[\'disable_debug\'] = false;'."\n".'to view the details of this error' : $text); |
|
4145 | + |
|
4146 | + $this->FatalError($text); |
|
4147 | + $this->DebugMessage($text, __FILE__, __LINE__); |
|
4148 | + $this->purgeTempFiles(); |
|
4149 | + if ($this->config_error_silent_die_on_error) { |
|
4150 | + exit; |
|
4151 | + } |
|
4152 | + if ($this->phpThumbDebug && !$forcedisplay) { |
|
4153 | + return false; |
|
4154 | + } |
|
4155 | + if (!$this->config_error_die_on_error && !$forcedisplay) { |
|
4156 | + return false; |
|
4157 | + } |
|
4158 | + if ($this->err || $this->config_error_message_image_default) { |
|
4159 | + // Show generic custom error image instead of error message |
|
4160 | + // for use on production sites where you don't want debug messages |
|
4161 | + if (($this->err == 'showerror') || $this->phpThumbDebug) { |
|
4162 | + // fall through and actually show error message even if default error image is set |
|
4163 | + } else { |
|
4164 | + header('Location: '.($this->err ? $this->err : $this->config_error_message_image_default)); |
|
4165 | + exit; |
|
4166 | + } |
|
4167 | + } |
|
4168 | + $this->setOutputFormat(); |
|
4169 | + if (!$this->thumbnailFormat || !$this->config_disable_debug || (phpthumb_functions::gd_version() < 1)) { |
|
4170 | + $this->thumbnailFormat = 'text'; |
|
4171 | + } |
|
4172 | + if (@$this->thumbnailFormat == 'text') { |
|
4173 | + // bypass all GD functions and output text error message |
|
4174 | + if (!headers_sent()) { |
|
4175 | + header('Content-type: text/plain'); |
|
4176 | + echo $text; |
|
4177 | + } else { |
|
4178 | + echo '<pre>'.htmlspecialchars($text).'</pre>'; |
|
4179 | + } |
|
4180 | + exit; |
|
4181 | + } |
|
4182 | + |
|
4183 | + $FontWidth = imagefontwidth($this->config_error_fontsize); |
|
4184 | + $FontHeight = imagefontheight($this->config_error_fontsize); |
|
4185 | + |
|
4186 | + $LinesOfText = explode("\n", @wordwrap($text, floor($width / $FontWidth), "\n", true)); |
|
4187 | + $height = max($height, count($LinesOfText) * $FontHeight); |
|
4188 | + |
|
4189 | + $headers_file = ''; |
|
4190 | + $headers_line = ''; |
|
4191 | + if (phpthumb_functions::version_compare_replacement(PHP_VERSION, '4.3.0', '>=') && headers_sent($headers_file, $headers_line)) { |
|
4192 | + |
|
4193 | + echo "\n".'**Headers already sent in file "'.$headers_file.'" on line "'.$headers_line.'", dumping error message as text:**<br><pre>'."\n\n".$text."\n".'</pre>'; |
|
4194 | + |
|
4195 | + } elseif (headers_sent()) { |
|
4196 | + |
|
4197 | + echo "\n".'**Headers already sent, dumping error message as text:**<br><pre>'."\n\n".$text."\n".'</pre>'; |
|
4198 | + |
|
4199 | + } elseif ($gdimg_error = imagecreate($width, $height)) { |
|
4200 | + |
|
4201 | + $background_color = phpthumb_functions::ImageHexColorAllocate($gdimg_error, $this->config_error_bgcolor, true); |
|
4202 | + $text_color = phpthumb_functions::ImageHexColorAllocate($gdimg_error, $this->config_error_textcolor, true); |
|
4203 | + imagefilledrectangle($gdimg_error, 0, 0, $width, $height, $background_color); |
|
4204 | + $lineYoffset = 0; |
|
4205 | + foreach ($LinesOfText as $line) { |
|
4206 | + imagestring($gdimg_error, $this->config_error_fontsize, 2, $lineYoffset, $line, $text_color); |
|
4207 | + $lineYoffset += $FontHeight; |
|
4208 | + } |
|
4209 | + if (function_exists('imagetypes')) { |
|
4210 | + $imagetypes = imagetypes(); |
|
4211 | + if ($imagetypes & IMG_PNG) { |
|
4212 | + header('Content-Type: image/png'); |
|
4213 | + imagepng($gdimg_error); |
|
4214 | + } elseif ($imagetypes & IMG_GIF) { |
|
4215 | + header('Content-Type: image/gif'); |
|
4216 | + imagegif($gdimg_error); |
|
4217 | + } elseif ($imagetypes & IMG_JPG) { |
|
4218 | + header('Content-Type: image/jpeg'); |
|
4219 | + imagejpeg($gdimg_error); |
|
4220 | + } elseif ($imagetypes & IMG_WBMP) { |
|
4221 | + header('Content-Type: image/vnd.wap.wbmp'); |
|
4222 | + imagewbmp($gdimg_error); |
|
4223 | + } |
|
4224 | + } |
|
4225 | + imagedestroy($gdimg_error); |
|
4226 | + |
|
4227 | + } |
|
4228 | + if (!headers_sent()) { |
|
4229 | + echo "\n".'**Failed to send graphical error image, dumping error message as text:**<br>'."\n\n".$text; |
|
4230 | + } |
|
4231 | + exit; |
|
4232 | + } |
|
4233 | + |
|
4234 | + public function ImageCreateFromStringReplacement(&$RawImageData, $DieOnErrors=false) { |
|
4235 | + // there are serious bugs in the non-bundled versions of GD which may cause |
|
4236 | + // PHP to segfault when calling imagecreatefromstring() - avoid if at all possible |
|
4237 | + // when not using a bundled version of GD2 |
|
4238 | + if (!phpthumb_functions::gd_version()) { |
|
4239 | + if ($DieOnErrors) { |
|
4240 | + if (!headers_sent()) { |
|
4241 | + // base64-encoded error image in GIF format |
|
4242 | + $ERROR_NOGD = 'R0lGODlhIAAgALMAAAAAABQUFCQkJDY2NkZGRldXV2ZmZnJycoaGhpSUlKWlpbe3t8XFxdXV1eTk5P7+/iwAAAAAIAAgAAAE/vDJSau9WILtTAACUinDNijZtAHfCojS4W5H+qxD8xibIDE9h0OwWaRWDIljJSkUJYsN4bihMB8th3IToAKs1VtYM75cyV8sZ8vygtOE5yMKmGbO4jRdICQCjHdlZzwzNW4qZSQmKDaNjhUMBX4BBAlmMywFSRWEmAI6b5gAlhNxokGhooAIK5o/pi9vEw4Lfj4OLTAUpj6IabMtCwlSFw0DCKBoFqwAB04AjI54PyZ+yY3TD0ss2YcVmN/gvpcu4TOyFivWqYJlbAHPpOntvxNAACcmGHjZzAZqzSzcq5fNjxFmAFw9iFRunD1epU6tsIPmFCAJnWYE0FURk7wJDA0MTKpEzoWAAskiAAA7'; |
|
4243 | + header('Content-Type: image/gif'); |
|
4244 | + echo base64_decode($ERROR_NOGD); |
|
4245 | + } else { |
|
4246 | + echo '*** ERROR: No PHP-GD support available ***'; |
|
4247 | + } |
|
4248 | + exit; |
|
4249 | + } else { |
|
4250 | + $this->DebugMessage('ImageCreateFromStringReplacement() failed: gd_version says "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__); |
|
4251 | + return false; |
|
4252 | + } |
|
4253 | + } |
|
4254 | + if (phpthumb_functions::gd_is_bundled()) { |
|
4255 | + $this->DebugMessage('ImageCreateFromStringReplacement() calling built-in imagecreatefromstring()', __FILE__, __LINE__); |
|
4256 | + return @imagecreatefromstring($RawImageData); |
|
4257 | + } |
|
4258 | + if ($this->issafemode) { |
|
4259 | + $this->DebugMessage('ImageCreateFromStringReplacement() failed: cannot create temp file in SAFE_MODE', __FILE__, __LINE__); |
|
4260 | + return false; |
|
4261 | + } |
|
4262 | + |
|
4263 | + switch (substr($RawImageData, 0, 3)) { |
|
4264 | + case 'GIF': |
|
4265 | + $ICFSreplacementFunctionName = 'imagecreatefromgif'; |
|
4266 | + break; |
|
4267 | + case "\xFF\xD8\xFF": |
|
4268 | + $ICFSreplacementFunctionName = 'imagecreatefromjpeg'; |
|
4269 | + break; |
|
4270 | + case "\x89".'PN': |
|
4271 | + $ICFSreplacementFunctionName = 'imagecreatefrompng'; |
|
4272 | + break; |
|
4273 | + default: |
|
4274 | + $this->DebugMessage('ImageCreateFromStringReplacement() failed: unknown fileformat signature "'.phpthumb_functions::HexCharDisplay(substr($RawImageData, 0, 3)).'"', __FILE__, __LINE__); |
|
4275 | + return false; |
|
4276 | + break; |
|
4277 | + } |
|
4278 | + $ErrorMessage = ''; |
|
4279 | + if ($tempnam = $this->phpThumb_tempnam()) { |
|
4280 | + if ($fp_tempnam = @fopen($tempnam, 'wb')) { |
|
4281 | + fwrite($fp_tempnam, $RawImageData); |
|
4282 | + fclose($fp_tempnam); |
|
4283 | + @chmod($tempnam, $this->getParameter('config_file_create_mask')); |
|
4284 | + if (($ICFSreplacementFunctionName == 'imagecreatefromgif') && !function_exists($ICFSreplacementFunctionName)) { |
|
4285 | + |
|
4286 | + // Need to create from GIF file, but imagecreatefromgif does not exist |
|
4287 | + ob_start(); |
|
4288 | + if (!@include_once( __DIR__ .'/phpthumb.gif.php')) { |
|
4289 | + $ErrorMessage = 'Failed to include required file "'. __DIR__ .'/phpthumb.gif.php" in '.__FILE__.' on line '.__LINE__; |
|
4290 | + $this->DebugMessage($ErrorMessage, __FILE__, __LINE__); |
|
4291 | + } |
|
4292 | + ob_end_clean(); |
|
4293 | + // gif_loadFileToGDimageResource() cannot read from raw data, write to file first |
|
4294 | + if ($tempfilename = $this->phpThumb_tempnam()) { |
|
4295 | + if ($fp_tempfile = @fopen($tempfilename, 'wb')) { |
|
4296 | + fwrite($fp_tempfile, $RawImageData); |
|
4297 | + fclose($fp_tempfile); |
|
4298 | + $gdimg_source = gif_loadFileToGDimageResource($tempfilename); |
|
4299 | + $this->DebugMessage('gif_loadFileToGDimageResource('.$tempfilename.') completed', __FILE__, __LINE__); |
|
4300 | + $this->DebugMessage('deleting "'.$tempfilename.'"', __FILE__, __LINE__); |
|
4301 | + unlink($tempfilename); |
|
4302 | + return $gdimg_source; |
|
4303 | + } else { |
|
4304 | + $ErrorMessage = 'Failed to open tempfile in '.__FILE__.' on line '.__LINE__; |
|
4305 | + $this->DebugMessage($ErrorMessage, __FILE__, __LINE__); |
|
4306 | + } |
|
4307 | + } else { |
|
4308 | + $ErrorMessage = 'Failed to open generate tempfile name in '.__FILE__.' on line '.__LINE__; |
|
4309 | + $this->DebugMessage($ErrorMessage, __FILE__, __LINE__); |
|
4310 | + } |
|
4311 | + |
|
4312 | + } elseif (function_exists($ICFSreplacementFunctionName) && ($gdimg_source = @$ICFSreplacementFunctionName($tempnam))) { |
|
4313 | + |
|
4314 | + // great |
|
4315 | + $this->DebugMessage($ICFSreplacementFunctionName.'('.$tempnam.') succeeded', __FILE__, __LINE__); |
|
4316 | + $this->DebugMessage('deleting "'.$tempnam.'"', __FILE__, __LINE__); |
|
4317 | + unlink($tempnam); |
|
4318 | + return $gdimg_source; |
|
4319 | + |
|
4320 | + } else { |
|
4321 | + |
|
4322 | + // GD functions not available, or failed to create image |
|
4323 | + $this->DebugMessage($ICFSreplacementFunctionName.'('.$tempnam.') '.(function_exists($ICFSreplacementFunctionName) ? 'failed' : 'does not exist'), __FILE__, __LINE__); |
|
4324 | + if (isset($_GET['phpThumbDebug'])) { |
|
4325 | + $this->phpThumbDebug(); |
|
4326 | + } |
|
4327 | + |
|
4328 | + } |
|
4329 | + } else { |
|
4330 | + $ErrorMessage = 'Failed to fopen('.$tempnam.', "wb") in '.__FILE__.' on line '.__LINE__."\n".'You may need to set $PHPTHUMB_CONFIG[temp_directory] in phpThumb.config.php'; |
|
4331 | + if ($this->issafemode) { |
|
4332 | + $ErrorMessage = 'ImageCreateFromStringReplacement() failed in '.__FILE__.' on line '.__LINE__.': cannot create temp file in SAFE_MODE'; |
|
4333 | + } |
|
4334 | + $this->DebugMessage($ErrorMessage, __FILE__, __LINE__); |
|
4335 | + } |
|
4336 | + $this->DebugMessage('deleting "'.$tempnam.'"', __FILE__, __LINE__); |
|
4337 | + @unlink($tempnam); |
|
4338 | + } else { |
|
4339 | + $ErrorMessage = 'Failed to generate phpThumb_tempnam() in '.__FILE__.' on line '.__LINE__."\n".'You may need to set $PHPTHUMB_CONFIG[temp_directory] in phpThumb.config.php'; |
|
4340 | + if ($this->issafemode) { |
|
4341 | + $ErrorMessage = 'ImageCreateFromStringReplacement() failed in '.__FILE__.' on line '.__LINE__.': cannot create temp file in SAFE_MODE'; |
|
4342 | + } |
|
4343 | + } |
|
4344 | + if ($DieOnErrors && $ErrorMessage) { |
|
4345 | + return $this->ErrorImage($ErrorMessage); |
|
4346 | + } |
|
4347 | + return false; |
|
4348 | + } |
|
4349 | + |
|
4350 | + public function ImageResizeFunction(&$dst_im, &$src_im, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH) { |
|
4351 | + $this->DebugMessage('ImageResizeFunction($o, $s, '.$dstX.', '.$dstY.', '.$srcX.', '.$srcY.', '.$dstW.', '.$dstH.', '.$srcW.', '.$srcH.')', __FILE__, __LINE__); |
|
4352 | + if (($dstW == $srcW) && ($dstH == $srcH)) { |
|
4353 | + return imagecopy($dst_im, $src_im, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH); |
|
4354 | + } |
|
4355 | + if (phpthumb_functions::gd_version() >= 2.0) { |
|
4356 | + if ($this->config_disable_imagecopyresampled) { |
|
4357 | + return phpthumb_functions::ImageCopyResampleBicubic($dst_im, $src_im, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH); |
|
4358 | + } |
|
4359 | + return imagecopyresampled($dst_im, $src_im, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH); |
|
4360 | + } |
|
4361 | + return imagecopyresized($dst_im, $src_im, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH); |
|
4362 | + } |
|
4363 | + |
|
4364 | + public function InitializeTempDirSetting() { |
|
4365 | + $this->config_temp_directory = ($this->config_temp_directory ? $this->config_temp_directory : $this->realPathSafe((function_exists('sys_get_temp_dir') ? sys_get_temp_dir() : ''))); // sys_get_temp_dir added in PHP v5.2.1 |
|
4366 | + $this->config_temp_directory = ($this->config_temp_directory ? $this->config_temp_directory : $this->realPathSafe(ini_get('upload_tmp_dir'))); |
|
4367 | + $this->config_temp_directory = ($this->config_temp_directory ? $this->config_temp_directory : $this->realPathSafe(getenv('TMPDIR'))); |
|
4368 | + $this->config_temp_directory = ($this->config_temp_directory ? $this->config_temp_directory : $this->realPathSafe(getenv('TMP'))); |
|
4369 | + return true; |
|
4370 | + } |
|
4371 | + |
|
4372 | + public function phpThumb_tempnam() { |
|
4373 | + $this->InitializeTempDirSetting(); |
|
4374 | + $tempnam = $this->realPathSafe(tempnam($this->config_temp_directory, 'pThumb')); |
|
4375 | + $this->tempFilesToDelete[$tempnam] = $tempnam; |
|
4376 | + $this->DebugMessage('phpThumb_tempnam() returning "'.$tempnam.'"', __FILE__, __LINE__); |
|
4377 | + return $tempnam; |
|
4378 | + } |
|
4379 | + |
|
4380 | + public function DebugMessage($message, $file='', $line='') { |
|
4381 | + $this->debugmessages[] = $message.($file ? ' in file "'.(basename($file) ? basename($file) : $file).'"' : '').($line ? ' on line '.$line : ''); |
|
4382 | + return true; |
|
4383 | + } |
|
4384 | + |
|
4385 | + public function DebugTimingMessage($message, $file='', $line='', $timestamp=0) { |
|
4386 | + if (!$timestamp) { |
|
4387 | + $timestamp = array_sum(explode(' ', microtime())); |
|
4388 | + } |
|
4389 | + $this->debugtiming[number_format($timestamp, 6, '.', '')] = ': '.$message.($file ? ' in file "'.(basename($file) ? basename($file) : $file).'"' : '').($line ? ' on line '.$line : ''); |
|
4390 | + return true; |
|
4391 | + } |
|
4392 | 4392 | |
4393 | 4393 | } |
@@ -10,9 +10,9 @@ discard block |
||
10 | 10 | ////////////////////////////////////////////////////////////// |
11 | 11 | |
12 | 12 | ob_start(); |
13 | -if (!include_once( __DIR__ .'/phpthumb.functions.php')) { |
|
13 | +if (!include_once(__DIR__.'/phpthumb.functions.php')) { |
|
14 | 14 | ob_end_flush(); |
15 | - die('failed to include_once("'. __DIR__ .'/phpthumb.functions.php")'); |
|
15 | + die('failed to include_once("'.__DIR__.'/phpthumb.functions.php")'); |
|
16 | 16 | } |
17 | 17 | ob_end_clean(); |
18 | 18 | |
@@ -21,42 +21,42 @@ discard block |
||
21 | 21 | // public: |
22 | 22 | // START PARAMETERS (for object mode and phpThumb.php) |
23 | 23 | // See phpthumb.readme.txt for descriptions of what each of these values are |
24 | - public $src = null; // SouRCe filename |
|
25 | - public $new = null; // NEW image (phpThumb.php only) |
|
26 | - public $w = null; // Width |
|
27 | - public $h = null; // Height |
|
28 | - public $wp = null; // Width (Portrait Images Only) |
|
29 | - public $hp = null; // Height (Portrait Images Only) |
|
30 | - public $wl = null; // Width (Landscape Images Only) |
|
31 | - public $hl = null; // Height (Landscape Images Only) |
|
32 | - public $ws = null; // Width (Square Images Only) |
|
33 | - public $hs = null; // Height (Square Images Only) |
|
34 | - public $f = null; // output image Format |
|
35 | - public $q = 75; // jpeg output Quality |
|
36 | - public $sx = null; // Source crop top-left X position |
|
37 | - public $sy = null; // Source crop top-left Y position |
|
38 | - public $sw = null; // Source crop Width |
|
39 | - public $sh = null; // Source crop Height |
|
40 | - public $zc = null; // Zoom Crop |
|
41 | - public $bc = null; // Border Color |
|
42 | - public $bg = null; // BackGround color |
|
43 | - public $fltr = array(); // FiLTeRs |
|
44 | - public $goto = null; // GO TO url after processing |
|
45 | - public $err = null; // default ERRor image filename |
|
46 | - public $xto = null; // extract eXif Thumbnail Only |
|
47 | - public $ra = null; // Rotate by Angle |
|
48 | - public $ar = null; // Auto Rotate |
|
49 | - public $aoe = null; // Allow Output Enlargement |
|
50 | - public $far = null; // Fixed Aspect Ratio |
|
51 | - public $iar = null; // Ignore Aspect Ratio |
|
52 | - public $maxb = null; // MAXimum Bytes |
|
53 | - public $down = null; // DOWNload thumbnail filename |
|
54 | - public $md5s = null; // MD5 hash of Source image |
|
55 | - public $sfn = 0; // Source Frame Number |
|
56 | - public $dpi = 150; // Dots Per Inch for vector source formats |
|
57 | - public $sia = null; // Save Image As filename |
|
58 | - |
|
59 | - public $file = null; // >>>deprecated, DO NOT USE, will be removed in future versions<<< |
|
24 | + public $src = null; // SouRCe filename |
|
25 | + public $new = null; // NEW image (phpThumb.php only) |
|
26 | + public $w = null; // Width |
|
27 | + public $h = null; // Height |
|
28 | + public $wp = null; // Width (Portrait Images Only) |
|
29 | + public $hp = null; // Height (Portrait Images Only) |
|
30 | + public $wl = null; // Width (Landscape Images Only) |
|
31 | + public $hl = null; // Height (Landscape Images Only) |
|
32 | + public $ws = null; // Width (Square Images Only) |
|
33 | + public $hs = null; // Height (Square Images Only) |
|
34 | + public $f = null; // output image Format |
|
35 | + public $q = 75; // jpeg output Quality |
|
36 | + public $sx = null; // Source crop top-left X position |
|
37 | + public $sy = null; // Source crop top-left Y position |
|
38 | + public $sw = null; // Source crop Width |
|
39 | + public $sh = null; // Source crop Height |
|
40 | + public $zc = null; // Zoom Crop |
|
41 | + public $bc = null; // Border Color |
|
42 | + public $bg = null; // BackGround color |
|
43 | + public $fltr = array(); // FiLTeRs |
|
44 | + public $goto = null; // GO TO url after processing |
|
45 | + public $err = null; // default ERRor image filename |
|
46 | + public $xto = null; // extract eXif Thumbnail Only |
|
47 | + public $ra = null; // Rotate by Angle |
|
48 | + public $ar = null; // Auto Rotate |
|
49 | + public $aoe = null; // Allow Output Enlargement |
|
50 | + public $far = null; // Fixed Aspect Ratio |
|
51 | + public $iar = null; // Ignore Aspect Ratio |
|
52 | + public $maxb = null; // MAXimum Bytes |
|
53 | + public $down = null; // DOWNload thumbnail filename |
|
54 | + public $md5s = null; // MD5 hash of Source image |
|
55 | + public $sfn = 0; // Source Frame Number |
|
56 | + public $dpi = 150; // Dots Per Inch for vector source formats |
|
57 | + public $sia = null; // Save Image As filename |
|
58 | + |
|
59 | + public $file = null; // >>>deprecated, DO NOT USE, will be removed in future versions<<< |
|
60 | 60 | |
61 | 61 | public $phpThumbDebug = null; |
62 | 62 | // END PARAMETERS |
@@ -127,7 +127,7 @@ discard block |
||
127 | 127 | public $config_cache_source_filemtime_ignore_remote = true; |
128 | 128 | public $config_cache_default_only_suffix = false; |
129 | 129 | public $config_cache_force_passthru = true; |
130 | - public $config_cache_prefix = ''; // default value set in the constructor below |
|
130 | + public $config_cache_prefix = ''; // default value set in the constructor below |
|
131 | 131 | |
132 | 132 | // * MySQL |
133 | 133 | public $config_mysql_extension = null; |
@@ -144,7 +144,7 @@ discard block |
||
144 | 144 | public $config_disable_debug = true; |
145 | 145 | public $config_allow_src_above_docroot = false; |
146 | 146 | public $config_allow_src_above_phpthumb = true; |
147 | - public $config_auto_allow_symlinks = true; // allow symlink target directories without explicitly whitelisting them |
|
147 | + public $config_auto_allow_symlinks = true; // allow symlink target directories without explicitly whitelisting them |
|
148 | 148 | public $config_additional_allowed_dirs = array(); // additional directories to allow source images to be read from |
149 | 149 | public $config_file_create_mask = 0755; |
150 | 150 | public $config_dir_create_mask = 0755; |
@@ -208,7 +208,7 @@ discard block |
||
208 | 208 | public $tempFilesToDelete = array(); |
209 | 209 | public $cache_filename = null; |
210 | 210 | |
211 | - public $AlphaCapableFormats = array( 'png', 'ico', 'gif'); |
|
211 | + public $AlphaCapableFormats = array('png', 'ico', 'gif'); |
|
212 | 212 | public $is_alpha = false; |
213 | 213 | |
214 | 214 | public $iswindows = null; |
@@ -230,10 +230,10 @@ discard block |
||
230 | 230 | |
231 | 231 | foreach (array(ini_get('memory_limit'), get_cfg_var('memory_limit')) as $php_config_memory_limit) { |
232 | 232 | if ('' !== $php_config_memory_limit) { |
233 | - if (strtoupper($php_config_memory_limit[ strlen($php_config_memory_limit) - 1 ]) == 'G') { // PHP memory limit expressed in Gigabytes |
|
234 | - $php_config_memory_limit = (int) substr($php_config_memory_limit, 0, -1) * 1073741824; |
|
235 | - } elseif (strtoupper($php_config_memory_limit[ strlen($php_config_memory_limit) - 1 ]) == 'M') { // PHP memory limit expressed in Megabytes |
|
236 | - $php_config_memory_limit = (int) substr($php_config_memory_limit, 0, -1) * 1048576; |
|
233 | + if (strtoupper($php_config_memory_limit[strlen($php_config_memory_limit) - 1]) == 'G') { // PHP memory limit expressed in Gigabytes |
|
234 | + $php_config_memory_limit = (int)substr($php_config_memory_limit, 0, -1) * 1073741824; |
|
235 | + } elseif (strtoupper($php_config_memory_limit[strlen($php_config_memory_limit) - 1]) == 'M') { // PHP memory limit expressed in Megabytes |
|
236 | + $php_config_memory_limit = (int)substr($php_config_memory_limit, 0, -1) * 1048576; |
|
237 | 237 | } |
238 | 238 | $this->php_memory_limit = max($this->php_memory_limit, $php_config_memory_limit); |
239 | 239 | } |
@@ -242,10 +242,10 @@ discard block |
||
242 | 242 | $this->config_max_source_pixels = round($this->php_memory_limit * 0.20); // 20% of memory_limit |
243 | 243 | } |
244 | 244 | |
245 | - $this->iswindows = (bool) (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'); |
|
246 | - $this->issafemode = (bool) preg_match('#(1|ON)#i', ini_get('safe_mode')); |
|
247 | - $this->config_document_root = (!empty($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $this->config_document_root); |
|
248 | - $this->config_cache_prefix = ( isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'].'_' : ''); |
|
245 | + $this->iswindows = (bool)(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'); |
|
246 | + $this->issafemode = (bool)preg_match('#(1|ON)#i', ini_get('safe_mode')); |
|
247 | + $this->config_document_root = (!empty($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $this->config_document_root); |
|
248 | + $this->config_cache_prefix = (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'].'_' : ''); |
|
249 | 249 | |
250 | 250 | $this->purgeTempFiles(); // purge existing temp files if re-initializing object |
251 | 251 | |
@@ -256,7 +256,7 @@ discard block |
||
256 | 256 | |
257 | 257 | if (!$this->config_disable_debug) { |
258 | 258 | // if debug mode is enabled, force phpThumbDebug output, do not allow normal thumbnails to be generated |
259 | - $this->phpThumbDebug = (null === $this->phpThumbDebug ? 9 : max(1, (int) $this->phpThumbDebug)); |
|
259 | + $this->phpThumbDebug = (null === $this->phpThumbDebug ? 9 : max(1, (int)$this->phpThumbDebug)); |
|
260 | 260 | } |
261 | 261 | } |
262 | 262 | |
@@ -296,10 +296,10 @@ discard block |
||
296 | 296 | } |
297 | 297 | |
298 | 298 | // public: |
299 | - public function setSourceData($rawImageData, $sourceFilename='') { |
|
299 | + public function setSourceData($rawImageData, $sourceFilename = '') { |
|
300 | 300 | //$this->resetObject(); |
301 | 301 | //$this->sourceFilename = null; |
302 | - $this->rawImageData = $rawImageData; |
|
302 | + $this->rawImageData = $rawImageData; |
|
303 | 303 | $this->DebugMessage('setSourceData() setting $this->rawImageData ('.strlen($this->rawImageData).' bytes; magic="'.substr($this->rawImageData, 0, 4).'" ('.phpthumb_functions::HexCharDisplay(substr($this->rawImageData, 0, 4)).'))', __FILE__, __LINE__); |
304 | 304 | if ($this->config_cache_source_enabled) { |
305 | 305 | $sourceFilename = ($sourceFilename ? $sourceFilename : md5($rawImageData)); |
@@ -381,19 +381,19 @@ discard block |
||
381 | 381 | $this->phpThumbDebug('8h'); |
382 | 382 | |
383 | 383 | // default values, also applicable for far="C" |
384 | - $destination_offset_x = round(($this->thumbnail_width - $this->thumbnail_image_width) / 2); |
|
384 | + $destination_offset_x = round(($this->thumbnail_width - $this->thumbnail_image_width) / 2); |
|
385 | 385 | $destination_offset_y = round(($this->thumbnail_height - $this->thumbnail_image_height) / 2); |
386 | 386 | if (($this->far == 'L') || ($this->far == 'TL') || ($this->far == 'BL')) { |
387 | 387 | $destination_offset_x = 0; |
388 | 388 | } |
389 | 389 | if (($this->far == 'R') || ($this->far == 'TR') || ($this->far == 'BR')) { |
390 | - $destination_offset_x = round($this->thumbnail_width - $this->thumbnail_image_width); |
|
390 | + $destination_offset_x = round($this->thumbnail_width - $this->thumbnail_image_width); |
|
391 | 391 | } |
392 | 392 | if (($this->far == 'T') || ($this->far == 'TL') || ($this->far == 'TR')) { |
393 | 393 | $destination_offset_y = 0; |
394 | 394 | } |
395 | 395 | if (($this->far == 'B') || ($this->far == 'BL') || ($this->far == 'BR')) { |
396 | - $destination_offset_y = round($this->thumbnail_height - $this->thumbnail_image_height); |
|
396 | + $destination_offset_y = round($this->thumbnail_height - $this->thumbnail_image_height); |
|
397 | 397 | } |
398 | 398 | |
399 | 399 | // // copy/resize image to appropriate dimensions |
@@ -461,14 +461,14 @@ discard block |
||
461 | 461 | $builtin_formats = array(); |
462 | 462 | if (function_exists('imagetypes')) { |
463 | 463 | $imagetypes = imagetypes(); |
464 | - $builtin_formats['wbmp'] = (bool) ($imagetypes & IMG_WBMP); |
|
465 | - $builtin_formats['jpg'] = (bool) ($imagetypes & IMG_JPG); |
|
466 | - $builtin_formats['gif'] = (bool) ($imagetypes & IMG_GIF); |
|
467 | - $builtin_formats['png'] = (bool) ($imagetypes & IMG_PNG); |
|
464 | + $builtin_formats['wbmp'] = (bool)($imagetypes & IMG_WBMP); |
|
465 | + $builtin_formats['jpg'] = (bool)($imagetypes & IMG_JPG); |
|
466 | + $builtin_formats['gif'] = (bool)($imagetypes & IMG_GIF); |
|
467 | + $builtin_formats['png'] = (bool)($imagetypes & IMG_PNG); |
|
468 | 468 | } |
469 | 469 | |
470 | - $this->DebugMessage('imageinterlace($this->gdimg_output, '. (int) $this->config_output_interlace .')', __FILE__, __LINE__); |
|
471 | - imageinterlace($this->gdimg_output, (int) $this->config_output_interlace); |
|
470 | + $this->DebugMessage('imageinterlace($this->gdimg_output, '.(int)$this->config_output_interlace.')', __FILE__, __LINE__); |
|
471 | + imageinterlace($this->gdimg_output, (int)$this->config_output_interlace); |
|
472 | 472 | |
473 | 473 | $this->DebugMessage('RenderOutput() attempting image'.strtolower(@$this->thumbnailFormat).'($this->gdimg_output)', __FILE__, __LINE__); |
474 | 474 | ob_start(); |
@@ -535,8 +535,8 @@ discard block |
||
535 | 535 | break; |
536 | 536 | |
537 | 537 | case 'bmp': |
538 | - if (!@include_once( __DIR__ .'/phpthumb.bmp.php')) { |
|
539 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.bmp.php" which is required for BMP format output', __FILE__, __LINE__); |
|
538 | + if (!@include_once(__DIR__.'/phpthumb.bmp.php')) { |
|
539 | + $this->DebugMessage('Error including "'.__DIR__.'/phpthumb.bmp.php" which is required for BMP format output', __FILE__, __LINE__); |
|
540 | 540 | ob_end_clean(); |
541 | 541 | return false; |
542 | 542 | } |
@@ -546,8 +546,8 @@ discard block |
||
546 | 546 | break; |
547 | 547 | |
548 | 548 | case 'ico': |
549 | - if (!@include_once( __DIR__ .'/phpthumb.ico.php')) { |
|
550 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.ico.php" which is required for ICO format output', __FILE__, __LINE__); |
|
549 | + if (!@include_once(__DIR__.'/phpthumb.ico.php')) { |
|
550 | + $this->DebugMessage('Error including "'.__DIR__.'/phpthumb.ico.php" which is required for ICO format output', __FILE__, __LINE__); |
|
551 | 551 | ob_end_clean(); |
552 | 552 | return false; |
553 | 553 | } |
@@ -637,8 +637,8 @@ discard block |
||
637 | 637 | |
638 | 638 | } else { |
639 | 639 | |
640 | - $this->DebugMessage('imageinterlace($this->gdimg_output, '. (int) $this->config_output_interlace .')', __FILE__, __LINE__); |
|
641 | - imageinterlace($this->gdimg_output, (int) $this->config_output_interlace); |
|
640 | + $this->DebugMessage('imageinterlace($this->gdimg_output, '.(int)$this->config_output_interlace.')', __FILE__, __LINE__); |
|
641 | + imageinterlace($this->gdimg_output, (int)$this->config_output_interlace); |
|
642 | 642 | switch ($this->thumbnailFormat) { |
643 | 643 | case 'jpeg': |
644 | 644 | header('Content-Type: '.phpthumb_functions::ImageTypeToMIMEtype($this->thumbnailFormat)); |
@@ -654,8 +654,8 @@ discard block |
||
654 | 654 | break; |
655 | 655 | |
656 | 656 | case 'bmp': |
657 | - if (!@include_once( __DIR__ .'/phpthumb.bmp.php')) { |
|
658 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.bmp.php" which is required for BMP format output', __FILE__, __LINE__); |
|
657 | + if (!@include_once(__DIR__.'/phpthumb.bmp.php')) { |
|
658 | + $this->DebugMessage('Error including "'.__DIR__.'/phpthumb.bmp.php" which is required for BMP format output', __FILE__, __LINE__); |
|
659 | 659 | return false; |
660 | 660 | } |
661 | 661 | $phpthumb_bmp = new phpthumb_bmp(); |
@@ -675,8 +675,8 @@ discard block |
||
675 | 675 | break; |
676 | 676 | |
677 | 677 | case 'ico': |
678 | - if (!@include_once( __DIR__ .'/phpthumb.ico.php')) { |
|
679 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.ico.php" which is required for ICO format output', __FILE__, __LINE__); |
|
678 | + if (!@include_once(__DIR__.'/phpthumb.ico.php')) { |
|
679 | + $this->DebugMessage('Error including "'.__DIR__.'/phpthumb.ico.php" which is required for ICO format output', __FILE__, __LINE__); |
|
680 | 680 | return false; |
681 | 681 | } |
682 | 682 | $phpthumb_ico = new phpthumb_ico(); |
@@ -927,10 +927,10 @@ discard block |
||
927 | 927 | |
928 | 928 | $AvailableImageOutputFormats = array(); |
929 | 929 | $AvailableImageOutputFormats[] = 'text'; |
930 | - if (@is_readable( __DIR__ .'/phpthumb.ico.php')) { |
|
930 | + if (@is_readable(__DIR__.'/phpthumb.ico.php')) { |
|
931 | 931 | $AvailableImageOutputFormats[] = 'ico'; |
932 | 932 | } |
933 | - if (@is_readable( __DIR__ .'/phpthumb.bmp.php')) { |
|
933 | + if (@is_readable(__DIR__.'/phpthumb.bmp.php')) { |
|
934 | 934 | $AvailableImageOutputFormats[] = 'bmp'; |
935 | 935 | } |
936 | 936 | |
@@ -956,7 +956,7 @@ discard block |
||
956 | 956 | $AvailableImageOutputFormats[] = 'jpeg'; |
957 | 957 | } |
958 | 958 | } else { |
959 | - $this->DebugMessage('imagetypes() does not exist - GD support might not be enabled?', __FILE__, __LINE__); |
|
959 | + $this->DebugMessage('imagetypes() does not exist - GD support might not be enabled?', __FILE__, __LINE__); |
|
960 | 960 | } |
961 | 961 | if ($this->ImageMagickVersion()) { |
962 | 962 | $IMformats = array('jpeg', 'png', 'gif', 'bmp', 'ico', 'wbmp'); |
@@ -993,7 +993,7 @@ discard block |
||
993 | 993 | // for JPEG images, quality 1 (worst) to 99 (best) |
994 | 994 | // quality < 25 is nasty, with not much size savings - not recommended |
995 | 995 | // problems with 100 - invalid JPEG? |
996 | - $this->thumbnailQuality = max(1, min(99, ($this->q ? (int) $this->q : 75))); |
|
996 | + $this->thumbnailQuality = max(1, min(99, ($this->q ? (int)$this->q : 75))); |
|
997 | 997 | $this->DebugMessage('$this->thumbnailQuality set to "'.$this->thumbnailQuality.'"', __FILE__, __LINE__); |
998 | 998 | |
999 | 999 | return true; |
@@ -1003,7 +1003,7 @@ discard block |
||
1003 | 1003 | public function setCacheDirectory() { |
1004 | 1004 | // resolve cache directory to absolute pathname |
1005 | 1005 | $this->DebugMessage('setCacheDirectory() starting with config_cache_directory = "'.$this->config_cache_directory.'"', __FILE__, __LINE__); |
1006 | - if ($this->config_cache_directory[ 0 ] == '.') { |
|
1006 | + if ($this->config_cache_directory[0] == '.') { |
|
1007 | 1007 | if (preg_match('#^(f|ht)tps?\://#i', $this->src)) { |
1008 | 1008 | if (!$this->config_cache_disable_warning) { |
1009 | 1009 | $this->ErrorImage('$this->config_cache_directory ('.$this->config_cache_directory.') cannot be used for remote images. Adjust "cache_directory" or "cache_disable_warning" in phpThumb.config.php'); |
@@ -1144,7 +1144,7 @@ discard block |
||
1144 | 1144 | array_unshift($allowed_dirs, $this->realPathSafe($this->config_document_root)); |
1145 | 1145 | } else { |
1146 | 1146 | if (!$this->config_allow_src_above_phpthumb) { |
1147 | - array_unshift($allowed_dirs, $this->realPathSafe( __DIR__ )); |
|
1147 | + array_unshift($allowed_dirs, $this->realPathSafe(__DIR__)); |
|
1148 | 1148 | } else { |
1149 | 1149 | // no checks are needed, offload the work to realpath and forget about it |
1150 | 1150 | $this->DebugMessage('resolvePath: checks disabled, returning '.$this->realPathSafe($path), __FILE__, __LINE__); |
@@ -1201,7 +1201,7 @@ discard block |
||
1201 | 1201 | if ($this->config_auto_allow_symlinks) { |
1202 | 1202 | $allowed_dirs[0] = $path; |
1203 | 1203 | } |
1204 | - $path = $path.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, array_slice($segments,$i + 1)); |
|
1204 | + $path = $path.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, array_slice($segments, $i + 1)); |
|
1205 | 1205 | } while (true); |
1206 | 1206 | return $path; |
1207 | 1207 | } |
@@ -1217,7 +1217,7 @@ discard block |
||
1217 | 1217 | // http://stackoverflow.com/questions/21421569 |
1218 | 1218 | $newfilename = preg_replace('#[\\/]+#', DIRECTORY_SEPARATOR, $filename); |
1219 | 1219 | if (!preg_match('#^'.DIRECTORY_SEPARATOR.'#', $newfilename)) { |
1220 | - $newfilename = __DIR__ .DIRECTORY_SEPARATOR.$newfilename; |
|
1220 | + $newfilename = __DIR__.DIRECTORY_SEPARATOR.$newfilename; |
|
1221 | 1221 | } |
1222 | 1222 | do { |
1223 | 1223 | $beforeloop = $newfilename; |
@@ -1307,7 +1307,7 @@ discard block |
||
1307 | 1307 | } else { |
1308 | 1308 | |
1309 | 1309 | // relative to current directory (any OS) |
1310 | - $AbsoluteFilename = __DIR__ .DIRECTORY_SEPARATOR.preg_replace('#[/\\\\]#', DIRECTORY_SEPARATOR, $filename); |
|
1310 | + $AbsoluteFilename = __DIR__.DIRECTORY_SEPARATOR.preg_replace('#[/\\\\]#', DIRECTORY_SEPARATOR, $filename); |
|
1311 | 1311 | |
1312 | 1312 | if (substr(dirname(@$_SERVER['PHP_SELF']), 0, 2) == '/~') { |
1313 | 1313 | if ($ApacheLookupURIarray = phpthumb_functions::ApacheLookupURIarray(dirname(@$_SERVER['PHP_SELF']))) { |
@@ -1344,15 +1344,15 @@ discard block |
||
1344 | 1344 | $this->DebugMessage('!$this->config_allow_src_above_docroot therefore setting "'.$AbsoluteFilename.'" (outside "'.$this->realPathSafe($this->config_document_root).'") to null', __FILE__, __LINE__); |
1345 | 1345 | return false; |
1346 | 1346 | } |
1347 | - if (!$this->config_allow_src_above_phpthumb && !preg_match('#^'.preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', __DIR__ )).'#', $resolvedAbsoluteFilename)) { |
|
1348 | - $this->DebugMessage('!$this->config_allow_src_above_phpthumb therefore setting "'.$AbsoluteFilename.'" (outside "'. __DIR__ .'") to null', __FILE__, __LINE__); |
|
1347 | + if (!$this->config_allow_src_above_phpthumb && !preg_match('#^'.preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', __DIR__)).'#', $resolvedAbsoluteFilename)) { |
|
1348 | + $this->DebugMessage('!$this->config_allow_src_above_phpthumb therefore setting "'.$AbsoluteFilename.'" (outside "'.__DIR__.'") to null', __FILE__, __LINE__); |
|
1349 | 1349 | return false; |
1350 | 1350 | } |
1351 | 1351 | return $resolvedAbsoluteFilename; |
1352 | 1352 | } |
1353 | 1353 | |
1354 | 1354 | |
1355 | - public function file_exists_ignoreopenbasedir($filename, $cached=true) { |
|
1355 | + public function file_exists_ignoreopenbasedir($filename, $cached = true) { |
|
1356 | 1356 | static $open_basedirs = null; |
1357 | 1357 | static $file_exists_cache = array(); |
1358 | 1358 | if (!$cached || !isset($file_exists_cache[$filename])) { |
@@ -1363,7 +1363,7 @@ discard block |
||
1363 | 1363 | $file_exists_cache[$filename] = file_exists($filename); |
1364 | 1364 | } elseif ($this->iswindows) { |
1365 | 1365 | $ls_filename = trim(phpthumb_functions::SafeExec('dir /b '.phpthumb_functions::escapeshellarg_replacement($filename))); |
1366 | - $file_exists_cache[$filename] = ($ls_filename == basename($filename)); // command dir /b return only filename without path |
|
1366 | + $file_exists_cache[$filename] = ($ls_filename == basename($filename)); // command dir /b return only filename without path |
|
1367 | 1367 | } else { |
1368 | 1368 | $ls_filename = trim(phpthumb_functions::SafeExec('ls '.phpthumb_functions::escapeshellarg_replacement($filename))); |
1369 | 1369 | $file_exists_cache[$filename] = ($ls_filename == $filename); |
@@ -1416,10 +1416,10 @@ discard block |
||
1416 | 1416 | $this->DebugMessage('Leaving $this->config_imagemagick_path as ('.$this->config_imagemagick_path.') because !is_execuatable($this->realPathSafe($this->config_imagemagick_path)) ('.$this->realPathSafe($this->config_imagemagick_path).')', __FILE__, __LINE__); |
1417 | 1417 | } |
1418 | 1418 | } |
1419 | - $this->DebugMessage(' file_exists('.$this->config_imagemagick_path.') = '. (int) (@file_exists($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1420 | - $this->DebugMessage('file_exists_ignoreopenbasedir('.$this->config_imagemagick_path.') = '. (int) $this->file_exists_ignoreopenbasedir($this->config_imagemagick_path), __FILE__, __LINE__); |
|
1421 | - $this->DebugMessage(' is_file('.$this->config_imagemagick_path.') = '. (int) (@is_file($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1422 | - $this->DebugMessage(' is_executable('.$this->config_imagemagick_path.') = '. (int) (@is_executable($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1419 | + $this->DebugMessage(' file_exists('.$this->config_imagemagick_path.') = '.(int)(@file_exists($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1420 | + $this->DebugMessage('file_exists_ignoreopenbasedir('.$this->config_imagemagick_path.') = '.(int)$this->file_exists_ignoreopenbasedir($this->config_imagemagick_path), __FILE__, __LINE__); |
|
1421 | + $this->DebugMessage(' is_file('.$this->config_imagemagick_path.') = '.(int)(@is_file($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1422 | + $this->DebugMessage(' is_executable('.$this->config_imagemagick_path.') = '.(int)(@is_executable($this->config_imagemagick_path)), __FILE__, __LINE__); |
|
1423 | 1423 | |
1424 | 1424 | if ($this->file_exists_ignoreopenbasedir($this->config_imagemagick_path)) { |
1425 | 1425 | |
@@ -1464,7 +1464,7 @@ discard block |
||
1464 | 1464 | } |
1465 | 1465 | |
1466 | 1466 | |
1467 | - public function ImageMagickVersion($returnRAW=false) { |
|
1467 | + public function ImageMagickVersion($returnRAW = false) { |
|
1468 | 1468 | static $versionstring = null; |
1469 | 1469 | if (null === $versionstring) { |
1470 | 1470 | $versionstring = array(0=>false, 1=>false); |
@@ -1498,7 +1498,7 @@ discard block |
||
1498 | 1498 | |
1499 | 1499 | } |
1500 | 1500 | } |
1501 | - return $versionstring[ (int) $returnRAW ]; |
|
1501 | + return $versionstring[(int)$returnRAW]; |
|
1502 | 1502 | } |
1503 | 1503 | |
1504 | 1504 | |
@@ -1525,10 +1525,10 @@ discard block |
||
1525 | 1525 | break; |
1526 | 1526 | } |
1527 | 1527 | } |
1528 | - $this->DebugMessage('ImageMagickSwitchAvailable('.implode(';', $switchname).') = '. (int) $allOK .'', __FILE__, __LINE__); |
|
1528 | + $this->DebugMessage('ImageMagickSwitchAvailable('.implode(';', $switchname).') = '.(int)$allOK.'', __FILE__, __LINE__); |
|
1529 | 1529 | } else { |
1530 | 1530 | $allOK = isset($IMoptions[$switchname]); |
1531 | - $this->DebugMessage('ImageMagickSwitchAvailable('.$switchname.') = '. (int) $allOK .'', __FILE__, __LINE__); |
|
1531 | + $this->DebugMessage('ImageMagickSwitchAvailable('.$switchname.') = '.(int)$allOK.'', __FILE__, __LINE__); |
|
1532 | 1532 | } |
1533 | 1533 | return $allOK; |
1534 | 1534 | } |
@@ -1655,7 +1655,7 @@ discard block |
||
1655 | 1655 | |
1656 | 1656 | $commandline = $this->ImageMagickCommandlineBase(); |
1657 | 1657 | if ($commandline) { |
1658 | - $commandline .= ' '.phpthumb_functions::escapeshellarg_replacement(preg_replace('#[/\\\\]#', DIRECTORY_SEPARATOR, $this->sourceFilename).(($outputFormat == 'gif') ? '' : '['. (int) $this->sfn .']')); // [0] means first frame of (GIF) animation, can be ignored |
|
1658 | + $commandline .= ' '.phpthumb_functions::escapeshellarg_replacement(preg_replace('#[/\\\\]#', DIRECTORY_SEPARATOR, $this->sourceFilename).(($outputFormat == 'gif') ? '' : '['.(int)$this->sfn.']')); // [0] means first frame of (GIF) animation, can be ignored |
|
1659 | 1659 | if ($IMtempfilename = $this->phpThumb_tempnam()) { |
1660 | 1660 | $IMtempfilename = $this->realPathSafe($IMtempfilename); |
1661 | 1661 | |
@@ -1669,7 +1669,7 @@ discard block |
||
1669 | 1669 | $commandline_test = $this->ImageMagickCommandlineBase().' logo: -resize 1x '.phpthumb_functions::escapeshellarg_replacement($IMtempfilename).' 2>&1'; |
1670 | 1670 | $IMresult_test = phpthumb_functions::SafeExec($commandline_test); |
1671 | 1671 | $IMuseExplicitImageOutputDimensions = preg_match('#image dimensions are zero#i', $IMresult_test); |
1672 | - $this->DebugMessage('IMuseExplicitImageOutputDimensions = '. (int) $IMuseExplicitImageOutputDimensions, __FILE__, __LINE__); |
|
1672 | + $this->DebugMessage('IMuseExplicitImageOutputDimensions = '.(int)$IMuseExplicitImageOutputDimensions, __FILE__, __LINE__); |
|
1673 | 1673 | if ($fp_im_temp = @fopen($IMtempfilename, 'wb')) { |
1674 | 1674 | // erase temp image so ImageMagick logo doesn't get output if other processing fails |
1675 | 1675 | fclose($fp_im_temp); |
@@ -1730,13 +1730,13 @@ discard block |
||
1730 | 1730 | } |
1731 | 1731 | } |
1732 | 1732 | } |
1733 | - $wAll = (int) max($this->w, $this->wp, $this->wl, $this->ws) - (2 * $borderThickness); |
|
1734 | - $hAll = (int) max($this->h, $this->hp, $this->hl, $this->hs) - (2 * $borderThickness); |
|
1733 | + $wAll = (int)max($this->w, $this->wp, $this->wl, $this->ws) - (2 * $borderThickness); |
|
1734 | + $hAll = (int)max($this->h, $this->hp, $this->hl, $this->hs) - (2 * $borderThickness); |
|
1735 | 1735 | $imAR = $this->source_width / $this->source_height; |
1736 | 1736 | $zcAR = (($wAll && $hAll) ? $wAll / $hAll : 1); |
1737 | 1737 | $side = phpthumb_functions::nonempty_min($this->source_width, $this->source_height, max($wAll, $hAll)); |
1738 | - $sideX = phpthumb_functions::nonempty_min($this->source_width, $wAll, round($hAll * $zcAR)); |
|
1739 | - $sideY = phpthumb_functions::nonempty_min( $this->source_height, $hAll, round($wAll / $zcAR)); |
|
1738 | + $sideX = phpthumb_functions::nonempty_min($this->source_width, $wAll, round($hAll * $zcAR)); |
|
1739 | + $sideY = phpthumb_functions::nonempty_min($this->source_height, $hAll, round($wAll / $zcAR)); |
|
1740 | 1740 | |
1741 | 1741 | $thumbnailH = round(max($sideY, ($sideY * $zcAR) / $imAR)); |
1742 | 1742 | if ($this->aoe == 1) { |
@@ -1791,9 +1791,9 @@ discard block |
||
1791 | 1791 | } elseif ($this->sw || $this->sh || $this->sx || $this->sy) { |
1792 | 1792 | |
1793 | 1793 | $crop_param = ''; |
1794 | - $crop_param .= ($this->sw ? (($this->sw < 2) ? round($this->sw * $this->source_width) : $this->sw) : $this->source_width); |
|
1794 | + $crop_param .= ($this->sw ? (($this->sw < 2) ? round($this->sw * $this->source_width) : $this->sw) : $this->source_width); |
|
1795 | 1795 | $crop_param .= 'x'.($this->sh ? (($this->sh < 2) ? round($this->sh * $this->source_height) : $this->sh) : $this->source_height); |
1796 | - $crop_param .= '+'.(($this->sx < 2) ? round($this->sx * $this->source_width) : $this->sx); |
|
1796 | + $crop_param .= '+'.(($this->sx < 2) ? round($this->sx * $this->source_width) : $this->sx); |
|
1797 | 1797 | $crop_param .= '+'.(($this->sy < 2) ? round($this->sy * $this->source_height) : $this->sy); |
1798 | 1798 | // TO BE FIXED |
1799 | 1799 | // makes 1x1 output |
@@ -1823,14 +1823,14 @@ discard block |
||
1823 | 1823 | |
1824 | 1824 | } else { |
1825 | 1825 | |
1826 | - if ($this->iar && ((int) $this->w > 0) && ((int) $this->h > 0)) { |
|
1826 | + if ($this->iar && ((int)$this->w > 0) && ((int)$this->h > 0)) { |
|
1827 | 1827 | |
1828 | 1828 | list($nw, $nh) = phpthumb_functions::TranslateWHbyAngle($this->w, $this->h, $this->ra); |
1829 | 1829 | $nw = ((round($nw) != 0) ? round($nw) : ''); |
1830 | 1830 | $nh = ((round($nh) != 0) ? round($nh) : ''); |
1831 | 1831 | $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement($nw.'x'.$nh.'!'); |
1832 | 1832 | |
1833 | - } elseif ($this->far && ((int) $this->w > 0) && ((int) $this->h > 0)) { |
|
1833 | + } elseif ($this->far && ((int)$this->w > 0) && ((int)$this->h > 0)) { |
|
1834 | 1834 | |
1835 | 1835 | $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement(phpthumb_functions::nonempty_min($this->w, $getimagesize[0]).'x'.phpthumb_functions::nonempty_min($this->h, $getimagesize[1])); |
1836 | 1836 | $commandline .= ' -gravity center'; |
@@ -1863,7 +1863,7 @@ discard block |
||
1863 | 1863 | |
1864 | 1864 | $this->DebugMessage('getimagesize('.$this->sourceFilename.') failed', __FILE__, __LINE__); |
1865 | 1865 | if ($this->w || $this->h) { |
1866 | - $exactDimensionsBang = (($this->iar && ((int) $this->w > 0) && ((int) $this->h > 0)) ? '!' : ''); |
|
1866 | + $exactDimensionsBang = (($this->iar && ((int)$this->w > 0) && ((int)$this->h > 0)) ? '!' : ''); |
|
1867 | 1867 | if ($IMuseExplicitImageOutputDimensions) { |
1868 | 1868 | // unknown source aspect ratio, just put large number and hope IM figures it out |
1869 | 1869 | $commandline .= ' -'.$IMresizeParameter.' '.phpthumb_functions::escapeshellarg_replacement(($this->w ? $this->w : '9999').'x'.($this->h ? $this->h : '9999').$exactDimensionsBang); |
@@ -1875,7 +1875,7 @@ discard block |
||
1875 | 1875 | } |
1876 | 1876 | |
1877 | 1877 | if ($this->ra) { |
1878 | - $this->ra = (int) $this->ra; |
|
1878 | + $this->ra = (int)$this->ra; |
|
1879 | 1879 | if ($this->ImageMagickSwitchAvailable('rotate')) { |
1880 | 1880 | if (!preg_match('#('.implode('|', $this->AlphaCapableFormats).')#i', $outputFormat) || phpthumb_functions::version_compare_replacement($this->ImageMagickVersion(), '6.3.7', '>=')) { |
1881 | 1881 | $this->DebugMessage('Using ImageMagick rotate', __FILE__, __LINE__); |
@@ -1903,14 +1903,14 @@ discard block |
||
1903 | 1903 | switch ($command) { |
1904 | 1904 | case 'brit': |
1905 | 1905 | if ($this->ImageMagickSwitchAvailable('modulate')) { |
1906 | - $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement((100 + (int) $parameter).',100,100'); |
|
1906 | + $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement((100 + (int)$parameter).',100,100'); |
|
1907 | 1907 | $successfullyProcessedFilters[] = $filterkey; |
1908 | 1908 | } |
1909 | 1909 | break; |
1910 | 1910 | |
1911 | 1911 | case 'cont': |
1912 | 1912 | if ($this->ImageMagickSwitchAvailable('contrast')) { |
1913 | - $contDiv10 = round((int) $parameter / 10); |
|
1913 | + $contDiv10 = round((int)$parameter / 10); |
|
1914 | 1914 | if ($contDiv10 > 0) { |
1915 | 1915 | $contDiv10 = min($contDiv10, 100); |
1916 | 1916 | for ($i = 0; $i < $contDiv10; $i++) { |
@@ -1934,7 +1934,7 @@ discard block |
||
1934 | 1934 | $commandline .= ' -colorspace GRAY'; |
1935 | 1935 | $commandline .= ' -modulate 100,0,100'; |
1936 | 1936 | } else { |
1937 | - $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement('100,'.(100 - (int) $parameter).',100'); |
|
1937 | + $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement('100,'.(100 - (int)$parameter).',100'); |
|
1938 | 1938 | } |
1939 | 1939 | $successfullyProcessedFilters[] = $filterkey; |
1940 | 1940 | } |
@@ -1946,7 +1946,7 @@ discard block |
||
1946 | 1946 | $commandline .= ' -colorspace GRAY'; |
1947 | 1947 | $commandline .= ' -modulate 100,0,100'; |
1948 | 1948 | } else { |
1949 | - $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement('100,'.(100 + (int) $parameter).',100'); |
|
1949 | + $commandline .= ' -modulate '.phpthumb_functions::escapeshellarg_replacement('100,'.(100 + (int)$parameter).',100'); |
|
1950 | 1950 | } |
1951 | 1951 | $successfullyProcessedFilters[] = $filterkey; |
1952 | 1952 | } |
@@ -1964,7 +1964,7 @@ discard block |
||
1964 | 1964 | if ($this->ImageMagickSwitchAvailable(array('fill', 'colorize'))) { |
1965 | 1965 | @list($amount, $color) = explode('|', $parameter); |
1966 | 1966 | $commandline .= ' -fill '.phpthumb_functions::escapeshellarg_replacement('#'.preg_replace('#[^0-9A-F]#i', '', $color)); |
1967 | - $commandline .= ' -colorize '.phpthumb_functions::escapeshellarg_replacement(min(max((int) $amount, 0), 100)); |
|
1967 | + $commandline .= ' -colorize '.phpthumb_functions::escapeshellarg_replacement(min(max((int)$amount, 0), 100)); |
|
1968 | 1968 | } |
1969 | 1969 | break; |
1970 | 1970 | |
@@ -1973,7 +1973,7 @@ discard block |
||
1973 | 1973 | @list($amount, $color) = explode('|', $parameter); |
1974 | 1974 | $amount = ($amount ? $amount : 80); |
1975 | 1975 | if (!$color) { |
1976 | - $commandline .= ' -sepia-tone '.phpthumb_functions::escapeshellarg_replacement(min(max((int) $amount, 0), 100).'%'); |
|
1976 | + $commandline .= ' -sepia-tone '.phpthumb_functions::escapeshellarg_replacement(min(max((int)$amount, 0), 100).'%'); |
|
1977 | 1977 | $successfullyProcessedFilters[] = $filterkey; |
1978 | 1978 | } |
1979 | 1979 | } |
@@ -1981,7 +1981,7 @@ discard block |
||
1981 | 1981 | |
1982 | 1982 | case 'gam': |
1983 | 1983 | @list($amount) = explode('|', $parameter); |
1984 | - $amount = min(max((float) $amount, 0.001), 10); |
|
1984 | + $amount = min(max((float)$amount, 0.001), 10); |
|
1985 | 1985 | if (number_format($amount, 3) != '1.000') { |
1986 | 1986 | if ($this->ImageMagickSwitchAvailable('gamma')) { |
1987 | 1987 | $commandline .= ' -gamma '.phpthumb_functions::escapeshellarg_replacement($amount); |
@@ -2000,7 +2000,7 @@ discard block |
||
2000 | 2000 | case 'th': |
2001 | 2001 | @list($amount) = explode('|', $parameter); |
2002 | 2002 | if ($this->ImageMagickSwitchAvailable(array('threshold', 'dither', 'monochrome'))) { |
2003 | - $commandline .= ' -threshold '.phpthumb_functions::escapeshellarg_replacement(round(min(max((int) $amount, 0), 255) / 2.55).'%'); |
|
2003 | + $commandline .= ' -threshold '.phpthumb_functions::escapeshellarg_replacement(round(min(max((int)$amount, 0), 255) / 2.55).'%'); |
|
2004 | 2004 | $commandline .= ' -dither'; |
2005 | 2005 | $commandline .= ' -monochrome'; |
2006 | 2006 | $successfullyProcessedFilters[] = $filterkey; |
@@ -2010,8 +2010,8 @@ discard block |
||
2010 | 2010 | case 'rcd': |
2011 | 2011 | if ($this->ImageMagickSwitchAvailable(array('colors', 'dither'))) { |
2012 | 2012 | @list($colors, $dither) = explode('|', $parameter); |
2013 | - $colors = ($colors ? (int) $colors : 256); |
|
2014 | - $dither = ((strlen($dither) > 0) ? (bool) $dither : true); |
|
2013 | + $colors = ($colors ? (int)$colors : 256); |
|
2014 | + $dither = ((strlen($dither) > 0) ? (bool)$dither : true); |
|
2015 | 2015 | $commandline .= ' -colors '.phpthumb_functions::escapeshellarg_replacement(max($colors, 8)); // ImageMagick will otherwise fail with "cannot quantize to fewer than 8 colors" |
2016 | 2016 | $commandline .= ($dither ? ' -dither' : ' +dither'); |
2017 | 2017 | $successfullyProcessedFilters[] = $filterkey; |
@@ -2033,7 +2033,7 @@ discard block |
||
2033 | 2033 | case 'edge': |
2034 | 2034 | if ($this->ImageMagickSwitchAvailable('edge')) { |
2035 | 2035 | $parameter = (!empty($parameter) ? $parameter : 2); |
2036 | - $commandline .= ' -edge '.phpthumb_functions::escapeshellarg_replacement(!empty($parameter) ? (int) $parameter : 1); |
|
2036 | + $commandline .= ' -edge '.phpthumb_functions::escapeshellarg_replacement(!empty($parameter) ? (int)$parameter : 1); |
|
2037 | 2037 | $successfullyProcessedFilters[] = $filterkey; |
2038 | 2038 | } |
2039 | 2039 | break; |
@@ -2041,7 +2041,7 @@ discard block |
||
2041 | 2041 | case 'emb': |
2042 | 2042 | if ($this->ImageMagickSwitchAvailable(array('emboss', 'negate'))) { |
2043 | 2043 | $parameter = (!empty($parameter) ? $parameter : 2); |
2044 | - $commandline .= ' -emboss '.phpthumb_functions::escapeshellarg_replacement((int) $parameter); |
|
2044 | + $commandline .= ' -emboss '.phpthumb_functions::escapeshellarg_replacement((int)$parameter); |
|
2045 | 2045 | if ($parameter < 2) { |
2046 | 2046 | $commandline .= ' -negate'; // ImageMagick negates the image for some reason with '-emboss 1'; |
2047 | 2047 | } |
@@ -2051,9 +2051,9 @@ discard block |
||
2051 | 2051 | |
2052 | 2052 | case 'lvl': |
2053 | 2053 | @list($band, $method, $threshold) = explode('|', $parameter); |
2054 | - $band = ($band ? preg_replace('#[^RGBA\\*]#', '', strtoupper($band)) : '*'); |
|
2055 | - $method = ((strlen($method) > 0) ? (int) $method : 2); |
|
2056 | - $threshold = ((strlen($threshold) > 0) ? min(max((float) $threshold, 0), 100) : 0.1); |
|
2054 | + $band = ($band ? preg_replace('#[^RGBA\\*]#', '', strtoupper($band)) : '*'); |
|
2055 | + $method = ((strlen($method) > 0) ? (int)$method : 2); |
|
2056 | + $threshold = ((strlen($threshold) > 0) ? min(max((float)$threshold, 0), 100) : 0.1); |
|
2057 | 2057 | |
2058 | 2058 | $band = preg_replace('#[^RGBA\\*]#', '', strtoupper($band)); |
2059 | 2059 | |
@@ -2114,7 +2114,7 @@ discard block |
||
2114 | 2114 | case 'wb': |
2115 | 2115 | if ($this->ImageMagickSwitchAvailable(array('channel', 'contrast-stretch'))) { |
2116 | 2116 | @list($threshold) = explode('|', $parameter); |
2117 | - $threshold = (!empty($threshold) ? min(max((float) $threshold, 0), 100) : 0.1); |
|
2117 | + $threshold = (!empty($threshold) ? min(max((float)$threshold, 0), 100) : 0.1); |
|
2118 | 2118 | $threshold = preg_replace('#[^0-9\\.]#', '', $threshold); // should be unneccesary, but just to be double-sure |
2119 | 2119 | //$commandline .= ' -channel R -contrast-stretch '.phpthumb_functions::escapeshellarg_replacement($threshold.'%'); // doesn't work on Windows because most versions of PHP do not properly |
2120 | 2120 | //$commandline .= ' -channel G -contrast-stretch '.phpthumb_functions::escapeshellarg_replacement($threshold.'%'); // escape special characters (such as %) and just replace them with spaces |
@@ -2130,7 +2130,7 @@ discard block |
||
2130 | 2130 | case 'blur': |
2131 | 2131 | if ($this->ImageMagickSwitchAvailable('blur')) { |
2132 | 2132 | @list($radius) = explode('|', $parameter); |
2133 | - $radius = (!empty($radius) ? min(max((int) $radius, 0), 25) : 1); |
|
2133 | + $radius = (!empty($radius) ? min(max((int)$radius, 0), 25) : 1); |
|
2134 | 2134 | $commandline .= ' -blur '.phpthumb_functions::escapeshellarg_replacement($radius); |
2135 | 2135 | $successfullyProcessedFilters[] = $filterkey; |
2136 | 2136 | } |
@@ -2138,7 +2138,7 @@ discard block |
||
2138 | 2138 | |
2139 | 2139 | case 'gblr': |
2140 | 2140 | @list($radius) = explode('|', $parameter); |
2141 | - $radius = (!empty($radius) ? min(max((int) $radius, 0), 25) : 1); |
|
2141 | + $radius = (!empty($radius) ? min(max((int)$radius, 0), 25) : 1); |
|
2142 | 2142 | // "-gaussian" changed to "-gaussian-blur" sometime around 2009 |
2143 | 2143 | if ($this->ImageMagickSwitchAvailable('gaussian-blur')) { |
2144 | 2144 | $commandline .= ' -gaussian-blur '.phpthumb_functions::escapeshellarg_replacement($radius); |
@@ -2152,9 +2152,9 @@ discard block |
||
2152 | 2152 | case 'usm': |
2153 | 2153 | if ($this->ImageMagickSwitchAvailable('unsharp')) { |
2154 | 2154 | @list($amount, $radius, $threshold) = explode('|', $parameter); |
2155 | - $amount = ($amount ? min(max((int) $amount, 0), 255) : 80); |
|
2156 | - $radius = ($radius ? min(max((int) $radius, 0), 10) : 0.5); |
|
2157 | - $threshold = (strlen($threshold) ? min(max((int) $threshold, 0), 50) : 3); |
|
2155 | + $amount = ($amount ? min(max((int)$amount, 0), 255) : 80); |
|
2156 | + $radius = ($radius ? min(max((int)$radius, 0), 10) : 0.5); |
|
2157 | + $threshold = (strlen($threshold) ? min(max((int)$threshold, 0), 50) : 3); |
|
2158 | 2158 | $commandline .= ' -unsharp '.phpthumb_functions::escapeshellarg_replacement(number_format(($radius * 2) - 1, 2, '.', '').'x1+'.number_format($amount / 100, 2, '.', '').'+'.number_format($threshold / 100, 2, '.', '')); |
2159 | 2159 | $successfullyProcessedFilters[] = $filterkey; |
2160 | 2160 | } |
@@ -2164,14 +2164,14 @@ discard block |
||
2164 | 2164 | if ($this->ImageMagickSwitchAvailable(array('border', 'bordercolor', 'thumbnail', 'crop'))) { |
2165 | 2165 | if (!$this->zc) { |
2166 | 2166 | @list($width, $rX, $rY, $color) = explode('|', $parameter); |
2167 | - $width = (int) $width; |
|
2168 | - $rX = (int) $rX; |
|
2169 | - $rY = (int) $rY; |
|
2167 | + $width = (int)$width; |
|
2168 | + $rX = (int)$rX; |
|
2169 | + $rY = (int)$rY; |
|
2170 | 2170 | if ($width && !$rX && !$rY) { |
2171 | 2171 | if (!phpthumb_functions::IsHexColor($color)) { |
2172 | 2172 | $color = ((!empty($this->bc) && phpthumb_functions::IsHexColor($this->bc)) ? $this->bc : '000000'); |
2173 | 2173 | } |
2174 | - $commandline .= ' -border '.phpthumb_functions::escapeshellarg_replacement((int) $width); |
|
2174 | + $commandline .= ' -border '.phpthumb_functions::escapeshellarg_replacement((int)$width); |
|
2175 | 2175 | $commandline .= ' -bordercolor '.phpthumb_functions::escapeshellarg_replacement('#'.$color); |
2176 | 2176 | |
2177 | 2177 | if (preg_match('# \\-crop "([0-9]+)x([0-9]+)\\+0\\+0" #', $commandline, $matches)) { |
@@ -2327,8 +2327,8 @@ discard block |
||
2327 | 2327 | $this->DebugMessage('!function_exists(imagerotate)', __FILE__, __LINE__); |
2328 | 2328 | return false; |
2329 | 2329 | } |
2330 | - if (!include_once( __DIR__ .'/phpthumb.filters.php')) { |
|
2331 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.filters.php" which is required for applying filters ('.implode(';', $this->fltr).')', __FILE__, __LINE__); |
|
2330 | + if (!include_once(__DIR__.'/phpthumb.filters.php')) { |
|
2331 | + $this->DebugMessage('Error including "'.__DIR__.'/phpthumb.filters.php" which is required for applying filters ('.implode(';', $this->fltr).')', __FILE__, __LINE__); |
|
2332 | 2332 | return false; |
2333 | 2333 | } |
2334 | 2334 | |
@@ -2340,7 +2340,7 @@ discard block |
||
2340 | 2340 | $rotate_angle = 0; |
2341 | 2341 | if ($this->ra) { |
2342 | 2342 | |
2343 | - $rotate_angle = (float) $this->ra; |
|
2343 | + $rotate_angle = (float)$this->ra; |
|
2344 | 2344 | |
2345 | 2345 | } else { |
2346 | 2346 | |
@@ -2383,7 +2383,7 @@ discard block |
||
2383 | 2383 | return false; |
2384 | 2384 | } |
2385 | 2385 | } else { |
2386 | - $this->DebugMessage('Cannot auto-rotate from EXIF data because PHP is less than v4.2.0 ('. PHP_VERSION .')', __FILE__, __LINE__); |
|
2386 | + $this->DebugMessage('Cannot auto-rotate from EXIF data because PHP is less than v4.2.0 ('.PHP_VERSION.')', __FILE__, __LINE__); |
|
2387 | 2387 | return false; |
2388 | 2388 | } |
2389 | 2389 | } elseif (($this->ar == 'l') && ($this->source_height > $this->source_width)) { |
@@ -2440,7 +2440,7 @@ discard block |
||
2440 | 2440 | $this->thumbnail_image_width = round($this->thumbnail_image_height * $aspectratio); |
2441 | 2441 | } elseif ($this->thumbnail_image_width < $this->thumbnail_width) { |
2442 | 2442 | $this->thumbnail_image_width = $this->thumbnail_width; |
2443 | - $this->thumbnail_image_height = round($this->thumbnail_image_width / $aspectratio); |
|
2443 | + $this->thumbnail_image_height = round($this->thumbnail_image_width / $aspectratio); |
|
2444 | 2444 | } |
2445 | 2445 | |
2446 | 2446 | } |
@@ -2475,7 +2475,7 @@ discard block |
||
2475 | 2475 | |
2476 | 2476 | public function AntiOffsiteLinking() { |
2477 | 2477 | // Optional anti-offsite hijacking of the thumbnail script |
2478 | - $allow = true; |
|
2478 | + $allow = true; |
|
2479 | 2479 | if ($allow && $this->config_nooffsitelink_enabled && (@$_SERVER['HTTP_REFERER'] || $this->config_nooffsitelink_require_refer)) { |
2480 | 2480 | $this->DebugMessage('AntiOffsiteLinking() checking $_SERVER[HTTP_REFERER] "'.@$_SERVER['HTTP_REFERER'].'"', __FILE__, __LINE__); |
2481 | 2481 | foreach ($this->config_nooffsitelink_valid_domains as $key => $valid_domain) { |
@@ -2485,7 +2485,7 @@ discard block |
||
2485 | 2485 | } |
2486 | 2486 | $parsed_url = phpthumb_functions::ParseURLbetter(@$_SERVER['HTTP_REFERER']); |
2487 | 2487 | if (!$this->OffsiteDomainIsAllowed(@$parsed_url['host'], $this->config_nooffsitelink_valid_domains)) { |
2488 | - $allow = false; |
|
2488 | + $allow = false; |
|
2489 | 2489 | //$this->DebugMessage('AntiOffsiteLinking() - "'.@$parsed_url['host'].'" is NOT in $this->config_nooffsitelink_valid_domains ('.implode(';', $this->config_nooffsitelink_valid_domains).')', __FILE__, __LINE__); |
2490 | 2490 | $this->ErrorImage('AntiOffsiteLinking() - "'.@$parsed_url['host'].'" is NOT in $this->config_nooffsitelink_valid_domains ('.implode(';', $this->config_nooffsitelink_valid_domains).')'); |
2491 | 2491 | } else { |
@@ -2525,8 +2525,8 @@ discard block |
||
2525 | 2525 | $this->config_nooffsitelink_watermark_src = $this->ResolveFilenameToAbsolute($this->config_nooffsitelink_watermark_src); |
2526 | 2526 | if (is_file($this->config_nooffsitelink_watermark_src)) { |
2527 | 2527 | |
2528 | - if (!include_once( __DIR__ .'/phpthumb.filters.php')) { |
|
2529 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.filters.php" which is required for applying watermark', __FILE__, __LINE__); |
|
2528 | + if (!include_once(__DIR__.'/phpthumb.filters.php')) { |
|
2529 | + $this->DebugMessage('Error including "'.__DIR__.'/phpthumb.filters.php" which is required for applying watermark', __FILE__, __LINE__); |
|
2530 | 2530 | return false; |
2531 | 2531 | } |
2532 | 2532 | $watermark_img = $this->ImageCreateFromStringReplacement(file_get_contents($this->config_nooffsitelink_watermark_src)); |
@@ -2664,8 +2664,8 @@ discard block |
||
2664 | 2664 | |
2665 | 2665 | public function ApplyFilters() { |
2666 | 2666 | if ($this->fltr && is_array($this->fltr)) { |
2667 | - if (!include_once( __DIR__ .'/phpthumb.filters.php')) { |
|
2668 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.filters.php" which is required for applying filters ('.implode(';', $this->fltr).')', __FILE__, __LINE__); |
|
2667 | + if (!include_once(__DIR__.'/phpthumb.filters.php')) { |
|
2668 | + $this->DebugMessage('Error including "'.__DIR__.'/phpthumb.filters.php" which is required for applying filters ('.implode(';', $this->fltr).')', __FILE__, __LINE__); |
|
2669 | 2669 | return false; |
2670 | 2670 | } |
2671 | 2671 | $phpthumbFilters = new phpthumb_filters(); |
@@ -2730,8 +2730,8 @@ discard block |
||
2730 | 2730 | break; |
2731 | 2731 | } |
2732 | 2732 | @list($colors, $dither) = explode('|', $parameter, 2); |
2733 | - $colors = ($colors ? (int) $colors : 256); |
|
2734 | - $dither = ((strlen($dither) > 0) ? (bool) $dither : true); |
|
2733 | + $colors = ($colors ? (int)$colors : 256); |
|
2734 | + $dither = ((strlen($dither) > 0) ? (bool)$dither : true); |
|
2735 | 2735 | $phpthumbFilters->ReduceColorDepth($this->gdimg_output, $colors, $dither); |
2736 | 2736 | break; |
2737 | 2737 | |
@@ -2755,8 +2755,8 @@ discard block |
||
2755 | 2755 | case 'lvl': // autoLevels |
2756 | 2756 | @list($band, $method, $threshold) = explode('|', $parameter, 3); |
2757 | 2757 | $band = ($band ? preg_replace('#[^RGBA\\*]#', '', strtoupper($band)) : '*'); |
2758 | - $method = ((strlen($method) > 0) ? (int) $method : 2); |
|
2759 | - $threshold = ((strlen($threshold) > 0) ? (float) $threshold : 0.1); |
|
2758 | + $method = ((strlen($method) > 0) ? (int)$method : 2); |
|
2759 | + $threshold = ((strlen($threshold) > 0) ? (float)$threshold : 0.1); |
|
2760 | 2760 | |
2761 | 2761 | $phpthumbFilters->HistogramStretch($this->gdimg_output, $band, $method, $threshold); |
2762 | 2762 | break; |
@@ -2771,13 +2771,13 @@ discard block |
||
2771 | 2771 | break; |
2772 | 2772 | } |
2773 | 2773 | @list($bands, $colors, $width, $height, $alignment, $opacity, $margin_x, $margin_y) = explode('|', $parameter, 8); |
2774 | - $bands = ($bands ? $bands : '*'); |
|
2775 | - $colors = ($colors ? $colors : ''); |
|
2776 | - $width = ($width ? $width : 0.25); |
|
2777 | - $height = ($height ? $height : 0.25); |
|
2774 | + $bands = ($bands ? $bands : '*'); |
|
2775 | + $colors = ($colors ? $colors : ''); |
|
2776 | + $width = ($width ? $width : 0.25); |
|
2777 | + $height = ($height ? $height : 0.25); |
|
2778 | 2778 | $alignment = ($alignment ? $alignment : 'BR'); |
2779 | - $opacity = ($opacity ? $opacity : 50); |
|
2780 | - $margin_x = ($margin_x ? $margin_x : 5); |
|
2779 | + $opacity = ($opacity ? $opacity : 50); |
|
2780 | + $margin_x = ($margin_x ? $margin_x : 5); |
|
2781 | 2781 | // $margin_y -- it wasn't forgotten, let the value always pass unchanged |
2782 | 2782 | $phpthumbFilters->HistogramOverlay($this->gdimg_output, $bands, $colors, $width, $height, $alignment, $opacity, $margin_x, $margin_y); |
2783 | 2783 | break; |
@@ -2862,9 +2862,9 @@ discard block |
||
2862 | 2862 | |
2863 | 2863 | case 'over': // Overlay |
2864 | 2864 | @list($filename, $underlay, $margin, $opacity) = explode('|', $parameter, 4); |
2865 | - $underlay = (bool) ($underlay ? $underlay : false); |
|
2866 | - $margin = ((strlen($margin) > 0) ? $margin : ($underlay ? 0.1 : 0.0)); |
|
2867 | - $opacity = ((strlen($opacity) > 0) ? $opacity : 100); |
|
2865 | + $underlay = (bool)($underlay ? $underlay : false); |
|
2866 | + $margin = ((strlen($margin) > 0) ? $margin : ($underlay ? 0.1 : 0.0)); |
|
2867 | + $opacity = ((strlen($opacity) > 0) ? $opacity : 100); |
|
2868 | 2868 | if (($margin > 0) && ($margin < 1)) { |
2869 | 2869 | $margin = min(0.499, $margin); |
2870 | 2870 | } elseif (($margin > -1) && ($margin < 0)) { |
@@ -2934,9 +2934,9 @@ discard block |
||
2934 | 2934 | case 'wmi': // WaterMarkImage |
2935 | 2935 | @list($filename, $alignment, $opacity, $margin['x'], $margin['y'], $rotate_angle) = explode('|', $parameter, 6); |
2936 | 2936 | // $margin can be pixel margin or percent margin if $alignment is text, or max width/height if $alignment is position like "50x75" |
2937 | - $alignment = ($alignment ? $alignment : 'BR'); |
|
2938 | - $opacity = (strlen($opacity) ? (int) $opacity : 50); |
|
2939 | - $rotate_angle = (strlen($rotate_angle) ? (int) $rotate_angle : 0); |
|
2937 | + $alignment = ($alignment ? $alignment : 'BR'); |
|
2938 | + $opacity = (strlen($opacity) ? (int)$opacity : 50); |
|
2939 | + $rotate_angle = (strlen($rotate_angle) ? (int)$rotate_angle : 0); |
|
2940 | 2940 | if (!preg_match('#^([0-9\\.\\-]*)x([0-9\\.\\-]*)$#i', $alignment, $matches)) { |
2941 | 2941 | $margins = array('x', 'y'); |
2942 | 2942 | foreach ($margins as $xy) { |
@@ -2956,8 +2956,8 @@ discard block |
||
2956 | 2956 | $phpthumbFilters->ImprovedImageRotate($img_watermark, $rotate_angle, 'FFFFFF', null, $this); |
2957 | 2957 | } |
2958 | 2958 | if (preg_match('#^([0-9\\.\\-]*)x([0-9\\.\\-]*)$#i', $alignment, $matches)) { |
2959 | - $watermark_max_width = (int) ($margin[ 'x'] ? $margin[ 'x'] : imagesx($img_watermark)); |
|
2960 | - $watermark_max_height = (int) ($margin[ 'y'] ? $margin[ 'y'] : imagesy($img_watermark)); |
|
2959 | + $watermark_max_width = (int)($margin['x'] ? $margin['x'] : imagesx($img_watermark)); |
|
2960 | + $watermark_max_height = (int)($margin['y'] ? $margin['y'] : imagesy($img_watermark)); |
|
2961 | 2961 | $scale = phpthumb_functions::ScaleToFitInBox(imagesx($img_watermark), imagesy($img_watermark), $watermark_max_width, $watermark_max_height, true, true); |
2962 | 2962 | $this->DebugMessage('Scaling watermark by a factor of '.number_format($scale, 4), __FILE__, __LINE__); |
2963 | 2963 | if (($scale > 1) || ($scale < 1)) { |
@@ -2989,18 +2989,18 @@ discard block |
||
2989 | 2989 | |
2990 | 2990 | case 'wmt': // WaterMarkText |
2991 | 2991 | @list($text, $size, $alignment, $hex_color, $ttffont, $opacity, $margin, $angle, $bg_color, $bg_opacity, $fillextend, $lineheight) = explode('|', $parameter, 12); |
2992 | - $text = ($text ? $text : ''); |
|
2993 | - $size = ($size ? $size : 3); |
|
2994 | - $alignment = ($alignment ? $alignment : 'BR'); |
|
2995 | - $hex_color = ($hex_color ? $hex_color : '000000'); |
|
2996 | - $ttffont = ($ttffont ? $ttffont : ''); |
|
2997 | - $opacity = (strlen($opacity) ? $opacity : 50); |
|
2998 | - $margin = (strlen($margin) ? $margin : 5); |
|
2999 | - $angle = (strlen($angle) ? $angle : 0); |
|
3000 | - $bg_color = ($bg_color ? $bg_color : false); |
|
3001 | - $bg_opacity = ($bg_opacity ? $bg_opacity : 0); |
|
3002 | - $fillextend = ($fillextend ? $fillextend : ''); |
|
3003 | - $lineheight = ($lineheight ? $lineheight : 1.0); |
|
2992 | + $text = ($text ? $text : ''); |
|
2993 | + $size = ($size ? $size : 3); |
|
2994 | + $alignment = ($alignment ? $alignment : 'BR'); |
|
2995 | + $hex_color = ($hex_color ? $hex_color : '000000'); |
|
2996 | + $ttffont = ($ttffont ? $ttffont : ''); |
|
2997 | + $opacity = (strlen($opacity) ? $opacity : 50); |
|
2998 | + $margin = (strlen($margin) ? $margin : 5); |
|
2999 | + $angle = (strlen($angle) ? $angle : 0); |
|
3000 | + $bg_color = ($bg_color ? $bg_color : false); |
|
3001 | + $bg_opacity = ($bg_opacity ? $bg_opacity : 0); |
|
3002 | + $fillextend = ($fillextend ? $fillextend : ''); |
|
3003 | + $lineheight = ($lineheight ? $lineheight : 1.0); |
|
3004 | 3004 | |
3005 | 3005 | if (basename($ttffont) == $ttffont) { |
3006 | 3006 | $ttffont = $this->realPathSafe($this->config_ttf_directory.DIRECTORY_SEPARATOR.$ttffont); |
@@ -3038,17 +3038,17 @@ discard block |
||
3038 | 3038 | |
3039 | 3039 | case 'usm': // UnSharpMask sharpening |
3040 | 3040 | @list($amount, $radius, $threshold) = explode('|', $parameter, 3); |
3041 | - $amount = ($amount ? $amount : 80); |
|
3042 | - $radius = ($radius ? $radius : 0.5); |
|
3041 | + $amount = ($amount ? $amount : 80); |
|
3042 | + $radius = ($radius ? $radius : 0.5); |
|
3043 | 3043 | $threshold = (strlen($threshold) ? $threshold : 3); |
3044 | 3044 | if (phpthumb_functions::gd_version() >= 2.0) { |
3045 | 3045 | ob_start(); |
3046 | - if (!@include_once( __DIR__ .'/phpthumb.unsharp.php')) { |
|
3046 | + if (!@include_once(__DIR__.'/phpthumb.unsharp.php')) { |
|
3047 | 3047 | $include_error = ob_get_contents(); |
3048 | 3048 | if ($include_error) { |
3049 | - $this->DebugMessage('include_once("'. __DIR__ .'/phpthumb.unsharp.php") generated message: "'.$include_error.'"', __FILE__, __LINE__); |
|
3049 | + $this->DebugMessage('include_once("'.__DIR__.'/phpthumb.unsharp.php") generated message: "'.$include_error.'"', __FILE__, __LINE__); |
|
3050 | 3050 | } |
3051 | - $this->DebugMessage('Error including "'. __DIR__ .'/phpthumb.unsharp.php" which is required for unsharp masking', __FILE__, __LINE__); |
|
3051 | + $this->DebugMessage('Error including "'.__DIR__.'/phpthumb.unsharp.php" which is required for unsharp masking', __FILE__, __LINE__); |
|
3052 | 3052 | ob_end_clean(); |
3053 | 3053 | return false; |
3054 | 3054 | } |
@@ -3062,11 +3062,11 @@ discard block |
||
3062 | 3062 | |
3063 | 3063 | case 'size': // Resize |
3064 | 3064 | @list($newwidth, $newheight, $stretch) = explode('|', $parameter); |
3065 | - $newwidth = (!$newwidth ? imagesx($this->gdimg_output) : ((($newwidth > 0) && ($newwidth < 1)) ? round($newwidth * imagesx($this->gdimg_output)) : round($newwidth))); |
|
3065 | + $newwidth = (!$newwidth ? imagesx($this->gdimg_output) : ((($newwidth > 0) && ($newwidth < 1)) ? round($newwidth * imagesx($this->gdimg_output)) : round($newwidth))); |
|
3066 | 3066 | $newheight = (!$newheight ? imagesy($this->gdimg_output) : ((($newheight > 0) && ($newheight < 1)) ? round($newheight * imagesy($this->gdimg_output)) : round($newheight))); |
3067 | 3067 | $stretch = ($stretch ? true : false); |
3068 | 3068 | if ($stretch) { |
3069 | - $scale_x = phpthumb_functions::ScaleToFitInBox(imagesx($this->gdimg_output), imagesx($this->gdimg_output), $newwidth, $newwidth, true, true); |
|
3069 | + $scale_x = phpthumb_functions::ScaleToFitInBox(imagesx($this->gdimg_output), imagesx($this->gdimg_output), $newwidth, $newwidth, true, true); |
|
3070 | 3070 | $scale_y = phpthumb_functions::ScaleToFitInBox(imagesy($this->gdimg_output), imagesy($this->gdimg_output), $newheight, $newheight, true, true); |
3071 | 3071 | } else { |
3072 | 3072 | $scale_x = phpthumb_functions::ScaleToFitInBox(imagesx($this->gdimg_output), imagesy($this->gdimg_output), $newwidth, $newheight, true, true); |
@@ -3101,7 +3101,7 @@ discard block |
||
3101 | 3101 | $this->DebugMessage('Skipping SourceTransparentColor hex color is invalid ('.$hexcolor.')', __FILE__, __LINE__); |
3102 | 3102 | return false; |
3103 | 3103 | } |
3104 | - $min_limit = (strlen($min_limit) ? $min_limit : 5); |
|
3104 | + $min_limit = (strlen($min_limit) ? $min_limit : 5); |
|
3105 | 3105 | $max_limit = (strlen($max_limit) ? $max_limit : 10); |
3106 | 3106 | if ($gdimg_mask = $phpthumbFilters->SourceTransparentColorMask($this->gdimg_output, $hexcolor, $min_limit, $max_limit)) { |
3107 | 3107 | $this->is_alpha = true; |
@@ -3189,17 +3189,17 @@ discard block |
||
3189 | 3189 | public function CalculateThumbnailDimensions() { |
3190 | 3190 | $this->DebugMessage('CalculateThumbnailDimensions() starting with [W,H,sx,sy,sw,sh] initially set to ['.$this->source_width.','.$this->source_height.','.$this->sx.','.$this->sy.','.$this->sw.','.$this->sh.']', __FILE__, __LINE__); |
3191 | 3191 | //echo $this->source_width.'x'.$this->source_height.'<hr>'; |
3192 | - $this->thumbnailCropX = ($this->sx ? (($this->sx >= 2) ? $this->sx : round($this->sx * $this->source_width)) : 0); |
|
3192 | + $this->thumbnailCropX = ($this->sx ? (($this->sx >= 2) ? $this->sx : round($this->sx * $this->source_width)) : 0); |
|
3193 | 3193 | //echo $this->thumbnailCropX.'<br>'; |
3194 | 3194 | $this->thumbnailCropY = ($this->sy ? (($this->sy >= 2) ? $this->sy : round($this->sy * $this->source_height)) : 0); |
3195 | 3195 | //echo $this->thumbnailCropY.'<br>'; |
3196 | - $this->thumbnailCropW = ($this->sw ? (($this->sw >= 2) ? $this->sw : round($this->sw * $this->source_width)) : $this->source_width); |
|
3196 | + $this->thumbnailCropW = ($this->sw ? (($this->sw >= 2) ? $this->sw : round($this->sw * $this->source_width)) : $this->source_width); |
|
3197 | 3197 | //echo $this->thumbnailCropW.'<br>'; |
3198 | 3198 | $this->thumbnailCropH = ($this->sh ? (($this->sh >= 2) ? $this->sh : round($this->sh * $this->source_height)) : $this->source_height); |
3199 | 3199 | //echo $this->thumbnailCropH.'<hr>'; |
3200 | 3200 | |
3201 | 3201 | // limit source area to original image area |
3202 | - $this->thumbnailCropW = max(1, min($this->thumbnailCropW, $this->source_width - $this->thumbnailCropX)); |
|
3202 | + $this->thumbnailCropW = max(1, min($this->thumbnailCropW, $this->source_width - $this->thumbnailCropX)); |
|
3203 | 3203 | $this->thumbnailCropH = max(1, min($this->thumbnailCropH, $this->source_height - $this->thumbnailCropY)); |
3204 | 3204 | |
3205 | 3205 | $this->DebugMessage('CalculateThumbnailDimensions() starting with [x,y,w,h] initially set to ['.$this->thumbnailCropX.','.$this->thumbnailCropY.','.$this->thumbnailCropW.','.$this->thumbnailCropH.']', __FILE__, __LINE__); |
@@ -3210,7 +3210,7 @@ discard block |
||
3210 | 3210 | // retain proportional resizing we did above, but crop off larger dimension so smaller |
3211 | 3211 | // dimension fully fits available space |
3212 | 3212 | |
3213 | - $scaling_X = $this->source_width / $this->w; |
|
3213 | + $scaling_X = $this->source_width / $this->w; |
|
3214 | 3214 | $scaling_Y = $this->source_height / $this->h; |
3215 | 3215 | if ($scaling_X > $scaling_Y) { |
3216 | 3216 | // some of the width will need to be cropped |
@@ -3331,7 +3331,7 @@ discard block |
||
3331 | 3331 | } |
3332 | 3332 | //$this->w = round($this->w ? $this->w : (($this->h && $this->source_height) ? $this->h * $this->source_width / $this->source_height : $this->w)); |
3333 | 3333 | //$this->h = round($this->h ? $this->h : (($this->w && $this->source_width) ? $this->w * $this->source_height / $this->source_width : $this->h)); |
3334 | - $this->DebugMessage('SetOrientationDependantWidthHeight() setting w="'. (int) $this->w .'", h="'. (int) $this->h .'"', __FILE__, __LINE__); |
|
3334 | + $this->DebugMessage('SetOrientationDependantWidthHeight() setting w="'.(int)$this->w.'", h="'.(int)$this->h.'"', __FILE__, __LINE__); |
|
3335 | 3335 | return true; |
3336 | 3336 | } |
3337 | 3337 | |
@@ -3439,7 +3439,7 @@ discard block |
||
3439 | 3439 | |
3440 | 3440 | } |
3441 | 3441 | |
3442 | - $this->DebugMessage('EXIF thumbnail extraction: (size='.strlen($this->exif_thumbnail_data).'; type="'.$this->exif_thumbnail_type.'"; '. (int) $this->exif_thumbnail_width .'x'. (int) $this->exif_thumbnail_height .')', __FILE__, __LINE__); |
|
3442 | + $this->DebugMessage('EXIF thumbnail extraction: (size='.strlen($this->exif_thumbnail_data).'; type="'.$this->exif_thumbnail_type.'"; '.(int)$this->exif_thumbnail_width.'x'.(int)$this->exif_thumbnail_height.')', __FILE__, __LINE__); |
|
3443 | 3443 | |
3444 | 3444 | // see if EXIF thumbnail can be used directly with no processing |
3445 | 3445 | if ($this->config_use_exif_thumbnail_for_speed && $this->exif_thumbnail_data) { |
@@ -3564,12 +3564,12 @@ discard block |
||
3564 | 3564 | $FilenameParameters2 = array('h', 'w', 'wl', 'wp', 'ws', 'hp', 'hs', 'xto', 'ra', 'iar', 'aoe', 'maxb', 'sfn', 'dpi'); |
3565 | 3565 | foreach ($FilenameParameters2 as $key) { |
3566 | 3566 | if ($this->$key) { |
3567 | - $ParametersString .= '_'.$key. (int) $this->$key; |
|
3567 | + $ParametersString .= '_'.$key.(int)$this->$key; |
|
3568 | 3568 | } |
3569 | 3569 | } |
3570 | 3570 | if ($this->thumbnailFormat == 'jpeg') { |
3571 | 3571 | // only JPEG output has variable quality option |
3572 | - $ParametersString .= '_q'. (int) $this->thumbnailQuality; |
|
3572 | + $ParametersString .= '_q'.(int)$this->thumbnailQuality; |
|
3573 | 3573 | } |
3574 | 3574 | $this->DebugMessage('SetCacheFilename() _par set from md5('.$ParametersString.')', __FILE__, __LINE__); |
3575 | 3575 | $this->cache_filename .= '_par'.strtolower(md5($ParametersString)); |
@@ -3579,9 +3579,9 @@ discard block |
||
3579 | 3579 | // do not source image modification date -- |
3580 | 3580 | // cached image will be used even if file was modified or removed |
3581 | 3581 | } elseif (!$this->config_cache_source_filemtime_ignore_remote && preg_match('#^(f|ht)tps?\://#i', $this->src)) { |
3582 | - $this->cache_filename .= '_dat'. (int) phpthumb_functions::filedate_remote($this->src); |
|
3582 | + $this->cache_filename .= '_dat'.(int)phpthumb_functions::filedate_remote($this->src); |
|
3583 | 3583 | } elseif (!$this->config_cache_source_filemtime_ignore_local && $this->src && !$this->rawImageData) { |
3584 | - $this->cache_filename .= '_dat'. (int) (@filemtime($this->sourceFilename)); |
|
3584 | + $this->cache_filename .= '_dat'.(int)(@filemtime($this->sourceFilename)); |
|
3585 | 3585 | } |
3586 | 3586 | |
3587 | 3587 | $this->cache_filename .= '.'.strtolower($this->thumbnailFormat); |
@@ -3601,9 +3601,9 @@ discard block |
||
3601 | 3601 | } |
3602 | 3602 | if ($this->php_memory_limit && function_exists('memory_get_usage')) { |
3603 | 3603 | $available_memory = $this->php_memory_limit - memory_get_usage(); |
3604 | - return (bool) (($width * $height * 5) > $available_memory); |
|
3604 | + return (bool)(($width * $height * 5) > $available_memory); |
|
3605 | 3605 | } |
3606 | - return (bool) (($width * $height) > $this->config_max_source_pixels); |
|
3606 | + return (bool)(($width * $height) > $this->config_max_source_pixels); |
|
3607 | 3607 | } |
3608 | 3608 | |
3609 | 3609 | public function ImageCreateFromFilename($filename) { |
@@ -3831,15 +3831,15 @@ discard block |
||
3831 | 3831 | switch (@$this->getimagesizeinfo[2]) { |
3832 | 3832 | case 1: |
3833 | 3833 | $imageHeader = 'Content-Type: image/gif'; |
3834 | - $GDreadSupport = (bool) @$gd_info['GIF Read Support']; |
|
3834 | + $GDreadSupport = (bool)@$gd_info['GIF Read Support']; |
|
3835 | 3835 | break; |
3836 | 3836 | case 2: |
3837 | 3837 | $imageHeader = 'Content-Type: image/jpeg'; |
3838 | - $GDreadSupport = (bool) @$gd_info['JPG Support']; |
|
3838 | + $GDreadSupport = (bool)@$gd_info['JPG Support']; |
|
3839 | 3839 | break; |
3840 | 3840 | case 3: |
3841 | 3841 | $imageHeader = 'Content-Type: image/png'; |
3842 | - $GDreadSupport = (bool) @$gd_info['PNG Support']; |
|
3842 | + $GDreadSupport = (bool)@$gd_info['PNG Support']; |
|
3843 | 3843 | break; |
3844 | 3844 | } |
3845 | 3845 | if ($imageHeader) { |
@@ -3867,7 +3867,7 @@ discard block |
||
3867 | 3867 | $this->ErrorImage(implode("\n", $errormessages)); |
3868 | 3868 | |
3869 | 3869 | } else { |
3870 | - $this->DebugMessage('All attempts to create GD image source failed ('.(ini_get('safe_mode') ? 'Safe Mode enabled, ImageMagick unavailable and source image probably too large for GD': ($GDreadSupport ? 'source image probably corrupt' : 'GD does not have read support for "'.$imageHeader.'"')).'), cannot generate thumbnail'); |
|
3870 | + $this->DebugMessage('All attempts to create GD image source failed ('.(ini_get('safe_mode') ? 'Safe Mode enabled, ImageMagick unavailable and source image probably too large for GD' : ($GDreadSupport ? 'source image probably corrupt' : 'GD does not have read support for "'.$imageHeader.'"')).'), cannot generate thumbnail'); |
|
3871 | 3871 | //$this->DebugMessage('All attempts to create GD image source failed ('.($GDreadSupport ? 'source image probably corrupt' : 'GD does not have read support for "'.$imageHeader.'"').'), outputing raw image', __FILE__, __LINE__); |
3872 | 3872 | //if (!$this->phpThumbDebug) { |
3873 | 3873 | // header($imageHeader); |
@@ -3883,9 +3883,9 @@ discard block |
||
3883 | 3883 | switch (@$this->getimagesizeinfo[2]) { |
3884 | 3884 | case 6: |
3885 | 3885 | ob_start(); |
3886 | - if (!@include_once( __DIR__ .'/phpthumb.bmp.php')) { |
|
3886 | + if (!@include_once(__DIR__.'/phpthumb.bmp.php')) { |
|
3887 | 3887 | ob_end_clean(); |
3888 | - return $this->ErrorImage('include_once('. __DIR__ .'/phpthumb.bmp.php) failed'); |
|
3888 | + return $this->ErrorImage('include_once('.__DIR__.'/phpthumb.bmp.php) failed'); |
|
3889 | 3889 | } |
3890 | 3890 | ob_end_clean(); |
3891 | 3891 | if ($fp = @fopen($this->sourceFilename, 'rb')) { |
@@ -3987,7 +3987,7 @@ discard block |
||
3987 | 3987 | return gettype($var); |
3988 | 3988 | } |
3989 | 3989 | |
3990 | - public function phpThumbDebug($level='') { |
|
3990 | + public function phpThumbDebug($level = '') { |
|
3991 | 3991 | if ($level && ($this->phpThumbDebug !== $level)) { |
3992 | 3992 | return true; |
3993 | 3993 | } |
@@ -4137,8 +4137,8 @@ discard block |
||
4137 | 4137 | return true; |
4138 | 4138 | } |
4139 | 4139 | |
4140 | - public function ErrorImage($text, $width=0, $height=0, $forcedisplay=false) { |
|
4141 | - $width = ($width ? $width : $this->config_error_image_width); |
|
4140 | + public function ErrorImage($text, $width = 0, $height = 0, $forcedisplay = false) { |
|
4141 | + $width = ($width ? $width : $this->config_error_image_width); |
|
4142 | 4142 | $height = ($height ? $height : $this->config_error_image_height); |
4143 | 4143 | |
4144 | 4144 | $text = 'phpThumb() v'.$this->phpthumb_version."\n".'http://phpthumb.sourceforge.net'."\n\n".($this->config_disable_debug ? 'Error messages disabled.'."\n\n".'edit phpThumb.config.php and (temporarily) set'."\n".'$PHPTHUMB_CONFIG[\'disable_debug\'] = false;'."\n".'to view the details of this error' : $text); |
@@ -4198,7 +4198,7 @@ discard block |
||
4198 | 4198 | |
4199 | 4199 | } elseif ($gdimg_error = imagecreate($width, $height)) { |
4200 | 4200 | |
4201 | - $background_color = phpthumb_functions::ImageHexColorAllocate($gdimg_error, $this->config_error_bgcolor, true); |
|
4201 | + $background_color = phpthumb_functions::ImageHexColorAllocate($gdimg_error, $this->config_error_bgcolor, true); |
|
4202 | 4202 | $text_color = phpthumb_functions::ImageHexColorAllocate($gdimg_error, $this->config_error_textcolor, true); |
4203 | 4203 | imagefilledrectangle($gdimg_error, 0, 0, $width, $height, $background_color); |
4204 | 4204 | $lineYoffset = 0; |
@@ -4231,7 +4231,7 @@ discard block |
||
4231 | 4231 | exit; |
4232 | 4232 | } |
4233 | 4233 | |
4234 | - public function ImageCreateFromStringReplacement(&$RawImageData, $DieOnErrors=false) { |
|
4234 | + public function ImageCreateFromStringReplacement(&$RawImageData, $DieOnErrors = false) { |
|
4235 | 4235 | // there are serious bugs in the non-bundled versions of GD which may cause |
4236 | 4236 | // PHP to segfault when calling imagecreatefromstring() - avoid if at all possible |
4237 | 4237 | // when not using a bundled version of GD2 |
@@ -4285,8 +4285,8 @@ discard block |
||
4285 | 4285 | |
4286 | 4286 | // Need to create from GIF file, but imagecreatefromgif does not exist |
4287 | 4287 | ob_start(); |
4288 | - if (!@include_once( __DIR__ .'/phpthumb.gif.php')) { |
|
4289 | - $ErrorMessage = 'Failed to include required file "'. __DIR__ .'/phpthumb.gif.php" in '.__FILE__.' on line '.__LINE__; |
|
4288 | + if (!@include_once(__DIR__.'/phpthumb.gif.php')) { |
|
4289 | + $ErrorMessage = 'Failed to include required file "'.__DIR__.'/phpthumb.gif.php" in '.__FILE__.' on line '.__LINE__; |
|
4290 | 4290 | $this->DebugMessage($ErrorMessage, __FILE__, __LINE__); |
4291 | 4291 | } |
4292 | 4292 | ob_end_clean(); |
@@ -4377,12 +4377,12 @@ discard block |
||
4377 | 4377 | return $tempnam; |
4378 | 4378 | } |
4379 | 4379 | |
4380 | - public function DebugMessage($message, $file='', $line='') { |
|
4380 | + public function DebugMessage($message, $file = '', $line = '') { |
|
4381 | 4381 | $this->debugmessages[] = $message.($file ? ' in file "'.(basename($file) ? basename($file) : $file).'"' : '').($line ? ' on line '.$line : ''); |
4382 | 4382 | return true; |
4383 | 4383 | } |
4384 | 4384 | |
4385 | - public function DebugTimingMessage($message, $file='', $line='', $timestamp=0) { |
|
4385 | + public function DebugTimingMessage($message, $file = '', $line = '', $timestamp = 0) { |
|
4386 | 4386 | if (!$timestamp) { |
4387 | 4387 | $timestamp = array_sum(explode(' ', microtime())); |
4388 | 4388 | } |