| [ Index ] |
PHP Cross Reference of Limb3 |
[Summary view] [Print] [Text view]
1 <?php 2 ////////////////////////////////////////////////////////////// 3 /// phpThumb() by James Heinrich <info@silisoftware.com> // 4 // available at http://phpthumb.sourceforge.net /// 5 ////////////////////////////////////////////////////////////// 6 /// // 7 // phpthumb.functions.php - general support functions // 8 // /// 9 ////////////////////////////////////////////////////////////// 10 11 class phpthumb_functions { 12 13 function user_function_exists($functionname) { 14 if (function_exists('get_defined_functions')) { 15 static $get_defined_functions = array(); 16 if (empty($get_defined_functions)) { 17 $get_defined_functions = get_defined_functions(); 18 } 19 return in_array(strtolower($functionname), $get_defined_functions['user']); 20 } 21 return function_exists($functionname); 22 } 23 24 25 function builtin_function_exists($functionname) { 26 if (function_exists('get_defined_functions')) { 27 static $get_defined_functions = array(); 28 if (empty($get_defined_functions)) { 29 $get_defined_functions = get_defined_functions(); 30 } 31 return in_array(strtolower($functionname), $get_defined_functions['internal']); 32 } 33 return function_exists($functionname); 34 } 35 36 37 function version_compare_replacement_sub($version1, $version2, $operator='') { 38 // If you specify the third optional operator argument, you can test for a particular relationship. 39 // The possible operators are: <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne respectively. 40 // Using this argument, the function will return 1 if the relationship is the one specified by the operator, 0 otherwise. 41 42 // If a part contains special version strings these are handled in the following order: dev < (alpha = a) < (beta = b) < RC < pl 43 static $versiontype_lookup = array(); 44 if (empty($versiontype_lookup)) { 45 $versiontype_lookup['dev'] = 10001; 46 $versiontype_lookup['a'] = 10002; 47 $versiontype_lookup['alpha'] = 10002; 48 $versiontype_lookup['b'] = 10003; 49 $versiontype_lookup['beta'] = 10003; 50 $versiontype_lookup['RC'] = 10004; 51 $versiontype_lookup['pl'] = 10005; 52 } 53 if (isset($versiontype_lookup[$version1])) { 54 $version1 = $versiontype_lookup[$version1]; 55 } 56 if (isset($versiontype_lookup[$version2])) { 57 $version2 = $versiontype_lookup[$version2]; 58 } 59 60 switch ($operator) { 61 case '<': 62 case 'lt': 63 return intval($version1 < $version2); 64 break; 65 case '<=': 66 case 'le': 67 return intval($version1 <= $version2); 68 break; 69 case '>': 70 case 'gt': 71 return intval($version1 > $version2); 72 break; 73 case '>=': 74 case 'ge': 75 return intval($version1 >= $version2); 76 break; 77 case '==': 78 case '=': 79 case 'eq': 80 return intval($version1 == $version2); 81 break; 82 case '!=': 83 case '<>': 84 case 'ne': 85 return intval($version1 != $version2); 86 break; 87 } 88 if ($version1 == $version2) { 89 return 0; 90 } elseif ($version1 < $version2) { 91 return -1; 92 } 93 return 1; 94 } 95 96 97 function version_compare_replacement($version1, $version2, $operator='') { 98 if (function_exists('version_compare')) { 99 // built into PHP v4.1.0+ 100 return version_compare($version1, $version2, $operator); 101 } 102 103 // The function first replaces _, - and + with a dot . in the version strings 104 $version1 = strtr($version1, '_-+', '...'); 105 $version2 = strtr($version2, '_-+', '...'); 106 107 // and also inserts dots . before and after any non number so that for example '4.3.2RC1' becomes '4.3.2.RC.1'. 108 // Then it splits the results like if you were using explode('.',$ver). Then it compares the parts starting from left to right. 109 $version1 = eregi_replace('([0-9]+)([A-Z]+)([0-9]+)', '\\1.\\2.\\3', $version1); 110 $version2 = eregi_replace('([0-9]+)([A-Z]+)([0-9]+)', '\\1.\\2.\\3', $version2); 111 112 $parts1 = explode('.', $version1); 113 $parts2 = explode('.', $version1); 114 $parts_count = max(count($parts1), count($parts2)); 115 for ($i = 0; $i < $parts_count; $i++) { 116 $comparison = phpthumb_functions::version_compare_replacement_sub($version1, $version2, $operator); 117 if ($comparison != 0) { 118 return $comparison; 119 } 120 } 121 return 0; 122 } 123 124 125 function phpinfo_array() { 126 static $phpinfo_array = array(); 127 if (empty($phpinfo_array)) { 128 ob_start(); 129 phpinfo(); 130 $phpinfo = ob_get_contents(); 131 ob_end_clean(); 132 $phpinfo_array = explode("\n", $phpinfo); 133 } 134 return $phpinfo_array; 135 } 136 137 138 function exif_info() { 139 static $exif_info = array(); 140 if (empty($exif_info)) { 141 // based on code by johnschaefer at gmx dot de 142 // from PHP help on gd_info() 143 $exif_info = array( 144 'EXIF Support' => '', 145 'EXIF Version' => '', 146 'Supported EXIF Version' => '', 147 'Supported filetypes' => '' 148 ); 149 $phpinfo_array = phpthumb_functions::phpinfo_array(); 150 foreach ($phpinfo_array as $dummy => $line) { 151 $line = trim(strip_tags($line)); 152 foreach ($exif_info as $key => $value) { 153 if (strpos($line, $key) === 0) { 154 $newvalue = trim(str_replace($key, '', $line)); 155 $exif_info[$key] = $newvalue; 156 } 157 } 158 } 159 } 160 return $exif_info; 161 } 162 163 164 function ImageTypeToMIMEtype($imagetype) { 165 if (function_exists('image_type_to_mime_type') && ($imagetype >= 1) && ($imagetype <= 16)) { 166 // PHP v4.3.0+ 167 return image_type_to_mime_type($imagetype); 168 } 169 static $image_type_to_mime_type = array( 170 1 => 'image/gif', // IMAGETYPE_GIF 171 2 => 'image/jpeg', // IMAGETYPE_JPEG 172 3 => 'image/png', // IMAGETYPE_PNG 173 4 => 'application/x-shockwave-flash', // IMAGETYPE_SWF 174 5 => 'image/psd', // IMAGETYPE_PSD 175 6 => 'image/bmp', // IMAGETYPE_BMP 176 7 => 'image/tiff', // IMAGETYPE_TIFF_II (intel byte order) 177 8 => 'image/tiff', // IMAGETYPE_TIFF_MM (motorola byte order) 178 9 => 'application/octet-stream', // IMAGETYPE_JPC 179 10 => 'image/jp2', // IMAGETYPE_JP2 180 11 => 'application/octet-stream', // IMAGETYPE_JPX 181 12 => 'application/octet-stream', // IMAGETYPE_JB2 182 13 => 'application/x-shockwave-flash', // IMAGETYPE_SWC 183 14 => 'image/iff', // IMAGETYPE_IFF 184 15 => 'image/vnd.wap.wbmp', // IMAGETYPE_WBMP 185 16 => 'image/xbm', // IMAGETYPE_XBM 186 187 'gif' => 'image/gif', // IMAGETYPE_GIF 188 'jpg' => 'image/jpeg', // IMAGETYPE_JPEG 189 'jpeg' => 'image/jpeg', // IMAGETYPE_JPEG 190 'png' => 'image/png', // IMAGETYPE_PNG 191 'bmp' => 'image/bmp', // IMAGETYPE_BMP 192 'ico' => 'image/x-icon', 193 ); 194 195 return (isset($image_type_to_mime_type[$imagetype]) ? $image_type_to_mime_type[$imagetype] : false); 196 } 197 198 199 function HexCharDisplay($string) { 200 $len = strlen($string); 201 $output = ''; 202 for ($i = 0; $i < $len; $i++) { 203 $output .= ' 0x'.str_pad(dechex(ord($string{$i})), 2, '0', STR_PAD_LEFT); 204 } 205 return $output; 206 } 207 208 209 function IsHexColor($HexColorString) { 210 return eregi('^[0-9A-F]{6}$', $HexColorString); 211 } 212 213 214 function ImageColorAllocateAlphaSafe(&$gdimg_hexcolorallocate, $R, $G, $B, $alpha=false) { 215 if (phpthumb_functions::version_compare_replacement(phpversion(), '4.3.2', '>=') && ($alpha !== false)) { 216 return ImageColorAllocateAlpha($gdimg_hexcolorallocate, $R, $G, $B, intval($alpha)); 217 } else { 218 return ImageColorAllocate($gdimg_hexcolorallocate, $R, $G, $B); 219 } 220 } 221 222 function ImageHexColorAllocate(&$gdimg_hexcolorallocate, $HexColorString, $dieOnInvalid=false, $alpha=false) { 223 if (!is_resource($gdimg_hexcolorallocate)) { 224 die('$gdimg_hexcolorallocate is not a GD resource in ImageHexColorAllocate()'); 225 } 226 if (phpthumb_functions::IsHexColor($HexColorString)) { 227 $R = hexdec(substr($HexColorString, 0, 2)); 228 $G = hexdec(substr($HexColorString, 2, 2)); 229 $B = hexdec(substr($HexColorString, 4, 2)); 230 return phpthumb_functions::ImageColorAllocateAlphaSafe($gdimg_hexcolorallocate, $R, $G, $B, $alpha); 231 } 232 if ($dieOnInvalid) { 233 die('Invalid hex color string: "'.$HexColorString.'"'); 234 } 235 return ImageColorAllocate($gdimg_hexcolorallocate, 0x00, 0x00, 0x00); 236 } 237 238 239 function HexColorXOR($hexcolor) { 240 return strtoupper(str_pad(dechex(~hexdec($hexcolor) & 0xFFFFFF), 6, '0', STR_PAD_LEFT)); 241 } 242 243 244 function GetPixelColor(&$img, $x, $y) { 245 if (!is_resource($img)) { 246 return false; 247 } 248 return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y)); 249 } 250 251 252 function GrayscaleValue($r, $g, $b) { 253 return round(($r * 0.30) + ($g * 0.59) + ($b * 0.11)); 254 } 255 256 257 function GrayscalePixel($OriginalPixel) { 258 $gray = phpthumb_functions::GrayscaleValue($OriginalPixel['red'], $OriginalPixel['green'], $OriginalPixel['blue']); 259 return array('red'=>$gray, 'green'=>$gray, 'blue'=>$gray); 260 } 261 262 263 function GrayscalePixelRGB($rgb) { 264 $r = ($rgb >> 16) & 0xFF; 265 $g = ($rgb >> 8) & 0xFF; 266 $b = $rgb & 0xFF; 267 return ($r * 0.299) + ($g * 0.587) + ($b * 0.114); 268 } 269 270 271 function ImageCopyResampleBicubic($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) { 272 // ron at korving dot demon dot nl 273 // http://www.php.net/imagecopyresampled 274 275 $scaleX = ($src_w - 1) / $dst_w; 276 $scaleY = ($src_h - 1) / $dst_h; 277 278 $scaleX2 = $scaleX / 2.0; 279 $scaleY2 = $scaleY / 2.0; 280 281 $isTrueColor = ImageIsTrueColor($src_img); 282 283 for ($y = $src_y; $y < $src_y + $dst_h; $y++) { 284 $sY = $y * $scaleY; 285 $siY = (int) $sY; 286 $siY2 = (int) $sY + $scaleY2; 287 288 for ($x = $src_x; $x < $src_x + $dst_w; $x++) { 289 $sX = $x * $scaleX; 290 $siX = (int) $sX; 291 $siX2 = (int) $sX + $scaleX2; 292 293 if ($isTrueColor) { 294 295 $c1 = ImageColorAt($src_img, $siX, $siY2); 296 $c2 = ImageColorAt($src_img, $siX, $siY); 297 $c3 = ImageColorAt($src_img, $siX2, $siY2); 298 $c4 = ImageColorAt($src_img, $siX2, $siY); 299 300 $r = (( $c1 + $c2 + $c3 + $c4 ) >> 2) & 0xFF0000; 301 $g = ((($c1 & 0x00FF00) + ($c2 & 0x00FF00) + ($c3 & 0x00FF00) + ($c4 & 0x00FF00)) >> 2) & 0x00FF00; 302 $b = ((($c1 & 0x0000FF) + ($c2 & 0x0000FF) + ($c3 & 0x0000FF) + ($c4 & 0x0000FF)) >> 2); 303 304 } else { 305 306 $c1 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $siX, $siY2)); 307 $c2 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $siX, $siY)); 308 $c3 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $siX2, $siY2)); 309 $c4 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $siX2, $siY)); 310 311 $r = ($c1['red'] + $c2['red'] + $c3['red'] + $c4['red'] ) << 14; 312 $g = ($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) << 6; 313 $b = ($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue'] ) >> 2; 314 315 } 316 ImageSetPixel($dst_img, $dst_x + $x - $src_x, $dst_y + $y - $src_y, $r+$g+$b); 317 } 318 } 319 return true; 320 } 321 322 323 function ImageCreateFunction($x_size, $y_size) { 324 $ImageCreateFunction = 'ImageCreate'; 325 if (phpthumb_functions::gd_version() >= 2.0) { 326 $ImageCreateFunction = 'ImageCreateTrueColor'; 327 } 328 if (!function_exists($ImageCreateFunction)) { 329 return phpthumb::ErrorImage($ImageCreateFunction.'() does not exist - no GD support?'); 330 } 331 if (($x_size <= 0) || ($y_size <= 0)) { 332 return phpthumb::ErrorImage('Invalid image dimensions: '.$ImageCreateFunction.'('.$x_size.', '.$y_size.')'); 333 } 334 return $ImageCreateFunction($x_size, $y_size); 335 } 336 337 338 function ImageCopyRespectAlpha(&$dst_im, &$src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct=100) { 339 for ($x = $src_x; $x < $src_w; $x++) { 340 for ($y = $src_y; $y < $src_h; $y++) { 341 $RealPixel = phpthumb_functions::GetPixelColor($dst_im, $dst_x + $x, $dst_y + $y); 342 $OverlayPixel = phpthumb_functions::GetPixelColor($src_im, $x, $y); 343 $alphapct = $OverlayPixel['alpha'] / 127; 344 $opacipct = $pct / 100; 345 $overlaypct = (1 - $alphapct) * $opacipct; 346 347 $newcolor = phpthumb_functions::ImageColorAllocateAlphaSafe( 348 $dst_im, 349 round($RealPixel['red'] * (1 - $overlaypct)) + ($OverlayPixel['red'] * $overlaypct), 350 round($RealPixel['green'] * (1 - $overlaypct)) + ($OverlayPixel['green'] * $overlaypct), 351 round($RealPixel['blue'] * (1 - $overlaypct)) + ($OverlayPixel['blue'] * $overlaypct), 352 //$RealPixel['alpha']); 353 0); 354 355 ImageSetPixel($dst_im, $dst_x + $x, $dst_y + $y, $newcolor); 356 } 357 } 358 return true; 359 } 360 361 362 function ProportionalResize($old_width, $old_height, $new_width=false, $new_height=false) { 363 $old_aspect_ratio = $old_width / $old_height; 364 if (($new_width === false) && ($new_height === false)) { 365 return false; 366 } elseif ($new_width === false) { 367 $new_width =