Complex classes like CImage often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use CImage, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 9 | class CImage |
||
|
|
|||
| 10 | { |
||
| 11 | |||
| 12 | /** |
||
| 13 | * Constants type of PNG image |
||
| 14 | */ |
||
| 15 | const PNG_GREYSCALE = 0; |
||
| 16 | const PNG_RGB = 2; |
||
| 17 | const PNG_RGB_PALETTE = 3; |
||
| 18 | const PNG_GREYSCALE_ALPHA = 4; |
||
| 19 | const PNG_RGB_ALPHA = 6; |
||
| 20 | |||
| 21 | |||
| 22 | |||
| 23 | /** |
||
| 24 | * Constant for default image quality when not set |
||
| 25 | */ |
||
| 26 | const JPEG_QUALITY_DEFAULT = 60; |
||
| 27 | |||
| 28 | |||
| 29 | |||
| 30 | /** |
||
| 31 | * Quality level for JPEG images. |
||
| 32 | */ |
||
| 33 | private $quality; |
||
| 34 | |||
| 35 | |||
| 36 | |||
| 37 | /** |
||
| 38 | * Is the quality level set from external use (true) or is it default (false)? |
||
| 39 | */ |
||
| 40 | private $useQuality = false; |
||
| 41 | |||
| 42 | |||
| 43 | |||
| 44 | /** |
||
| 45 | * Constant for default image quality when not set |
||
| 46 | */ |
||
| 47 | const PNG_COMPRESSION_DEFAULT = -1; |
||
| 48 | |||
| 49 | |||
| 50 | |||
| 51 | /** |
||
| 52 | * Compression level for PNG images. |
||
| 53 | */ |
||
| 54 | private $compress; |
||
| 55 | |||
| 56 | |||
| 57 | |||
| 58 | /** |
||
| 59 | * Is the compress level set from external use (true) or is it default (false)? |
||
| 60 | */ |
||
| 61 | private $useCompress = false; |
||
| 62 | |||
| 63 | |||
| 64 | |||
| 65 | |||
| 66 | /** |
||
| 67 | * Add HTTP headers for outputing image. |
||
| 68 | */ |
||
| 69 | private $HTTPHeader = array(); |
||
| 70 | |||
| 71 | |||
| 72 | |||
| 73 | /** |
||
| 74 | * Default background color, red, green, blue, alpha. |
||
| 75 | * |
||
| 76 | * @todo remake when upgrading to PHP 5.5 |
||
| 77 | */ |
||
| 78 | /* |
||
| 79 | const BACKGROUND_COLOR = array( |
||
| 80 | 'red' => 0, |
||
| 81 | 'green' => 0, |
||
| 82 | 'blue' => 0, |
||
| 83 | 'alpha' => null, |
||
| 84 | );*/ |
||
| 85 | |||
| 86 | |||
| 87 | |||
| 88 | /** |
||
| 89 | * Default background color to use. |
||
| 90 | * |
||
| 91 | * @todo remake when upgrading to PHP 5.5 |
||
| 92 | */ |
||
| 93 | //private $bgColorDefault = self::BACKGROUND_COLOR; |
||
| 94 | private $bgColorDefault = array( |
||
| 95 | 'red' => 0, |
||
| 96 | 'green' => 0, |
||
| 97 | 'blue' => 0, |
||
| 98 | 'alpha' => null, |
||
| 99 | ); |
||
| 100 | |||
| 101 | |||
| 102 | /** |
||
| 103 | * Background color to use, specified as part of options. |
||
| 104 | */ |
||
| 105 | private $bgColor; |
||
| 106 | |||
| 107 | |||
| 108 | |||
| 109 | /** |
||
| 110 | * Where to save the target file. |
||
| 111 | */ |
||
| 112 | private $saveFolder; |
||
| 113 | |||
| 114 | |||
| 115 | |||
| 116 | /** |
||
| 117 | * The working image object. |
||
| 118 | */ |
||
| 119 | private $image; |
||
| 120 | |||
| 121 | |||
| 122 | |||
| 123 | /** |
||
| 124 | * Image filename, may include subdirectory, relative from $imageFolder |
||
| 125 | */ |
||
| 126 | private $imageSrc; |
||
| 127 | |||
| 128 | |||
| 129 | |||
| 130 | /** |
||
| 131 | * Actual path to the image, $imageFolder . '/' . $imageSrc |
||
| 132 | */ |
||
| 133 | private $pathToImage; |
||
| 134 | |||
| 135 | |||
| 136 | |||
| 137 | /** |
||
| 138 | * File type for source image, as provided by getimagesize() |
||
| 139 | */ |
||
| 140 | private $fileType; |
||
| 141 | |||
| 142 | |||
| 143 | |||
| 144 | /** |
||
| 145 | * File extension to use when saving image. |
||
| 146 | */ |
||
| 147 | private $extension; |
||
| 148 | |||
| 149 | |||
| 150 | |||
| 151 | /** |
||
| 152 | * Output format, supports null (image) or json. |
||
| 153 | */ |
||
| 154 | private $outputFormat = null; |
||
| 155 | |||
| 156 | |||
| 157 | |||
| 158 | /** |
||
| 159 | * Verbose mode to print out a trace and display the created image |
||
| 160 | */ |
||
| 161 | private $verbose = false; |
||
| 162 | |||
| 163 | |||
| 164 | |||
| 165 | /** |
||
| 166 | * Keep a log/trace on what happens |
||
| 167 | */ |
||
| 168 | private $log = array(); |
||
| 169 | |||
| 170 | |||
| 171 | |||
| 172 | /** |
||
| 173 | * Handle image as palette image |
||
| 174 | */ |
||
| 175 | private $palette; |
||
| 176 | |||
| 177 | |||
| 178 | |||
| 179 | /** |
||
| 180 | * Target filename, with path, to save resulting image in. |
||
| 181 | */ |
||
| 182 | private $cacheFileName; |
||
| 183 | |||
| 184 | |||
| 185 | |||
| 186 | /** |
||
| 187 | * Set a format to save image as, or null to use original format. |
||
| 188 | */ |
||
| 189 | private $saveAs; |
||
| 190 | |||
| 191 | |||
| 192 | /** |
||
| 193 | * Path to command for filter optimize, for example optipng or null. |
||
| 194 | */ |
||
| 195 | private $pngFilter; |
||
| 196 | private $pngFilterCmd; |
||
| 197 | |||
| 198 | |||
| 199 | |||
| 200 | /** |
||
| 201 | * Path to command for deflate optimize, for example pngout or null. |
||
| 202 | */ |
||
| 203 | private $pngDeflate; |
||
| 204 | private $pngDeflateCmd; |
||
| 205 | |||
| 206 | |||
| 207 | |||
| 208 | /** |
||
| 209 | * Path to command to optimize jpeg images, for example jpegtran or null. |
||
| 210 | */ |
||
| 211 | private $jpegOptimize; |
||
| 212 | private $jpegOptimizeCmd; |
||
| 213 | |||
| 214 | |||
| 215 | |||
| 216 | /** |
||
| 217 | * Image dimensions, calculated from loaded image. |
||
| 218 | */ |
||
| 219 | private $width; // Calculated from source image |
||
| 220 | private $height; // Calculated from source image |
||
| 221 | |||
| 222 | |||
| 223 | /** |
||
| 224 | * New image dimensions, incoming as argument or calculated. |
||
| 225 | */ |
||
| 226 | private $newWidth; |
||
| 227 | private $newWidthOrig; // Save original value |
||
| 228 | private $newHeight; |
||
| 229 | private $newHeightOrig; // Save original value |
||
| 230 | |||
| 231 | |||
| 232 | /** |
||
| 233 | * Change target height & width when different dpr, dpr 2 means double image dimensions. |
||
| 234 | */ |
||
| 235 | private $dpr = 1; |
||
| 236 | |||
| 237 | |||
| 238 | /** |
||
| 239 | * Always upscale images, even if they are smaller than target image. |
||
| 240 | */ |
||
| 241 | const UPSCALE_DEFAULT = true; |
||
| 242 | private $upscale = self::UPSCALE_DEFAULT; |
||
| 243 | |||
| 244 | |||
| 245 | |||
| 246 | /** |
||
| 247 | * Array with details on how to crop, incoming as argument and calculated. |
||
| 248 | */ |
||
| 249 | public $crop; |
||
| 250 | public $cropOrig; // Save original value |
||
| 251 | |||
| 252 | |||
| 253 | /** |
||
| 254 | * String with details on how to do image convolution. String |
||
| 255 | * should map a key in the $convolvs array or be a string of |
||
| 256 | * 11 float values separated by comma. The first nine builds |
||
| 257 | * up the matrix, then divisor and last offset. |
||
| 258 | */ |
||
| 259 | private $convolve; |
||
| 260 | |||
| 261 | |||
| 262 | /** |
||
| 263 | * Custom convolution expressions, matrix 3x3, divisor and offset. |
||
| 264 | */ |
||
| 265 | private $convolves = array( |
||
| 266 | 'lighten' => '0,0,0, 0,12,0, 0,0,0, 9, 0', |
||
| 267 | 'darken' => '0,0,0, 0,6,0, 0,0,0, 9, 0', |
||
| 268 | 'sharpen' => '-1,-1,-1, -1,16,-1, -1,-1,-1, 8, 0', |
||
| 269 | 'sharpen-alt' => '0,-1,0, -1,5,-1, 0,-1,0, 1, 0', |
||
| 270 | 'emboss' => '1,1,-1, 1,3,-1, 1,-1,-1, 3, 0', |
||
| 271 | 'emboss-alt' => '-2,-1,0, -1,1,1, 0,1,2, 1, 0', |
||
| 272 | 'blur' => '1,1,1, 1,15,1, 1,1,1, 23, 0', |
||
| 273 | 'gblur' => '1,2,1, 2,4,2, 1,2,1, 16, 0', |
||
| 274 | 'edge' => '-1,-1,-1, -1,8,-1, -1,-1,-1, 9, 0', |
||
| 275 | 'edge-alt' => '0,1,0, 1,-4,1, 0,1,0, 1, 0', |
||
| 276 | 'draw' => '0,-1,0, -1,5,-1, 0,-1,0, 0, 0', |
||
| 277 | 'mean' => '1,1,1, 1,1,1, 1,1,1, 9, 0', |
||
| 278 | 'motion' => '1,0,0, 0,1,0, 0,0,1, 3, 0', |
||
| 279 | ); |
||
| 280 | |||
| 281 | |||
| 282 | /** |
||
| 283 | * Resize strategy to fill extra area with background color. |
||
| 284 | * True or false. |
||
| 285 | */ |
||
| 286 | private $fillToFit; |
||
| 287 | |||
| 288 | |||
| 289 | |||
| 290 | /** |
||
| 291 | * To store value for option scale. |
||
| 292 | */ |
||
| 293 | private $scale; |
||
| 294 | |||
| 295 | |||
| 296 | |||
| 297 | /** |
||
| 298 | * To store value for option. |
||
| 299 | */ |
||
| 300 | private $rotateBefore; |
||
| 301 | |||
| 302 | |||
| 303 | |||
| 304 | /** |
||
| 305 | * To store value for option. |
||
| 306 | */ |
||
| 307 | private $rotateAfter; |
||
| 308 | |||
| 309 | |||
| 310 | |||
| 311 | /** |
||
| 312 | * To store value for option. |
||
| 313 | */ |
||
| 314 | private $autoRotate; |
||
| 315 | |||
| 316 | |||
| 317 | |||
| 318 | /** |
||
| 319 | * To store value for option. |
||
| 320 | */ |
||
| 321 | private $sharpen; |
||
| 322 | |||
| 323 | |||
| 324 | |||
| 325 | /** |
||
| 326 | * To store value for option. |
||
| 327 | */ |
||
| 328 | private $emboss; |
||
| 329 | |||
| 330 | |||
| 331 | |||
| 332 | /** |
||
| 333 | * To store value for option. |
||
| 334 | */ |
||
| 335 | private $blur; |
||
| 336 | |||
| 337 | |||
| 338 | |||
| 339 | /** |
||
| 340 | * Used with option area to set which parts of the image to use. |
||
| 341 | */ |
||
| 342 | private $offset; |
||
| 343 | |||
| 344 | |||
| 345 | |||
| 346 | /** |
||
| 347 | * Calculate target dimension for image when using fill-to-fit resize strategy. |
||
| 348 | */ |
||
| 349 | private $fillWidth; |
||
| 350 | private $fillHeight; |
||
| 351 | |||
| 352 | |||
| 353 | |||
| 354 | /** |
||
| 355 | * Allow remote file download, default is to disallow remote file download. |
||
| 356 | */ |
||
| 357 | private $allowRemote = false; |
||
| 358 | |||
| 359 | |||
| 360 | |||
| 361 | /** |
||
| 362 | * Path to cache for remote download. |
||
| 363 | */ |
||
| 364 | private $remoteCache; |
||
| 365 | |||
| 366 | |||
| 367 | |||
| 368 | /** |
||
| 369 | * Pattern to recognize a remote file. |
||
| 370 | */ |
||
| 371 | //private $remotePattern = '#^[http|https]://#'; |
||
| 372 | private $remotePattern = '#^https?://#'; |
||
| 373 | |||
| 374 | |||
| 375 | |||
| 376 | /** |
||
| 377 | * Use the cache if true, set to false to ignore the cached file. |
||
| 378 | */ |
||
| 379 | private $useCache = true; |
||
| 380 | |||
| 381 | |||
| 382 | |||
| 383 | /* |
||
| 384 | * Set whitelist for valid hostnames from where remote source can be |
||
| 385 | * downloaded. |
||
| 386 | */ |
||
| 387 | private $remoteHostWhitelist = null; |
||
| 388 | |||
| 389 | |||
| 390 | |||
| 391 | /* |
||
| 392 | * Do verbose logging to file by setting this to a filename. |
||
| 393 | */ |
||
| 394 | private $verboseFileName = null; |
||
| 395 | |||
| 396 | |||
| 397 | |||
| 398 | /* |
||
| 399 | * Output to ascii can take som options as an array. |
||
| 400 | */ |
||
| 401 | private $asciiOptions = array(); |
||
| 402 | |||
| 403 | |||
| 404 | |||
| 405 | /* |
||
| 406 | * Image copy strategy, defaults to RESAMPLE. |
||
| 407 | */ |
||
| 408 | const RESIZE = 1; |
||
| 409 | const RESAMPLE = 2; |
||
| 410 | private $copyStrategy = NULL; |
||
| 411 | |||
| 412 | |||
| 413 | |||
| 414 | /** |
||
| 415 | * Properties, the class is mutable and the method setOptions() |
||
| 416 | * decides (partly) what properties are created. |
||
| 417 | * |
||
| 418 | * @todo Clean up these and check if and how they are used |
||
| 419 | */ |
||
| 420 | |||
| 421 | public $keepRatio; |
||
| 422 | public $cropToFit; |
||
| 423 | private $cropWidth; |
||
| 424 | private $cropHeight; |
||
| 425 | public $crop_x; |
||
| 426 | public $crop_y; |
||
| 427 | public $filters; |
||
| 428 | private $attr; // Calculated from source image |
||
| 429 | |||
| 430 | |||
| 431 | |||
| 432 | |||
| 433 | /** |
||
| 434 | 7 | * Constructor, can take arguments to init the object. |
|
| 435 | * |
||
| 436 | 7 | * @param string $imageSrc filename which may contain subdirectory. |
|
| 437 | 7 | * @param string $imageFolder path to root folder for images. |
|
| 438 | 7 | * @param string $saveFolder path to folder where to save the new file or null to skip saving. |
|
| 439 | * @param string $saveName name of target file when saveing. |
||
| 440 | */ |
||
| 441 | public function __construct($imageSrc = null, $imageFolder = null, $saveFolder = null, $saveName = null) |
||
| 442 | { |
||
| 443 | $this->setSource($imageSrc, $imageFolder); |
||
| 444 | $this->setTarget($saveFolder, $saveName); |
||
| 445 | } |
||
| 446 | |||
| 447 | |||
| 448 | |||
| 449 | /** |
||
| 450 | * Set verbose mode. |
||
| 451 | * |
||
| 452 | * @param boolean $mode true or false to enable and disable verbose mode, |
||
| 453 | * default is true. |
||
| 454 | * |
||
| 455 | * @return $this |
||
| 456 | */ |
||
| 457 | public function setVerbose($mode = true) |
||
| 458 | { |
||
| 459 | $this->verbose = $mode; |
||
| 460 | return $this; |
||
| 461 | } |
||
| 462 | |||
| 463 | |||
| 464 | |||
| 465 | /** |
||
| 466 | * Set save folder, base folder for saving cache files. |
||
| 467 | 2 | * |
|
| 468 | * @todo clean up how $this->saveFolder is used in other methods. |
||
| 469 | 2 | * |
|
| 470 | 2 | * @param string $path where to store cached files. |
|
| 471 | * |
||
| 472 | * @return $this |
||
| 473 | */ |
||
| 474 | public function setSaveFolder($path) |
||
| 475 | { |
||
| 476 | $this->saveFolder = $path; |
||
| 477 | return $this; |
||
| 478 | } |
||
| 479 | |||
| 480 | |||
| 481 | |||
| 482 | /** |
||
| 483 | * Use cache or not. |
||
| 484 | * |
||
| 485 | * @param boolean $use true or false to use cache. |
||
| 486 | * |
||
| 487 | * @return $this |
||
| 488 | */ |
||
| 489 | public function useCache($use = true) |
||
| 490 | { |
||
| 491 | $this->useCache = $use; |
||
| 492 | return $this; |
||
| 493 | } |
||
| 494 | |||
| 495 | |||
| 496 | |||
| 497 | /** |
||
| 498 | * Create and save a dummy image. Use dimensions as stated in |
||
| 499 | 2 | * $this->newWidth, or $width or default to 100 (same for height. |
|
| 500 | * |
||
| 501 | 2 | * @param integer $width use specified width for image dimension. |
|
| 502 | 2 | * @param integer $height use specified width for image dimension. |
|
| 503 | * |
||
| 504 | 2 | * @return $this |
|
| 505 | */ |
||
| 506 | 2 | public function createDummyImage($width = null, $height = null) |
|
| 507 | { |
||
| 508 | $this->newWidth = $this->newWidth ?: $width ?: 100; |
||
| 509 | $this->newHeight = $this->newHeight ?: $height ?: 100; |
||
| 510 | |||
| 511 | $this->image = $this->CreateImageKeepTransparency($this->newWidth, $this->newHeight); |
||
| 512 | |||
| 513 | return $this; |
||
| 514 | } |
||
| 515 | |||
| 516 | |||
| 517 | |||
| 518 | /** |
||
| 519 | 2 | * Allow or disallow remote image download. |
|
| 520 | * |
||
| 521 | 2 | * @param boolean $allow true or false to enable and disable. |
|
| 522 | 2 | * @param string $cache path to cache dir. |
|
| 523 | * @param string $pattern to use to detect if its a remote file. |
||
| 524 | 2 | * |
|
| 525 | * @return $this |
||
| 526 | 2 | */ |
|
| 527 | 2 | public function setRemoteDownload($allow, $cache, $pattern = null) |
|
| 528 | 2 | { |
|
| 529 | 2 | $this->allowRemote = $allow; |
|
| 530 | $this->remoteCache = $cache; |
||
| 531 | 2 | $this->remotePattern = is_null($pattern) ? $this->remotePattern : $pattern; |
|
| 532 | |||
| 533 | $this->log( |
||
| 534 | "Set remote download to: " |
||
| 535 | . ($this->allowRemote ? "true" : "false") |
||
| 536 | . " using pattern " |
||
| 537 | . $this->remotePattern |
||
| 538 | ); |
||
| 539 | |||
| 540 | return $this; |
||
| 541 | } |
||
| 542 | |||
| 543 | 2 | ||
| 544 | |||
| 545 | 2 | /** |
|
| 546 | 2 | * Check if the image resource is a remote file or not. |
|
| 547 | 2 | * |
|
| 548 | * @param string $src check if src is remote. |
||
| 549 | * |
||
| 550 | * @return boolean true if $src is a remote file, else false. |
||
| 551 | */ |
||
| 552 | public function isRemoteSource($src) |
||
| 553 | { |
||
| 554 | $remote = preg_match($this->remotePattern, $src); |
||
| 555 | $this->log("Detected remote image: " . ($remote ? "true" : "false")); |
||
| 556 | return !!$remote; |
||
| 557 | } |
||
| 558 | |||
| 559 | |||
| 560 | 2 | ||
| 561 | /** |
||
| 562 | 2 | * Set whitelist for valid hostnames from where remote source can be |
|
| 563 | 2 | * downloaded. |
|
| 564 | * |
||
| 565 | 2 | * @param array $whitelist with regexp hostnames to allow download from. |
|
| 566 | 2 | * |
|
| 567 | 2 | * @return $this |
|
| 568 | */ |
||
| 569 | public function setRemoteHostWhitelist($whitelist = null) |
||
| 570 | { |
||
| 571 | $this->remoteHostWhitelist = $whitelist; |
||
| 572 | $this->log( |
||
| 573 | "Setting remote host whitelist to: " |
||
| 574 | . (is_null($whitelist) ? "null" : print_r($whitelist, 1)) |
||
| 575 | ); |
||
| 576 | return $this; |
||
| 577 | } |
||
| 578 | |||
| 579 | |||
| 580 | 3 | ||
| 581 | /** |
||
| 582 | 3 | * Check if the hostname for the remote image, is on a whitelist, |
|
| 583 | 1 | * if the whitelist is defined. |
|
| 584 | 1 | * |
|
| 585 | * @param string $src the remote source. |
||
| 586 | * |
||
| 587 | 2 | * @return boolean true if hostname on $src is in the whitelist, else false. |
|
| 588 | 2 | */ |
|
| 589 | 2 | public function isRemoteSourceOnWhitelist($src) |
|
| 590 | { |
||
| 591 | 2 | if (is_null($this->remoteHostWhitelist)) { |
|
| 592 | $this->log("Remote host on whitelist not configured - allowing."); |
||
| 593 | 2 | return true; |
|
| 594 | 2 | } |
|
| 595 | 2 | ||
| 596 | $whitelist = new CWhitelist(); |
||
| 597 | $hostname = parse_url($src, PHP_URL_HOST); |
||
| 598 | $allow = $whitelist->check($hostname, $this->remoteHostWhitelist); |
||
| 599 | |||
| 600 | $this->log( |
||
| 601 | "Remote host is on whitelist: " |
||
| 602 | . ($allow ? "true" : "false") |
||
| 603 | ); |
||
| 604 | return $allow; |
||
| 605 | } |
||
| 606 | |||
| 607 | |||
| 608 | |||
| 609 | /** |
||
| 610 | * Check if file extension is valid as a file extension. |
||
| 611 | * |
||
| 612 | * @param string $extension of image file. |
||
| 613 | * |
||
| 614 | * @return $this |
||
| 615 | */ |
||
| 616 | private function checkFileExtension($extension) |
||
| 617 | { |
||
| 618 | $valid = array('jpg', 'jpeg', 'png', 'gif'); |
||
| 619 | |||
| 620 | in_array(strtolower($extension), $valid) |
||
| 621 | or $this->raiseError('Not a valid file extension.'); |
||
| 622 | |||
| 623 | return $this; |
||
| 624 | } |
||
| 625 | |||
| 626 | 2 | ||
| 627 | |||
| 628 | 2 | /** |
|
| 629 | * Normalize the file extension. |
||
| 630 | 2 | * |
|
| 631 | * @param string $extension of image file or skip to use internal. |
||
| 632 | * |
||
| 633 | * @return string $extension as a normalized file extension. |
||
| 634 | 2 | */ |
|
| 635 | private function normalizeFileExtension($extension = null) |
||
| 636 | { |
||
| 637 | $extension = strtolower($extension ? $extension : $this->extension); |
||
| 638 | |||
| 639 | if ($extension == 'jpeg') { |
||
| 640 | $extension = 'jpg'; |
||
| 641 | } |
||
| 642 | |||
| 643 | return $extension; |
||
| 644 | } |
||
| 645 | |||
| 646 | |||
| 647 | |||
| 648 | /** |
||
| 649 | * Download a remote image and return path to its local copy. |
||
| 650 | * |
||
| 651 | * @param string $src remote path to image. |
||
| 652 | * |
||
| 653 | * @return string as path to downloaded remote source. |
||
| 654 | */ |
||
| 655 | public function downloadRemoteSource($src) |
||
| 656 | { |
||
| 657 | if (!$this->isRemoteSourceOnWhitelist($src)) { |
||
| 658 | throw new Exception("Hostname is not on whitelist for remote sources."); |
||
| 659 | } |
||
| 660 | |||
| 661 | $remote = new CRemoteImage(); |
||
| 662 | |||
| 663 | if (!is_writable($this->remoteCache)) { |
||
| 664 | $this->log("The remote cache is not writable."); |
||
| 665 | } |
||
| 666 | |||
| 667 | $remote->setCache($this->remoteCache); |
||
| 668 | $remote->useCache($this->useCache); |
||
| 669 | $src = $remote->download($src); |
||
| 670 | |||
| 671 | $this->log("Remote HTTP status: " . $remote->getStatus()); |
||
| 672 | $this->log("Remote item is in local cache: $src"); |
||
| 673 | $this->log("Remote details on cache:" . print_r($remote->getDetails(), true)); |
||
| 674 | |||
| 675 | return $src; |
||
| 676 | } |
||
| 677 | |||
| 678 | |||
| 679 | |||
| 680 | /** |
||
| 681 | * Set source file to use as image source. |
||
| 682 | * |
||
| 683 | * @param string $src of image. |
||
| 684 | * @param string $dir as optional base directory where images are. |
||
| 685 | * |
||
| 686 | * @return $this |
||
| 687 | */ |
||
| 688 | 7 | public function setSource($src, $dir = null) |
|
| 712 | |||
| 713 | |||
| 714 | |||
| 715 | /** |
||
| 716 | * Set target file. |
||
| 717 | * |
||
| 718 | * @param string $src of target image. |
||
| 719 | * @param string $dir as optional base directory where images are stored. |
||
| 720 | * Uses $this->saveFolder if null. |
||
| 721 | * |
||
| 722 | * @return $this |
||
| 723 | */ |
||
| 724 | 7 | public function setTarget($src = null, $dir = null) |
|
| 743 | |||
| 744 | |||
| 745 | |||
| 746 | /** |
||
| 747 | * Get filename of target file. |
||
| 748 | * |
||
| 749 | * @return Boolean|String as filename of target or false if not set. |
||
| 750 | */ |
||
| 751 | 2 | public function getTarget() |
|
| 755 | |||
| 756 | |||
| 757 | |||
| 758 | /** |
||
| 759 | * Set options to use when processing image. |
||
| 760 | * |
||
| 761 | * @param array $args used when processing image. |
||
| 762 | * |
||
| 763 | * @return $this |
||
| 764 | */ |
||
| 765 | public function setOptions($args) |
||
| 867 | |||
| 868 | |||
| 869 | |||
| 870 | /** |
||
| 871 | * Map filter name to PHP filter and id. |
||
| 872 | * |
||
| 873 | * @param string $name the name of the filter. |
||
| 874 | * |
||
| 875 | * @return array with filter settings |
||
| 876 | * @throws Exception |
||
| 877 | */ |
||
| 878 | private function mapFilter($name) |
||
| 901 | |||
| 902 | |||
| 903 | |||
| 904 | /** |
||
| 905 | * Load image details from original image file. |
||
| 906 | * |
||
| 907 | * @param string $file the file to load or null to use $this->pathToImage. |
||
| 908 | * |
||
| 909 | * @return $this |
||
| 910 | * @throws Exception |
||
| 911 | */ |
||
| 912 | public function loadImageDetails($file = null) |
||
| 934 | |||
| 935 | |||
| 936 | |||
| 937 | /** |
||
| 938 | * Init new width and height and do some sanity checks on constraints, before any |
||
| 939 | * processing can be done. |
||
| 940 | * |
||
| 941 | * @return $this |
||
| 942 | * @throws Exception |
||
| 943 | */ |
||
| 944 | public function initDimensions() |
||
| 1009 | |||
| 1010 | |||
| 1011 | |||
| 1012 | /** |
||
| 1013 | * Calculate new width and height of image, based on settings. |
||
| 1014 | * |
||
| 1015 | * @return $this |
||
| 1016 | */ |
||
| 1017 | public function calculateNewWidthAndHeight() |
||
| 1154 | |||
| 1155 | |||
| 1156 | |||
| 1157 | /** |
||
| 1158 | * Re-calculate image dimensions when original image dimension has changed. |
||
| 1159 | * |
||
| 1160 | * @return $this |
||
| 1161 | */ |
||
| 1162 | public function reCalculateDimensions() |
||
| 1175 | |||
| 1176 | |||
| 1177 | |||
| 1178 | /** |
||
| 1179 | * Set extension for filename to save as. |
||
| 1180 | * |
||
| 1181 | * @param string $saveas extension to save image as |
||
| 1182 | * |
||
| 1183 | * @return $this |
||
| 1184 | */ |
||
| 1185 | public function setSaveAsExtension($saveAs = null) |
||
| 1198 | |||
| 1199 | |||
| 1200 | |||
| 1201 | /** |
||
| 1202 | * Set JPEG quality to use when saving image |
||
| 1203 | * |
||
| 1204 | * @param int $quality as the quality to set. |
||
| 1205 | * |
||
| 1206 | * @return $this |
||
| 1207 | */ |
||
| 1208 | public function setJpegQuality($quality = null) |
||
| 1225 | |||
| 1226 | |||
| 1227 | |||
| 1228 | /** |
||
| 1229 | * Set PNG compressen algorithm to use when saving image |
||
| 1230 | * |
||
| 1231 | * @param int $compress as the algorithm to use. |
||
| 1232 | * |
||
| 1233 | * @return $this |
||
| 1234 | */ |
||
| 1235 | public function setPngCompression($compress = null) |
||
| 1252 | |||
| 1253 | |||
| 1254 | |||
| 1255 | /** |
||
| 1256 | * Use original image if possible, check options which affects image processing. |
||
| 1257 | * |
||
| 1258 | * @param boolean $useOrig default is to use original if possible, else set to false. |
||
| 1259 | * |
||
| 1260 | * @return $this |
||
| 1261 | */ |
||
| 1262 | public function useOriginalIfPossible($useOrig = true) |
||
| 1292 | |||
| 1293 | |||
| 1294 | |||
| 1295 | /** |
||
| 1296 | * Generate filename to save file in cache. |
||
| 1297 | * |
||
| 1298 | * @param string $base as optional basepath for storing file. |
||
| 1299 | * @param boolean $useSubdir use or skip the subdir part when creating the |
||
| 1300 | * filename. |
||
| 1301 | * @param string $prefix to add as part of filename |
||
| 1302 | * |
||
| 1303 | * @return $this |
||
| 1304 | 2 | */ |
|
| 1305 | public function generateFilename($base = null, $useSubdir = true, $prefix = null) |
||
| 1388 | |||
| 1389 | |||
| 1390 | |||
| 1391 | /** |
||
| 1392 | * Use cached version of image, if possible. |
||
| 1393 | * |
||
| 1394 | * @param boolean $useCache is default true, set to false to avoid using cached object. |
||
| 1395 | * |
||
| 1396 | * @return $this |
||
| 1397 | */ |
||
| 1398 | public function useCacheIfPossible($useCache = true) |
||
| 1423 | |||
| 1424 | |||
| 1425 | |||
| 1426 | /** |
||
| 1427 | * Load image from disk. Try to load image without verbose error message, |
||
| 1428 | * if fail, load again and display error messages. |
||
| 1429 | * |
||
| 1430 | * @param string $src of image. |
||
| 1431 | * @param string $dir as base directory where images are. |
||
| 1432 | * |
||
| 1433 | * @return $this |
||
| 1434 | * |
||
| 1435 | */ |
||
| 1436 | public function load($src = null, $dir = null) |
||
| 1474 | |||
| 1475 | |||
| 1476 | |||
| 1477 | /** |
||
| 1478 | * Get the type of PNG image. |
||
| 1479 | * |
||
| 1480 | * @param string $filename to use instead of default. |
||
| 1481 | * |
||
| 1482 | * @return int as the type of the png-image |
||
| 1483 | * |
||
| 1484 | */ |
||
| 1485 | public function getPngType($filename = null) |
||
| 1498 | |||
| 1499 | |||
| 1500 | |||
| 1501 | /** |
||
| 1502 | * Get the type of PNG image as a verbose string. |
||
| 1503 | * |
||
| 1504 | * @param integer $type to use, default is to check the type. |
||
| 1505 | * @param string $filename to use instead of default. |
||
| 1506 | * |
||
| 1507 | * @return int as the type of the png-image |
||
| 1508 | * |
||
| 1509 | */ |
||
| 1510 | private function getPngTypeAsString($pngType = null, $filename = null) |
||
| 1550 | |||
| 1551 | |||
| 1552 | |||
| 1553 | |||
| 1554 | /** |
||
| 1555 | * Calculate number of colors in an image. |
||
| 1556 | * |
||
| 1557 | * @param resource $im the image. |
||
| 1558 | * |
||
| 1559 | * @return int |
||
| 1560 | */ |
||
| 1561 | private function colorsTotal($im) |
||
| 1579 | |||
| 1580 | |||
| 1581 | |||
| 1582 | /** |
||
| 1583 | * Preprocess image before rezising it. |
||
| 1584 | * |
||
| 1585 | * @return $this |
||
| 1586 | */ |
||
| 1587 | public function preResize() |
||
| 1619 | |||
| 1620 | |||
| 1621 | |||
| 1622 | /** |
||
| 1623 | * Resize or resample the image while resizing. |
||
| 1624 | * |
||
| 1625 | * @param int $strategy as CImage::RESIZE or CImage::RESAMPLE |
||
| 1626 | * |
||
| 1627 | * @return $this |
||
| 1628 | */ |
||
| 1629 | public function setCopyResizeStrategy($strategy) |
||
| 1634 | |||
| 1635 | |||
| 1636 | |||
| 1637 | /** |
||
| 1638 | * Resize and or crop the image. |
||
| 1639 | * |
||
| 1640 | * @return void |
||
| 1641 | */ |
||
| 1642 | public function imageCopyResampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) |
||
| 1652 | |||
| 1653 | |||
| 1654 | |||
| 1655 | /** |
||
| 1656 | * Resize and or crop the image. |
||
| 1657 | * |
||
| 1658 | * @return $this |
||
| 1659 | */ |
||
| 1660 | public function resize() |
||
| 1817 | |||
| 1818 | |||
| 1819 | |||
| 1820 | /** |
||
| 1821 | * Postprocess image after rezising image. |
||
| 1822 | * |
||
| 1823 | * @return $this |
||
| 1824 | */ |
||
| 1825 | public function postResize() |
||
| 1898 | |||
| 1899 | |||
| 1900 | |||
| 1901 | /** |
||
| 1902 | * Rotate image using angle. |
||
| 1903 | * |
||
| 1904 | * @param float $angle to rotate image. |
||
| 1905 | * @param int $anglebgColor to fill image with if needed. |
||
| 1906 | * |
||
| 1907 | * @return $this |
||
| 1908 | */ |
||
| 1909 | public function rotate($angle, $bgColor) |
||
| 1923 | |||
| 1924 | |||
| 1925 | |||
| 1926 | /** |
||
| 1927 | * Rotate image using information in EXIF. |
||
| 1928 | * |
||
| 1929 | * @return $this |
||
| 1930 | */ |
||
| 1931 | public function rotateExif() |
||
| 1966 | |||
| 1967 | |||
| 1968 | |||
| 1969 | /** |
||
| 1970 | * Convert true color image to palette image, keeping alpha. |
||
| 1971 | * http://stackoverflow.com/questions/5752514/how-to-convert-png-to-8-bit-png-using-php-gd-library |
||
| 1972 | * |
||
| 1973 | * @return void |
||
| 1974 | */ |
||
| 1975 | public function trueColorToPalette() |
||
| 1992 | |||
| 1993 | |||
| 1994 | |||
| 1995 | /** |
||
| 1996 | * Sharpen image using image convolution. |
||
| 1997 | * |
||
| 1998 | * @return $this |
||
| 1999 | */ |
||
| 2000 | public function sharpenImage() |
||
| 2005 | |||
| 2006 | |||
| 2007 | |||
| 2008 | /** |
||
| 2009 | * Emboss image using image convolution. |
||
| 2010 | * |
||
| 2011 | * @return $this |
||
| 2012 | */ |
||
| 2013 | public function embossImage() |
||
| 2018 | |||
| 2019 | |||
| 2020 | |||
| 2021 | /** |
||
| 2022 | * Blur image using image convolution. |
||
| 2023 | * |
||
| 2024 | * @return $this |
||
| 2025 | */ |
||
| 2026 | public function blurImage() |
||
| 2031 | |||
| 2032 | |||
| 2033 | |||
| 2034 | /** |
||
| 2035 | * Create convolve expression and return arguments for image convolution. |
||
| 2036 | * |
||
| 2037 | * @param string $expression constant string which evaluates to a list of |
||
| 2038 | * 11 numbers separated by komma or such a list. |
||
| 2039 | * |
||
| 2040 | * @return array as $matrix (3x3), $divisor and $offset |
||
| 2041 | */ |
||
| 2042 | public function createConvolveArguments($expression) |
||
| 2076 | |||
| 2077 | |||
| 2078 | |||
| 2079 | /** |
||
| 2080 | * Add custom expressions (or overwrite existing) for image convolution. |
||
| 2081 | * |
||
| 2082 | * @param array $options Key value array with strings to be converted |
||
| 2083 | * to convolution expressions. |
||
| 2084 | * |
||
| 2085 | * @return $this |
||
| 2086 | */ |
||
| 2087 | public function addConvolveExpressions($options) |
||
| 2092 | |||
| 2093 | |||
| 2094 | |||
| 2095 | /** |
||
| 2096 | * Image convolution. |
||
| 2097 | * |
||
| 2098 | * @param string $options A string with 11 float separated by comma. |
||
| 2099 | * |
||
| 2100 | * @return $this |
||
| 2101 | */ |
||
| 2102 | public function imageConvolution($options = null) |
||
| 2119 | |||
| 2120 | |||
| 2121 | |||
| 2122 | /** |
||
| 2123 | * Set default background color between 000000-FFFFFF or if using |
||
| 2124 | * alpha 00000000-FFFFFF7F. |
||
| 2125 | * |
||
| 2126 | * @param string $color as hex value. |
||
| 2127 | * |
||
| 2128 | * @return $this |
||
| 2129 | */ |
||
| 2130 | public function setDefaultBackgroundColor($color) |
||
| 2172 | |||
| 2173 | |||
| 2174 | |||
| 2175 | /** |
||
| 2176 | * Get the background color. |
||
| 2177 | * |
||
| 2178 | * @param resource $img the image to work with or null if using $this->image. |
||
| 2179 | * |
||
| 2180 | * @return color value or null if no background color is set. |
||
| 2181 | 2 | */ |
|
| 2182 | private function getBackgroundColor($img = null) |
||
| 2205 | |||
| 2206 | |||
| 2207 | |||
| 2208 | /** |
||
| 2209 | * Create a image and keep transparency for png and gifs. |
||
| 2210 | * |
||
| 2211 | * @param int $width of the new image. |
||
| 2212 | * @param int $height of the new image. |
||
| 2213 | * |
||
| 2214 | * @return image resource. |
||
| 2215 | 2 | */ |
|
| 2216 | private function createImageKeepTransparency($width, $height) |
||
| 2245 | |||
| 2246 | |||
| 2247 | |||
| 2248 | /** |
||
| 2249 | * Set optimizing and post-processing options. |
||
| 2250 | * |
||
| 2251 | * @param array $options with config for postprocessing with external tools. |
||
| 2252 | * |
||
| 2253 | * @return $this |
||
| 2254 | */ |
||
| 2255 | public function setPostProcessingOptions($options) |
||
| 2277 | |||
| 2278 | |||
| 2279 | |||
| 2280 | /** |
||
| 2281 | * Find out the type (file extension) for the image to be saved. |
||
| 2282 | * |
||
| 2283 | * @return string as image extension. |
||
| 2284 | 2 | */ |
|
| 2285 | protected function getTargetImageExtension() |
||
| 2294 | |||
| 2295 | |||
| 2296 | |||
| 2297 | /** |
||
| 2298 | * Save image. |
||
| 2299 | * |
||
| 2300 | * @param string $src as target filename. |
||
| 2301 | * @param string $base as base directory where to store images. |
||
| 2302 | * @param boolean $overwrite or not, default to always overwrite file. |
||
| 2303 | * |
||
| 2304 | * @return $this or false if no folder is set. |
||
| 2305 | 2 | */ |
|
| 2306 | public function save($src = null, $base = null, $overwrite = true) |
||
| 2398 | |||
| 2399 | |||
| 2400 | |||
| 2401 | /** |
||
| 2402 | * Convert image from one colorpsace/color profile to sRGB without |
||
| 2403 | * color profile. |
||
| 2404 | * |
||
| 2405 | * @param string $src of image. |
||
| 2406 | * @param string $dir as base directory where images are. |
||
| 2407 | * @param string $cache as base directory where to store images. |
||
| 2408 | * @param string $iccFile filename of colorprofile. |
||
| 2409 | * @param boolean $useCache or not, default to always use cache. |
||
| 2410 | * |
||
| 2411 | * @return string | boolean false if no conversion else the converted |
||
| 2412 | * filename. |
||
| 2413 | */ |
||
| 2414 | public function convert2sRGBColorSpace($src, $dir, $cache, $iccFile, $useCache = true) |
||
| 2466 | |||
| 2467 | |||
| 2468 | |||
| 2469 | /** |
||
| 2470 | * Create a hard link, as an alias, to the cached file. |
||
| 2471 | * |
||
| 2472 | * @param string $alias where to store the link, |
||
| 2473 | * filename without extension. |
||
| 2474 | * |
||
| 2475 | * @return $this |
||
| 2476 | */ |
||
| 2477 | public function linkToCacheFile($alias) |
||
| 2498 | |||
| 2499 | |||
| 2500 | |||
| 2501 | /** |
||
| 2502 | * Add HTTP header for putputting together with image. |
||
| 2503 | * |
||
| 2504 | * @param string $type the header type such as "Cache-Control" |
||
| 2505 | * @param string $value the value to use |
||
| 2506 | * |
||
| 2507 | * @return void |
||
| 2508 | */ |
||
| 2509 | public function addHTTPHeader($type, $value) |
||
| 2513 | |||
| 2514 | |||
| 2515 | |||
| 2516 | /** |
||
| 2517 | * Output image to browser using caching. |
||
| 2518 | * |
||
| 2519 | * @param string $file to read and output, default is to |
||
| 2520 | * use $this->cacheFileName |
||
| 2521 | * @param string $format set to json to output file as json |
||
| 2522 | * object with details |
||
| 2523 | * |
||
| 2524 | * @return void |
||
| 2525 | */ |
||
| 2526 | public function output($file = null, $format = null) |
||
| 2599 | |||
| 2600 | |||
| 2601 | |||
| 2602 | /** |
||
| 2603 | * Create a JSON object from the image details. |
||
| 2604 | * |
||
| 2605 | * @param string $file the file to output. |
||
| 2606 | * |
||
| 2607 | * @return string json-encoded representation of the image. |
||
| 2608 | */ |
||
| 2609 | public function json($file = null) |
||
| 2654 | |||
| 2655 | |||
| 2656 | |||
| 2657 | /** |
||
| 2658 | * Set options for creating ascii version of image. |
||
| 2659 | * |
||
| 2660 | * @param array $options empty to use default or set options to change. |
||
| 2661 | * |
||
| 2662 | * @return void. |
||
| 2663 | */ |
||
| 2664 | public function setAsciiOptions($options = array()) |
||
| 2668 | |||
| 2669 | |||
| 2670 | |||
| 2671 | /** |
||
| 2672 | * Create an ASCII version from the image details. |
||
| 2673 | * |
||
| 2674 | * @param string $file the file to output. |
||
| 2675 | * |
||
| 2676 | * @return string ASCII representation of the image. |
||
| 2677 | */ |
||
| 2678 | public function ascii($file = null) |
||
| 2686 | |||
| 2687 | |||
| 2688 | |||
| 2689 | /** |
||
| 2690 | * Log an event if verbose mode. |
||
| 2691 | * |
||
| 2692 | * @param string $message to log. |
||
| 2693 | * |
||
| 2694 | * @return this |
||
| 2695 | */ |
||
| 2696 | public function log($message) |
||
| 2704 | |||
| 2705 | |||
| 2706 | |||
| 2707 | /** |
||
| 2708 | * Do verbose output to a file. |
||
| 2709 | * |
||
| 2710 | * @param string $fileName where to write the verbose output. |
||
| 2711 | * |
||
| 2712 | * @return void |
||
| 2713 | */ |
||
| 2714 | public function setVerboseToFile($fileName) |
||
| 2719 | |||
| 2720 | |||
| 2721 | |||
| 2722 | /** |
||
| 2723 | * Do verbose output and print out the log and the actual images. |
||
| 2724 | * |
||
| 2725 | * @return void |
||
| 2726 | */ |
||
| 2727 | private function verboseOutput() |
||
| 2759 | |||
| 2760 | |||
| 2761 | |||
| 2762 | /** |
||
| 2763 | * Raise error, enables to implement a selection of error methods. |
||
| 2764 | * |
||
| 2765 | * @param string $message the error message to display. |
||
| 2766 | * |
||
| 2767 | * @return void |
||
| 2768 | * @throws Exception |
||
| 2769 | */ |
||
| 2770 | private function raiseError($message) |
||
| 2774 | } |
||
| 2775 |
You can fix this by adding a namespace to your class:
When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.