mirror of
https://github.com/pierre42100/comunic
synced 2025-06-21 09:35:19 +00:00
First commit
This commit is contained in:
58
developer/vendor/gregwar/image/Gregwar/Image/Adapter/Adapter.php
vendored
Normal file
58
developer/vendor/gregwar/image/Gregwar/Image/Adapter/Adapter.php
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Adapter;
|
||||
|
||||
use Gregwar\Image\Source\Source;
|
||||
|
||||
/**
|
||||
* Base Adapter Implementation to handle Image information
|
||||
*/
|
||||
abstract class Adapter implements AdapterInterface
|
||||
{
|
||||
/**
|
||||
* @var Source
|
||||
*/
|
||||
protected $source;
|
||||
|
||||
/**
|
||||
* The image resource handler
|
||||
*/
|
||||
protected $resource;
|
||||
|
||||
public function __construct(){
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function setSource(Source $source)
|
||||
{
|
||||
$this->source = $source;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function getResource()
|
||||
{
|
||||
return $this->resource;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does this adapter supports the given type ?
|
||||
*/
|
||||
protected function supports($type)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the image to true color
|
||||
*/
|
||||
protected function convertToTrueColor()
|
||||
{
|
||||
}
|
||||
}
|
388
developer/vendor/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php
vendored
Normal file
388
developer/vendor/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php
vendored
Normal file
@ -0,0 +1,388 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Adapter;
|
||||
|
||||
use Gregwar\Image\Image;
|
||||
use Gregwar\Image\Source\Source;
|
||||
|
||||
/**
|
||||
* all the functions / methods to work on images
|
||||
*
|
||||
* if changing anything please also add it to \Gregwar\Image\Image
|
||||
*
|
||||
* @author wodka <michael.schramm@gmail.com>
|
||||
*/
|
||||
interface AdapterInterface{
|
||||
/**
|
||||
* set the image source for the adapter
|
||||
*
|
||||
* @param Source $source
|
||||
* @return $this
|
||||
*/
|
||||
public function setSource(Source $source);
|
||||
|
||||
/**
|
||||
* get the raw resource
|
||||
*
|
||||
* @return resource
|
||||
*/
|
||||
public function getResource();
|
||||
|
||||
/**
|
||||
* Gets the name of the adapter
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName();
|
||||
|
||||
/**
|
||||
* Image width
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function width();
|
||||
|
||||
/**
|
||||
* Image height
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function height();
|
||||
|
||||
/**
|
||||
* Init the resource
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function init();
|
||||
|
||||
/**
|
||||
* Save the image as a gif
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function saveGif($file);
|
||||
|
||||
/**
|
||||
* Save the image as a png
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function savePng($file);
|
||||
|
||||
/**
|
||||
* Save the image as a jpeg
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function saveJpeg($file, $quality);
|
||||
|
||||
/**
|
||||
* Works as resize() excepts that the layout will be cropped
|
||||
*
|
||||
* @param int $width the width
|
||||
* @param int $height the height
|
||||
* @param int $background the background
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function cropResize($width = null, $height = null, $background=0xffffff);
|
||||
|
||||
|
||||
/**
|
||||
* Resize the image preserving scale. Can enlarge it.
|
||||
*
|
||||
* @param int $width the width
|
||||
* @param int $height the height
|
||||
* @param int $background the background
|
||||
* @param boolean $crop
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function scaleResize($width = null, $height = null, $background=0xffffff, $crop = false);
|
||||
|
||||
/**
|
||||
* Resizes the image. It will never be enlarged.
|
||||
*
|
||||
* @param int $width the width
|
||||
* @param int $height the height
|
||||
* @param int $background the background
|
||||
* @param boolean $force
|
||||
* @param boolean $rescale
|
||||
* @param boolean $crop
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function resize($width = null, $height = null, $background = 0xffffff, $force = false, $rescale = false, $crop = false);
|
||||
|
||||
/**
|
||||
* Crops the image
|
||||
*
|
||||
* @param int $x the top-left x position of the crop box
|
||||
* @param int $y the top-left y position of the crop box
|
||||
* @param int $width the width of the crop box
|
||||
* @param int $height the height of the crop box
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function crop($x, $y, $width, $height);
|
||||
|
||||
/**
|
||||
* enable progressive image loading
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function enableProgressive();
|
||||
|
||||
/**
|
||||
* Resizes the image forcing the destination to have exactly the
|
||||
* given width and the height
|
||||
*
|
||||
* @param int $width the width
|
||||
* @param int $height the height
|
||||
* @param int $background the background
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function forceResize($width = null, $height = null, $background = 0xffffff);
|
||||
|
||||
/**
|
||||
* Perform a zoom crop of the image to desired width and height
|
||||
*
|
||||
* @param integer $width Desired width
|
||||
* @param integer $height Desired height
|
||||
* @param int $background
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function zoomCrop($width, $height, $background = 0xffffff);
|
||||
|
||||
|
||||
/**
|
||||
* Fills the image background to $bg if the image is transparent
|
||||
*
|
||||
* @param int $background background color
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function fillBackground($background = 0xffffff);
|
||||
|
||||
|
||||
/**
|
||||
* Negates the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function negate();
|
||||
|
||||
/**
|
||||
* Changes the brightness of the image
|
||||
*
|
||||
* @param int $brightness the brightness
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function brightness($brightness);
|
||||
|
||||
/**
|
||||
* Contrasts the image
|
||||
*
|
||||
* @param int $contrast the contrast [-100, 100]
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function contrast($contrast);
|
||||
|
||||
/**
|
||||
* Apply a grayscale level effect on the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function grayscale();
|
||||
|
||||
/**
|
||||
* Emboss the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function emboss();
|
||||
|
||||
/**
|
||||
* Smooth the image
|
||||
*
|
||||
* @param int $p value between [-10,10]
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function smooth($p);
|
||||
|
||||
/**
|
||||
* Sharps the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function sharp();
|
||||
|
||||
/**
|
||||
* Edges the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function edge();
|
||||
|
||||
/**
|
||||
* Colorize the image
|
||||
*
|
||||
* @param int $red value in range [-255, 255]
|
||||
* @param int $green value in range [-255, 255]
|
||||
* @param int $blue value in range [-255, 255]
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function colorize($red, $green, $blue);
|
||||
|
||||
/**
|
||||
* apply sepia to the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function sepia();
|
||||
|
||||
/**
|
||||
* Merge with another image
|
||||
*
|
||||
* @param Image $other
|
||||
* @param int $x
|
||||
* @param int $y
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function merge(Image $other, $x = 0, $y = 0, $width = null, $height = null);
|
||||
|
||||
/**
|
||||
* Rotate the image
|
||||
*
|
||||
* @param float $angle
|
||||
* @param int $background
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function rotate($angle, $background = 0xffffff);
|
||||
|
||||
/**
|
||||
* Fills the image
|
||||
*
|
||||
* @param int $color
|
||||
* @param int $x
|
||||
* @param int $y
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function fill($color = 0xffffff, $x = 0, $y = 0);
|
||||
|
||||
/**
|
||||
* write text to the image
|
||||
*
|
||||
* @param string $font
|
||||
* @param string $text
|
||||
* @param int $x
|
||||
* @param int $y
|
||||
* @param int $size
|
||||
* @param int $angle
|
||||
* @param int $color
|
||||
* @param string $align
|
||||
*/
|
||||
public function write($font, $text, $x = 0, $y = 0, $size = 12, $angle = 0, $color = 0x000000, $align = 'left');
|
||||
|
||||
/**
|
||||
* Draws a rectangle
|
||||
*
|
||||
* @param int $x1
|
||||
* @param int $y1
|
||||
* @param int $x2
|
||||
* @param int $y2
|
||||
* @param int $color
|
||||
* @param bool $filled
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function rectangle($x1, $y1, $x2, $y2, $color, $filled = false);
|
||||
|
||||
/**
|
||||
* Draws a rounded rectangle
|
||||
*
|
||||
* @param int $x1
|
||||
* @param int $y1
|
||||
* @param int $x2
|
||||
* @param int $y2
|
||||
* @param int $radius
|
||||
* @param int $color
|
||||
* @param bool $filled
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled = false);
|
||||
|
||||
/**
|
||||
* Draws a line
|
||||
*
|
||||
* @param int $x1
|
||||
* @param int $y1
|
||||
* @param int $x2
|
||||
* @param int $y2
|
||||
* @param int $color
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function line($x1, $y1, $x2, $y2, $color = 0x000000);
|
||||
|
||||
/**
|
||||
* Draws an ellipse
|
||||
*
|
||||
* @param int $cx
|
||||
* @param int $cy
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
* @param int $color
|
||||
* @param bool $filled
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function ellipse($cx, $cy, $width, $height, $color = 0x000000, $filled = false);
|
||||
|
||||
/**
|
||||
* Draws a circle
|
||||
*
|
||||
* @param int $cx
|
||||
* @param int $cy
|
||||
* @param int $r
|
||||
* @param int $color
|
||||
* @param bool $filled
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function circle($cx, $cy, $r, $color = 0x000000, $filled = false);
|
||||
|
||||
/**
|
||||
* Draws a polygon
|
||||
*
|
||||
* @param array $points
|
||||
* @param int $color
|
||||
* @param bool $filled
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function polygon(array $points, $color, $filled = false);
|
||||
|
||||
/**
|
||||
* Flips the image
|
||||
*
|
||||
* @param int $flipVertical
|
||||
* @param int $flipHorizontal
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function flip($flipVertical, $flipHorizontal);
|
||||
}
|
351
developer/vendor/gregwar/image/Gregwar/Image/Adapter/Common.php
vendored
Normal file
351
developer/vendor/gregwar/image/Gregwar/Image/Adapter/Common.php
vendored
Normal file
@ -0,0 +1,351 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Adapter;
|
||||
|
||||
abstract class Common extends Adapter
|
||||
{
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function zoomCrop($width, $height, $background = 'transparent', $xPosLetter = 'center', $yPosLetter = 'center')
|
||||
{
|
||||
// Calculate the different ratios
|
||||
$originalRatio = $this->width() / $this->height();
|
||||
$newRatio = $width / $height;
|
||||
|
||||
// Compare ratios
|
||||
if ($originalRatio > $newRatio) {
|
||||
// Original image is wider
|
||||
$newHeight = $height;
|
||||
$newWidth = (int) $height * $originalRatio;
|
||||
} else {
|
||||
// Equal width or smaller
|
||||
$newHeight = (int) $width / $originalRatio;
|
||||
$newWidth = $width;
|
||||
}
|
||||
|
||||
// Perform resize
|
||||
$this->resize($newWidth, $newHeight, $background, true);
|
||||
|
||||
// Define x position
|
||||
switch($xPosLetter) {
|
||||
case 'L':
|
||||
case 'left':
|
||||
$xPos = 0;
|
||||
break;
|
||||
case 'R':
|
||||
case 'right':
|
||||
$xPos = (int) $newWidth - $width;
|
||||
break;
|
||||
default:
|
||||
$xPos = (int) ($newWidth - $width) / 2;
|
||||
}
|
||||
|
||||
// Define y position
|
||||
switch($yPosLetter) {
|
||||
case 'T':
|
||||
case 'top':
|
||||
$yPos = 0;
|
||||
break;
|
||||
case 'B':
|
||||
case 'bottom':
|
||||
$yPos = (int) $newHeight - $height;
|
||||
break;
|
||||
default:
|
||||
$yPos = (int) ($newHeight - $height) / 2;
|
||||
}
|
||||
|
||||
// Crop image to reach desired size
|
||||
$this->crop($xPos, $yPos, $width, $height);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resizes the image forcing the destination to have exactly the
|
||||
* given width and the height
|
||||
*
|
||||
* @param int $w the width
|
||||
* @param int $h the height
|
||||
* @param int $bg the background
|
||||
*/
|
||||
public function forceResize($width = null, $height = null, $background = 'transparent')
|
||||
{
|
||||
return $this->resize($width, $height, $background, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function scaleResize($width = null, $height = null, $background='transparent', $crop = false)
|
||||
{
|
||||
return $this->resize($width, $height, $background, false, true, $crop);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function cropResize($width = null, $height = null, $background='transparent')
|
||||
{
|
||||
return $this->resize($width, $height, $background, false, false, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fix orientation using Exif informations
|
||||
*/
|
||||
public function fixOrientation()
|
||||
{
|
||||
if (!extension_loaded('exif')) {
|
||||
throw new \RuntimeException('You need to EXIF PHP Extension to use this function');
|
||||
}
|
||||
|
||||
$exif = exif_read_data($this->source->getInfos());
|
||||
|
||||
if(!array_key_exists('Orientation', $exif)) {
|
||||
return $this;
|
||||
}
|
||||
|
||||
switch($exif['Orientation']) {
|
||||
case 1:
|
||||
break;
|
||||
|
||||
case 2:
|
||||
$this->flip(false, true);
|
||||
break;
|
||||
|
||||
case 3: // 180 rotate left
|
||||
$this->rotate(180);
|
||||
break;
|
||||
|
||||
case 4: // vertical flip
|
||||
$this->flip(true, false);
|
||||
break;
|
||||
|
||||
case 5: // vertical flip + 90 rotate right
|
||||
$this->flip(true, false);
|
||||
$this->rotate(-90);
|
||||
break;
|
||||
|
||||
case 6: // 90 rotate right
|
||||
$this->rotate(-90);
|
||||
break;
|
||||
|
||||
case 7: // horizontal flip + 90 rotate right
|
||||
$this->flip(false, true);
|
||||
$this->rotate(-90);
|
||||
break;
|
||||
|
||||
case 8: // 90 rotate left
|
||||
$this->rotate(90);
|
||||
break;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens the image
|
||||
*/
|
||||
abstract protected function openGif($file);
|
||||
abstract protected function openJpeg($file);
|
||||
abstract protected function openPng($file);
|
||||
|
||||
/**
|
||||
* Creates an image
|
||||
*/
|
||||
abstract protected function createImage($width, $height);
|
||||
|
||||
/**
|
||||
* Creating an image using $data
|
||||
*/
|
||||
abstract protected function createImageFromData($data);
|
||||
|
||||
/**
|
||||
* Loading image from $resource
|
||||
*/
|
||||
protected function loadResource($resource)
|
||||
{
|
||||
$this->resource = $resource;
|
||||
}
|
||||
|
||||
protected function loadFile($file, $type)
|
||||
{
|
||||
if (!$this->supports($type)) {
|
||||
throw new \RuntimeException('Type '.$type.' is not supported by GD');
|
||||
}
|
||||
|
||||
if ($type == 'jpeg') {
|
||||
$this->openJpeg($file);
|
||||
}
|
||||
|
||||
if ($type == 'gif') {
|
||||
$this->openGif($file);
|
||||
}
|
||||
|
||||
if ($type == 'png') {
|
||||
$this->openPng($file);
|
||||
}
|
||||
|
||||
if (false === $this->resource) {
|
||||
throw new \UnexpectedValueException('Unable to open file ('.$file.')');
|
||||
} else {
|
||||
$this->convertToTrueColor();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function init()
|
||||
{
|
||||
$source = $this->source;
|
||||
|
||||
if ($source instanceof \Gregwar\Image\Source\File) {
|
||||
$this->loadFile($source->getFile(), $source->guessType());
|
||||
} else if ($source instanceof \Gregwar\Image\Source\Create) {
|
||||
$this->createImage($source->getWidth(), $source->getHeight());
|
||||
} else if ($source instanceof \Gregwar\Image\Source\Data) {
|
||||
$this->createImageFromData($source->getData());
|
||||
} else if ($source instanceof \Gregwar\Image\Source\Resource) {
|
||||
$this->loadResource($source->getResource());
|
||||
} else {
|
||||
throw new \Exception('Unsupported image source type '.get_class($source));
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function resize($width = null, $height = null, $background = 'transparent', $force = false, $rescale = false, $crop = false)
|
||||
{
|
||||
$current_width = $this->width();
|
||||
$current_height = $this->height();
|
||||
$new_width = 0;
|
||||
$new_height = 0;
|
||||
$scale = 1.0;
|
||||
|
||||
if ($height === null && preg_match('#^(.+)%$#mUsi', $width, $matches)) {
|
||||
$width = round($current_width * ((float)$matches[1]/100.0));
|
||||
$height = round($current_height * ((float)$matches[1]/100.0));
|
||||
}
|
||||
|
||||
if (!$rescale && (!$force || $crop)) {
|
||||
if ($width!=null && $current_width>$width) {
|
||||
$scale = $current_width/$width;
|
||||
}
|
||||
|
||||
if ($height!=null && $current_height>$height) {
|
||||
if ($current_height/$height > $scale)
|
||||
$scale = $current_height/$height;
|
||||
}
|
||||
} else {
|
||||
if ($width!=null) {
|
||||
$scale = $current_width/$width;
|
||||
$new_width = $width;
|
||||
}
|
||||
|
||||
if ($height!=null) {
|
||||
if ($width!=null && $rescale) {
|
||||
$scale = max($scale,$current_height/$height);
|
||||
} else {
|
||||
$scale = $current_height/$height;
|
||||
}
|
||||
$new_height = $height;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$force || $width==null || $rescale) {
|
||||
$new_width = round($current_width/$scale);
|
||||
}
|
||||
|
||||
if (!$force || $height==null || $rescale) {
|
||||
$new_height = round($current_height/$scale);
|
||||
}
|
||||
|
||||
if ($width == null || $crop) {
|
||||
$width = $new_width;
|
||||
}
|
||||
|
||||
if ($height == null || $crop) {
|
||||
$height = $new_height;
|
||||
}
|
||||
|
||||
$this->doResize($background, $width, $height, $new_width, $new_height);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trim background color arround the image
|
||||
*
|
||||
* @param int $bg the background
|
||||
*/
|
||||
protected function _trimColor($background='transparent')
|
||||
{
|
||||
$width = $this->width();
|
||||
$height = $this->height();
|
||||
|
||||
$b_top = 0;
|
||||
$b_lft = 0;
|
||||
$b_btm = $height - 1;
|
||||
$b_rt = $width - 1;
|
||||
|
||||
//top
|
||||
for(; $b_top < $height; ++$b_top) {
|
||||
for($x = 0; $x < $width; ++$x) {
|
||||
if ($this->getColor($x, $b_top) != $background) {
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// bottom
|
||||
for(; $b_btm >= 0; --$b_btm) {
|
||||
for($x = 0; $x < $width; ++$x) {
|
||||
if ($this->getColor($x, $b_btm) != $background) {
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// left
|
||||
for(; $b_lft < $width; ++$b_lft) {
|
||||
for($y = $b_top; $y <= $b_btm; ++$y) {
|
||||
if ($this->getColor($b_lft, $y) != $background) {
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// right
|
||||
for(; $b_rt >= 0; --$b_rt) {
|
||||
for($y = $b_top; $y <= $b_btm; ++$y) {
|
||||
if ($this->getColor($b_rt, $y) != $background) {
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$b_btm++;
|
||||
$b_rt++;
|
||||
|
||||
$this->crop($b_lft, $b_top, $b_rt - $b_lft, $b_btm - $b_top);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resizes the image to an image having size of $target_width, $target_height, using
|
||||
* $new_width and $new_height and padding with $bg color
|
||||
*/
|
||||
abstract protected function doResize($bg, $target_width, $target_height, $new_width, $new_height);
|
||||
|
||||
/**
|
||||
* Gets the color of the $x, $y pixel
|
||||
*/
|
||||
abstract protected function getColor($x, $y);
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function enableProgressive(){
|
||||
throw new \Exception('The Adapter '.$this->getName().' does not support Progressive Image loading');
|
||||
}
|
||||
}
|
567
developer/vendor/gregwar/image/Gregwar/Image/Adapter/GD.php
vendored
Normal file
567
developer/vendor/gregwar/image/Gregwar/Image/Adapter/GD.php
vendored
Normal file
@ -0,0 +1,567 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Adapter;
|
||||
|
||||
use Gregwar\Image\ImageColor;
|
||||
use Gregwar\Image\Image;
|
||||
|
||||
class GD extends Common
|
||||
{
|
||||
public static $gdTypes = array(
|
||||
'jpeg' => \IMG_JPG,
|
||||
'gif' => \IMG_GIF,
|
||||
'png' => \IMG_PNG,
|
||||
);
|
||||
|
||||
protected function loadResource($resource)
|
||||
{
|
||||
parent::loadResource($resource);
|
||||
imagesavealpha($this->resource, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the width and the height for writing some text
|
||||
*/
|
||||
public static function TTFBox($font, $text, $size, $angle = 0)
|
||||
{
|
||||
$box = imagettfbbox($size, $angle, $font, $text);
|
||||
|
||||
return array(
|
||||
'width' => abs($box[2] - $box[0]),
|
||||
'height' => abs($box[3] - $box[5])
|
||||
);
|
||||
}
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
if (!(extension_loaded('gd') && function_exists('gd_info'))) {
|
||||
throw new \RuntimeException('You need to install GD PHP Extension to use this library');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'GD';
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function fillBackground($background = 0xffffff)
|
||||
{
|
||||
$w = $this->width();
|
||||
$h = $this->height();
|
||||
$n = imagecreatetruecolor($w, $h);
|
||||
imagefill($n, 0, 0, ImageColor::gdAllocate($this->resource, $background));
|
||||
imagecopyresampled($n, $this->resource, 0, 0, 0, 0, $w, $h, $w, $h);
|
||||
imagedestroy($this->resource);
|
||||
$this->resource = $n;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Do the image resize
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
protected function doResize($bg, $target_width, $target_height, $new_width, $new_height)
|
||||
{
|
||||
$width = $this->width();
|
||||
$height = $this->height();
|
||||
$n = imagecreatetruecolor($target_width, $target_height);
|
||||
|
||||
if ($bg != 'transparent') {
|
||||
imagefill($n, 0, 0, ImageColor::gdAllocate($this->resource, $bg));
|
||||
} else {
|
||||
imagealphablending($n, false);
|
||||
$color = ImageColor::gdAllocate($this->resource, 'transparent');
|
||||
|
||||
imagefill($n, 0, 0, $color);
|
||||
imagesavealpha($n, true);
|
||||
}
|
||||
|
||||
imagecopyresampled($n, $this->resource, ($target_width-$new_width)/2, ($target_height-$new_height)/2, 0, 0, $new_width, $new_height, $width, $height);
|
||||
imagedestroy($this->resource);
|
||||
|
||||
$this->resource = $n;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function crop($x, $y, $width, $height)
|
||||
{
|
||||
$destination = imagecreatetruecolor($width, $height);
|
||||
imagealphablending($destination, false);
|
||||
imagesavealpha($destination, true);
|
||||
imagecopy($destination, $this->resource, 0, 0, $x, $y, $this->width(), $this->height());
|
||||
imagedestroy($this->resource);
|
||||
$this->resource = $destination;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function negate()
|
||||
{
|
||||
imagefilter($this->resource, IMG_FILTER_NEGATE);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function brightness($brightness)
|
||||
{
|
||||
imagefilter($this->resource, IMG_FILTER_BRIGHTNESS, $brightness);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function contrast($contrast)
|
||||
{
|
||||
imagefilter($this->resource, IMG_FILTER_CONTRAST, $contrast);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function grayscale()
|
||||
{
|
||||
imagefilter($this->resource, IMG_FILTER_GRAYSCALE);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function emboss()
|
||||
{
|
||||
imagefilter($this->resource, IMG_FILTER_EMBOSS);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function smooth($p)
|
||||
{
|
||||
imagefilter($this->resource, IMG_FILTER_SMOOTH, $p);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function sharp()
|
||||
{
|
||||
imagefilter($this->resource, IMG_FILTER_MEAN_REMOVAL);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function edge()
|
||||
{
|
||||
imagefilter($this->resource, IMG_FILTER_EDGEDETECT);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function colorize($red, $green, $blue)
|
||||
{
|
||||
imagefilter($this->resource, IMG_FILTER_COLORIZE, $red, $green, $blue);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function sepia()
|
||||
{
|
||||
imagefilter($this->resource, IMG_FILTER_GRAYSCALE);
|
||||
imagefilter($this->resource, IMG_FILTER_COLORIZE, 100, 50, 0);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function merge(Image $other, $x = 0, $y = 0, $width = null, $height = null)
|
||||
{
|
||||
$other = clone $other;
|
||||
$other->init();
|
||||
$other->applyOperations();
|
||||
|
||||
imagealphablending($this->resource, true);
|
||||
|
||||
if (null == $width) {
|
||||
$width = $other->width();
|
||||
}
|
||||
|
||||
if (null == $height) {
|
||||
$height = $other->height();
|
||||
}
|
||||
|
||||
imagecopyresampled($this->resource, $other->getAdapter()->getResource(), $x, $y, 0, 0, $width, $height, $width, $height);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function rotate($angle, $background = 0xffffff)
|
||||
{
|
||||
$this->resource = imagerotate($this->resource, $angle, ImageColor::gdAllocate($this->resource, $background));
|
||||
imagealphablending($this->resource, true);
|
||||
imagesavealpha($this->resource, true);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function fill($color = 0xffffff, $x = 0, $y = 0)
|
||||
{
|
||||
imagealphablending($this->resource, false);
|
||||
imagefill($this->resource, $x, $y, ImageColor::gdAllocate($this->resource, $color));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function write($font, $text, $x = 0, $y = 0, $size = 12, $angle = 0, $color = 0x000000, $align = 'left')
|
||||
{
|
||||
imagealphablending($this->resource, true);
|
||||
|
||||
if ($align != 'left') {
|
||||
$sim_size = self::TTFBox($font, $text, $size, $angle);
|
||||
|
||||
if ($align == 'center') {
|
||||
$x -= $sim_size['width'] / 2;
|
||||
}
|
||||
|
||||
if ($align == 'right') {
|
||||
$x -= $sim_size['width'];
|
||||
}
|
||||
}
|
||||
|
||||
imagettftext($this->resource, $size, $angle, $x, $y, ImageColor::gdAllocate($this->resource, $color), $font, $text);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function rectangle($x1, $y1, $x2, $y2, $color, $filled = false)
|
||||
{
|
||||
if ($filled) {
|
||||
imagefilledrectangle($this->resource, $x1, $y1, $x2, $y2, ImageColor::gdAllocate($this->resource, $color));
|
||||
} else {
|
||||
imagerectangle($this->resource, $x1, $y1, $x2, $y2, ImageColor::gdAllocate($this->resource, $color));
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled = false) {
|
||||
if ($color) {
|
||||
$color = ImageColor::gdAllocate($this->resource, $color);
|
||||
}
|
||||
|
||||
if ($filled == true) {
|
||||
imagefilledrectangle($this->resource, $x1+$radius, $y1, $x2-$radius, $y2, $color);
|
||||
imagefilledrectangle($this->resource, $x1, $y1+$radius, $x1+$radius-1, $y2-$radius, $color);
|
||||
imagefilledrectangle($this->resource, $x2-$radius+1, $y1+$radius, $x2, $y2-$radius, $color);
|
||||
|
||||
imagefilledarc($this->resource,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $color, IMG_ARC_PIE);
|
||||
imagefilledarc($this->resource,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $color, IMG_ARC_PIE);
|
||||
imagefilledarc($this->resource,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $color, IMG_ARC_PIE);
|
||||
imagefilledarc($this->resource,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $color, IMG_ARC_PIE);
|
||||
} else {
|
||||
imageline($this->resource, $x1+$radius, $y1, $x2-$radius, $y1, $color);
|
||||
imageline($this->resource, $x1+$radius, $y2, $x2-$radius, $y2, $color);
|
||||
imageline($this->resource, $x1, $y1+$radius, $x1, $y2-$radius, $color);
|
||||
imageline($this->resource, $x2, $y1+$radius, $x2, $y2-$radius, $color);
|
||||
|
||||
imagearc($this->resource,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $color);
|
||||
imagearc($this->resource,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $color);
|
||||
imagearc($this->resource,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $color);
|
||||
imagearc($this->resource,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $color);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function line($x1, $y1, $x2, $y2, $color = 0x000000)
|
||||
{
|
||||
imageline($this->resource, $x1, $y1, $x2, $y2, ImageColor::gdAllocate($this->resource, $color));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function ellipse($cx, $cy, $width, $height, $color = 0x000000, $filled = false)
|
||||
{
|
||||
if ($filled) {
|
||||
imagefilledellipse($this->resource, $cx, $cy, $width, $height, ImageColor::gdAllocate($this->resource, $color));
|
||||
} else {
|
||||
imageellipse($this->resource, $cx, $cy, $width, $height, ImageColor::gdAllocate($this->resource, $color));
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function circle($cx, $cy, $r, $color = 0x000000, $filled = false)
|
||||
{
|
||||
return $this->ellipse($cx, $cy, $r, $r, ImageColor::gdAllocate($this->resource, $color), $filled);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function polygon(array $points, $color, $filled = false)
|
||||
{
|
||||
if ($filled) {
|
||||
imagefilledpolygon($this->resource, $points, count($points)/2, ImageColor::gdAllocate($this->resource, $color));
|
||||
} else {
|
||||
imagepolygon($this->resource, $points, count($points)/2, ImageColor::gdAllocate($this->resource, $color));
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function flip($flipVertical, $flipHorizontal) {
|
||||
|
||||
if (!$flipVertical && !$flipHorizontal) {
|
||||
return $this;
|
||||
}
|
||||
|
||||
if (function_exists('imageflip')) {
|
||||
if ($flipVertical && $flipHorizontal) {
|
||||
$flipMode = \IMG_FLIP_BOTH;
|
||||
} else if ($flipVertical && !$flipHorizontal) {
|
||||
$flipMode = \IMG_FLIP_VERTICAL;
|
||||
} else if (!$flipVertical && $flipHorizontal) {
|
||||
$flipMode = \IMG_FLIP_HORIZONTAL;
|
||||
}
|
||||
|
||||
imageflip($this->resource, $flipMode);
|
||||
} else {
|
||||
$width = $this->width();
|
||||
$height = $this->height();
|
||||
|
||||
$src_x = 0;
|
||||
$src_y = 0;
|
||||
$src_width = $width;
|
||||
$src_height = $height;
|
||||
|
||||
if ($flipVertical) {
|
||||
$src_y = $height -1;
|
||||
$src_height = -$height;
|
||||
}
|
||||
|
||||
if ($flipHorizontal) {
|
||||
$src_x = $width -1;
|
||||
$src_width = -$width;
|
||||
}
|
||||
|
||||
$imgdest = imagecreatetruecolor ($width, $height);
|
||||
imagealphablending($imgdest, false);
|
||||
imagesavealpha($imgdest, true);
|
||||
|
||||
if (imagecopyresampled($imgdest, $this->resource, 0, 0, $src_x, $src_y , $width, $height, $src_width, $src_height)) {
|
||||
imagedestroy($this->resource);
|
||||
$this->resource = $imgdest;
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function width()
|
||||
{
|
||||
if (null === $this->resource) {
|
||||
$this->init();
|
||||
}
|
||||
|
||||
return imagesx($this->resource);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function height()
|
||||
{
|
||||
if (null === $this->resource) {
|
||||
$this->init();
|
||||
}
|
||||
|
||||
return imagesy($this->resource);
|
||||
}
|
||||
|
||||
protected function createImage($width, $height)
|
||||
{
|
||||
$this->resource = imagecreatetruecolor($width, $height);
|
||||
}
|
||||
|
||||
protected function createImageFromData($data)
|
||||
{
|
||||
$this->resource = @imagecreatefromstring($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the image to true color
|
||||
*/
|
||||
protected function convertToTrueColor()
|
||||
{
|
||||
if (!imageistruecolor($this->resource)) {
|
||||
if (function_exists('imagepalettetotruecolor')) {
|
||||
// Available in PHP 5.5
|
||||
imagepalettetotruecolor($this->resource);
|
||||
} else {
|
||||
$transparentIndex = imagecolortransparent($this->resource);
|
||||
|
||||
$w = $this->width();
|
||||
$h = $this->height();
|
||||
|
||||
$img = imagecreatetruecolor($w, $h);
|
||||
imagecopy($img, $this->resource, 0, 0, 0, 0, $w, $h);
|
||||
|
||||
if ($transparentIndex != -1) {
|
||||
$width = $this->width();
|
||||
$height = $this->height();
|
||||
|
||||
imagealphablending($img, false);
|
||||
imagesavealpha($img, true);
|
||||
|
||||
for ($x=0; $x<$width; $x++) {
|
||||
for ($y=0; $y<$height; $y++) {
|
||||
if (imagecolorat($this->resource, $x, $y) == $transparentIndex) {
|
||||
imagesetpixel($img, $x, $y, 127 << 24);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->resource = $img;
|
||||
}
|
||||
}
|
||||
|
||||
imagesavealpha($this->resource, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function saveGif($file)
|
||||
{
|
||||
$transColor = imagecolorallocatealpha($this->resource, 255, 255, 255, 127);
|
||||
imagecolortransparent($this->resource, $transColor);
|
||||
imagegif($this->resource, $file);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function savePng($file)
|
||||
{
|
||||
imagepng($this->resource, $file);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function saveJpeg($file, $quality)
|
||||
{
|
||||
imagejpeg($this->resource, $file, $quality);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to open the file using jpeg
|
||||
*
|
||||
*/
|
||||
protected function openJpeg($file)
|
||||
{
|
||||
$this->resource = @imagecreatefromjpeg($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to open the file using gif
|
||||
*/
|
||||
protected function openGif($file)
|
||||
{
|
||||
$this->resource = @imagecreatefromgif($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to open the file using PNG
|
||||
*/
|
||||
protected function openPng($file)
|
||||
{
|
||||
$this->resource = @imagecreatefrompng($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Does this adapter supports type ?
|
||||
*/
|
||||
protected function supports($type)
|
||||
{
|
||||
return (imagetypes() & self::$gdTypes[$type]);
|
||||
}
|
||||
|
||||
protected function getColor($x, $y)
|
||||
{
|
||||
return imagecolorat($this->resource, $x, $y);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function enableProgressive(){
|
||||
imageinterlace($this->resource, 1);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
389
developer/vendor/gregwar/image/Gregwar/Image/Adapter/Imagick.php
vendored
Normal file
389
developer/vendor/gregwar/image/Gregwar/Image/Adapter/Imagick.php
vendored
Normal file
@ -0,0 +1,389 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Adapter;
|
||||
|
||||
use Gregwar\Image\Image;
|
||||
|
||||
class Imagick extends Common{
|
||||
public function __construct(){
|
||||
throw new \Exception('Imagick is not supported right now');
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the name of the adapter
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName(){
|
||||
return 'ImageMagick';
|
||||
}
|
||||
|
||||
/**
|
||||
* Image width
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function width(){
|
||||
// TODO: Implement width() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Image height
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function height(){
|
||||
// TODO: Implement height() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the image as a gif
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function saveGif($file){
|
||||
// TODO: Implement saveGif() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the image as a png
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function savePng($file){
|
||||
// TODO: Implement savePng() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the image as a jpeg
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function saveJpeg($file, $quality){
|
||||
// TODO: Implement saveJpeg() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Crops the image
|
||||
*
|
||||
* @param int $x the top-left x position of the crop box
|
||||
* @param int $y the top-left y position of the crop box
|
||||
* @param int $width the width of the crop box
|
||||
* @param int $height the height of the crop box
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function crop($x, $y, $width, $height){
|
||||
// TODO: Implement crop() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills the image background to $bg if the image is transparent
|
||||
*
|
||||
* @param int $background background color
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function fillBackground($background = 0xffffff){
|
||||
// TODO: Implement fillBackground() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Negates the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function negate(){
|
||||
// TODO: Implement negate() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the brightness of the image
|
||||
*
|
||||
* @param int $brightness the brightness
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function brightness($brightness){
|
||||
// TODO: Implement brightness() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Contrasts the image
|
||||
*
|
||||
* @param int $contrast the contrast [-100, 100]
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function contrast($contrast){
|
||||
// TODO: Implement contrast() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply a grayscale level effect on the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function grayscale(){
|
||||
// TODO: Implement grayscale() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Emboss the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function emboss(){
|
||||
// TODO: Implement emboss() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Smooth the image
|
||||
*
|
||||
* @param int $p value between [-10,10]
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function smooth($p){
|
||||
// TODO: Implement smooth() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Sharps the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function sharp(){
|
||||
// TODO: Implement sharp() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Edges the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function edge(){
|
||||
// TODO: Implement edge() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Colorize the image
|
||||
*
|
||||
* @param int $red value in range [-255, 255]
|
||||
* @param int $green value in range [-255, 255]
|
||||
* @param int $blue value in range [-255, 255]
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function colorize($red, $green, $blue){
|
||||
// TODO: Implement colorize() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* apply sepia to the image
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function sepia(){
|
||||
// TODO: Implement sepia() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge with another image
|
||||
*
|
||||
* @param Image $other
|
||||
* @param int $x
|
||||
* @param int $y
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function merge(Image $other, $x = 0, $y = 0, $width = null, $height = null){
|
||||
// TODO: Implement merge() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Rotate the image
|
||||
*
|
||||
* @param float $angle
|
||||
* @param int $background
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function rotate($angle, $background = 0xffffff){
|
||||
// TODO: Implement rotate() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills the image
|
||||
*
|
||||
* @param int $color
|
||||
* @param int $x
|
||||
* @param int $y
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function fill($color = 0xffffff, $x = 0, $y = 0){
|
||||
// TODO: Implement fill() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* write text to the image
|
||||
*
|
||||
* @param string $font
|
||||
* @param string $text
|
||||
* @param int $x
|
||||
* @param int $y
|
||||
* @param int $size
|
||||
* @param int $angle
|
||||
* @param int $color
|
||||
* @param string $align
|
||||
*/
|
||||
public function write($font, $text, $x = 0, $y = 0, $size = 12, $angle = 0, $color = 0x000000, $align = 'left'){
|
||||
// TODO: Implement write() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a rectangle
|
||||
*
|
||||
* @param int $x1
|
||||
* @param int $y1
|
||||
* @param int $x2
|
||||
* @param int $y2
|
||||
* @param int $color
|
||||
* @param bool $filled
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function rectangle($x1, $y1, $x2, $y2, $color, $filled = false){
|
||||
// TODO: Implement rectangle() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a rounded rectangle
|
||||
*
|
||||
* @param int $x1
|
||||
* @param int $y1
|
||||
* @param int $x2
|
||||
* @param int $y2
|
||||
* @param int $radius
|
||||
* @param int $color
|
||||
* @param bool $filled
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled = false){
|
||||
// TODO: Implement roundedRectangle() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a line
|
||||
*
|
||||
* @param int $x1
|
||||
* @param int $y1
|
||||
* @param int $x2
|
||||
* @param int $y2
|
||||
* @param int $color
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function line($x1, $y1, $x2, $y2, $color = 0x000000){
|
||||
// TODO: Implement line() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws an ellipse
|
||||
*
|
||||
* @param int $cx
|
||||
* @param int $cy
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
* @param int $color
|
||||
* @param bool $filled
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function ellipse($cx, $cy, $width, $height, $color = 0x000000, $filled = false){
|
||||
// TODO: Implement ellipse() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a circle
|
||||
*
|
||||
* @param int $cx
|
||||
* @param int $cy
|
||||
* @param int $r
|
||||
* @param int $color
|
||||
* @param bool $filled
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function circle($cx, $cy, $r, $color = 0x000000, $filled = false){
|
||||
// TODO: Implement circle() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a polygon
|
||||
*
|
||||
* @param array $points
|
||||
* @param int $color
|
||||
* @param bool $filled
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function polygon(array $points, $color, $filled = false){
|
||||
// TODO: Implement polygon() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function flip($flipVertical, $flipHorizontal) {
|
||||
// TODO: Implement flip method
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens the image
|
||||
*/
|
||||
protected function openGif($file){
|
||||
// TODO: Implement openGif() method.
|
||||
}
|
||||
|
||||
protected function openJpeg($file){
|
||||
// TODO: Implement openJpeg() method.
|
||||
}
|
||||
|
||||
protected function openPng($file){
|
||||
// TODO: Implement openPng() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an image
|
||||
*/
|
||||
protected function createImage($width, $height){
|
||||
// TODO: Implement createImage() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Creating an image using $data
|
||||
*/
|
||||
protected function createImageFromData($data){
|
||||
// TODO: Implement createImageFromData() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Resizes the image to an image having size of $target_width, $target_height, using
|
||||
* $new_width and $new_height and padding with $bg color
|
||||
*/
|
||||
protected function doResize($bg, $target_width, $target_height, $new_width, $new_height){
|
||||
// TODO: Implement doResize() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the color of the $x, $y pixel
|
||||
*/
|
||||
protected function getColor($x, $y){
|
||||
// TODO: Implement getColor() method.
|
||||
}
|
||||
}
|
16
developer/vendor/gregwar/image/Gregwar/Image/Exceptions/GenerationError.php
vendored
Normal file
16
developer/vendor/gregwar/image/Gregwar/Image/Exceptions/GenerationError.php
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Exceptions;
|
||||
|
||||
class GenerationError extends \Exception
|
||||
{
|
||||
public function __construct($newNewFile)
|
||||
{
|
||||
$this->newNewFile = $newNewFile;
|
||||
}
|
||||
|
||||
public function getNewFile()
|
||||
{
|
||||
return $this->newNewFile;
|
||||
}
|
||||
}
|
83
developer/vendor/gregwar/image/Gregwar/Image/GarbageCollect.php
vendored
Normal file
83
developer/vendor/gregwar/image/Gregwar/Image/GarbageCollect.php
vendored
Normal file
@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image;
|
||||
|
||||
/**
|
||||
* Garbage collect a directory, this will crawl a directory, lookng
|
||||
* for files older than X days and destroy them
|
||||
*
|
||||
* @author Gregwar <g.passault@gmail.com>
|
||||
*/
|
||||
class GarbageCollect
|
||||
{
|
||||
/**
|
||||
* Drops old files of a directory
|
||||
*
|
||||
* @param string $directory the name of the target directory
|
||||
* @param int $days the number of days to consider a file old
|
||||
* @param bool $verbose enable verbose output
|
||||
*
|
||||
* @return true if all the files/directories of a directory was wiped
|
||||
*/
|
||||
public static function dropOldFiles($directory, $days = 30, $verbose = false)
|
||||
{
|
||||
$allDropped = true;
|
||||
$now = time();
|
||||
|
||||
$dir = opendir($directory);
|
||||
|
||||
if (!$dir) {
|
||||
if ($verbose) {
|
||||
echo "! Unable to open $directory\n";
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
while ($file = readdir($dir)) {
|
||||
if ($file == '.' || $file == '..') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$fullName = $directory.'/'.$file;
|
||||
|
||||
$old = $now-filemtime($fullName);
|
||||
|
||||
if (is_dir($fullName)) {
|
||||
// Directories are recursively crawled
|
||||
if (static::dropOldFiles($fullName, $days, $verbose)) {
|
||||
self::drop($fullName, $verbose);
|
||||
} else {
|
||||
$allDropped = false;
|
||||
}
|
||||
} else {
|
||||
if ($old > (24*60*60*$days)) {
|
||||
self::drop($fullName, $verbose);
|
||||
} else {
|
||||
$allDropped = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
closedir($dir);
|
||||
|
||||
return $allDropped;
|
||||
}
|
||||
|
||||
/**
|
||||
* Drops a file or an empty directory
|
||||
*/
|
||||
public static function drop($file, $verbose = false)
|
||||
{
|
||||
if (is_dir($file)) {
|
||||
@rmdir($file);
|
||||
} else {
|
||||
@unlink($file);
|
||||
}
|
||||
|
||||
if ($verbose) {
|
||||
echo "> Dropping $file...\n";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
752
developer/vendor/gregwar/image/Gregwar/Image/Image.php
vendored
Normal file
752
developer/vendor/gregwar/image/Gregwar/Image/Image.php
vendored
Normal file
@ -0,0 +1,752 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image;
|
||||
|
||||
use Gregwar\Image\Adapter\AdapterInterface;
|
||||
use Gregwar\Image\Exceptions\GenerationError;
|
||||
|
||||
/**
|
||||
* Images handling class
|
||||
*
|
||||
* @author Gregwar <g.passault@gmail.com>
|
||||
*
|
||||
* @method Image saveGif($file)
|
||||
* @method Image savePng($file)
|
||||
* @method Image saveJpeg($file, $quality)
|
||||
* @method Image cropResize($width = null, $height = null, $background=0xffffff)
|
||||
* @method Image scale($width = null, $height = null, $background=0xffffff, $crop = false)
|
||||
* @method Image ($width = null, $height = null, $background = 0xffffff, $force = false, $rescale = false, $crop = false)
|
||||
* @method Image crop($x, $y, $width, $height)
|
||||
* @method Image enableProgressive()
|
||||
* @method Image force($width = null, $height = null, $background = 0xffffff)
|
||||
* @method Image zoomCrop($width, $height, $background = 0xffffff)
|
||||
* @method Image fillBackground($background = 0xffffff)
|
||||
* @method Image negate()
|
||||
* @method Image brightness($brightness)
|
||||
* @method Image contrast($contrast)
|
||||
* @method Image grayscale()
|
||||
* @method Image emboss()
|
||||
* @method Image smooth($p)
|
||||
* @method Image sharp()
|
||||
* @method Image edge()
|
||||
* @method Image colorize($red, $green, $blue)
|
||||
* @method Image sepia()
|
||||
* @method Image merge(Image $other, $x = 0, $y = 0, $width = null, $height = null)
|
||||
* @method Image rotate($angle, $background = 0xffffff)
|
||||
* @method Image fill($color = 0xffffff, $x = 0, $y = 0)
|
||||
* @method Image write($font, $text, $x = 0, $y = 0, $size = 12, $angle = 0, $color = 0x000000, $align = 'left')
|
||||
* @method Image rectangle($x1, $y1, $x2, $y2, $color, $filled = false)
|
||||
* @method Image roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled = false)
|
||||
* @method Image line($x1, $y1, $x2, $y2, $color = 0x000000)
|
||||
* @method Image ellipse($cx, $cy, $width, $height, $color = 0x000000, $filled = false)
|
||||
* @method Image circle($cx, $cy, $r, $color = 0x000000, $filled = false)
|
||||
* @method Image polygon(array $points, $color, $filled = false)
|
||||
* @method Image flip($flipVertical, $flipHorizontal)
|
||||
*/
|
||||
class Image
|
||||
{
|
||||
/**
|
||||
* Directory to use for file caching
|
||||
*/
|
||||
protected $cacheDir = 'cache/images';
|
||||
|
||||
/**
|
||||
* Directory cache mode
|
||||
*/
|
||||
protected $cacheMode = null;
|
||||
|
||||
/**
|
||||
* Internal adapter
|
||||
*
|
||||
* @var AdapterInterface
|
||||
*/
|
||||
protected $adapter = null;
|
||||
|
||||
/**
|
||||
* Pretty name for the image
|
||||
*/
|
||||
protected $prettyName = '';
|
||||
protected $prettyPrefix;
|
||||
|
||||
/**
|
||||
* Transformations hash
|
||||
*/
|
||||
protected $hash = null;
|
||||
|
||||
/**
|
||||
* The image source
|
||||
*/
|
||||
protected $source = null;
|
||||
|
||||
/**
|
||||
* Force image caching, even if there is no operation applied
|
||||
*/
|
||||
protected $forceCache = true;
|
||||
|
||||
/**
|
||||
* Supported types
|
||||
*/
|
||||
public static $types = array(
|
||||
'jpg' => 'jpeg',
|
||||
'jpeg' => 'jpeg',
|
||||
'png' => 'png',
|
||||
'gif' => 'gif',
|
||||
);
|
||||
|
||||
/**
|
||||
* Fallback image
|
||||
*/
|
||||
protected $fallback;
|
||||
|
||||
/**
|
||||
* Use fallback image
|
||||
*/
|
||||
protected $useFallbackImage = true;
|
||||
|
||||
/**
|
||||
* Cache system
|
||||
*/
|
||||
protected $cache;
|
||||
|
||||
/**
|
||||
* Change the caching directory
|
||||
*/
|
||||
public function setCacheDir($cacheDir)
|
||||
{
|
||||
$this->cache->setCacheDirectory($cacheDir);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $dirMode
|
||||
*/
|
||||
public function setCacheDirMode($dirMode)
|
||||
{
|
||||
$this->cache->setDirectoryMode($dirMode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable or disable to force cache even if the file is unchanged
|
||||
*/
|
||||
public function setForceCache($forceCache = true)
|
||||
{
|
||||
$this->forceCache = $forceCache;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* The actual cache dir
|
||||
*/
|
||||
public function setActualCacheDir($actualCacheDir)
|
||||
{
|
||||
$this->cache->setActualCacheDirectory($actualCacheDir);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the pretty name of the image
|
||||
*/
|
||||
public function setPrettyName($name, $prefix = true)
|
||||
{
|
||||
if (empty($name)) {
|
||||
return $this;
|
||||
}
|
||||
|
||||
$this->prettyName = $this->urlize($name);
|
||||
$this->prettyPrefix = $prefix;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Urlizes the prettyName
|
||||
*/
|
||||
protected function urlize($name)
|
||||
{
|
||||
$transliterator = '\Behat\Transliterator\Transliterator';
|
||||
|
||||
if (class_exists($transliterator)) {
|
||||
$name = $transliterator::transliterate($name);
|
||||
$name = $transliterator::urlize($name);
|
||||
} else {
|
||||
$name = strtolower($name);
|
||||
$name = str_replace(' ', '-', $name);
|
||||
$name = preg_replace('/([^a-z0-9\-]+)/m', '', $name);
|
||||
}
|
||||
|
||||
return $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Operations array
|
||||
*/
|
||||
protected $operations = array();
|
||||
|
||||
public function __construct($originalFile = null, $width = null, $height = null)
|
||||
{
|
||||
$this->cache = new \Gregwar\Cache\Cache;
|
||||
$this->cache->setCacheDirectory($this->cacheDir);
|
||||
|
||||
$this->setFallback(null);
|
||||
|
||||
if ($originalFile) {
|
||||
$this->source = new Source\File($originalFile);
|
||||
} else {
|
||||
$this->source = new Source\Create($width, $height);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the image data
|
||||
*/
|
||||
public function setData($data)
|
||||
{
|
||||
$this->source = new Source\Data($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the resource
|
||||
*/
|
||||
public function setResource($resource)
|
||||
{
|
||||
$this->source = new Source\Resource($resource);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use the fallback image or not
|
||||
*/
|
||||
public function useFallback($useFallbackImage = true)
|
||||
{
|
||||
$this->useFallbackImage = $useFallbackImage;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the fallback image to use
|
||||
*/
|
||||
public function setFallback($fallback = null)
|
||||
{
|
||||
if ($fallback === null) {
|
||||
$this->fallback = __DIR__ . '/images/error.jpg';
|
||||
} else {
|
||||
$this->fallback = $fallback;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the fallack image path
|
||||
*/
|
||||
public function getFallback()
|
||||
{
|
||||
return $this->fallback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the fallback into the cache dir
|
||||
*/
|
||||
public function getCacheFallback()
|
||||
{
|
||||
$fallback = $this->fallback;
|
||||
|
||||
return $this->cache->getOrCreateFile('fallback.jpg', array(), function($target) use ($fallback) {
|
||||
copy($fallback, $target);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AdapterInterface
|
||||
*/
|
||||
public function getAdapter()
|
||||
{
|
||||
if (null === $this->adapter) {
|
||||
// Defaults to GD
|
||||
$this->setAdapter('gd');
|
||||
}
|
||||
|
||||
return $this->adapter;
|
||||
}
|
||||
|
||||
public function setAdapter($adapter)
|
||||
{
|
||||
if ($adapter instanceof Adapter\Adapter) {
|
||||
$this->adapter = $adapter;
|
||||
} else {
|
||||
if (is_string($adapter)) {
|
||||
$adapter = strtolower($adapter);
|
||||
|
||||
switch ($adapter) {
|
||||
case 'gd':
|
||||
$this->adapter = new Adapter\GD();
|
||||
break;
|
||||
case 'imagemagick':
|
||||
case 'imagick':
|
||||
$this->adapter = new Adapter\Imagick();
|
||||
break;
|
||||
default:
|
||||
throw new \Exception('Unknown adapter: '.$adapter);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
throw new \Exception('Unable to load the given adapter (not string or Adapter)');
|
||||
}
|
||||
}
|
||||
|
||||
$this->adapter->setSource($this->source);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the file path
|
||||
*
|
||||
* @return mixed a string with the filen name, null if the image
|
||||
* does not depends on a file
|
||||
*/
|
||||
public function getFilePath()
|
||||
{
|
||||
if ($this->source instanceof Source\File) {
|
||||
return $this->source->getFile();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines the file only after instantiation
|
||||
*
|
||||
* @param string $originalFile the file path
|
||||
*/
|
||||
public function fromFile($originalFile)
|
||||
{
|
||||
$this->source = new Source\File($originalFile);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells if the image is correct
|
||||
*/
|
||||
public function correct()
|
||||
{
|
||||
return $this->source->correct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Guess the file type
|
||||
*/
|
||||
public function guessType()
|
||||
{
|
||||
return $this->source->guessType();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an operation
|
||||
*/
|
||||
protected function addOperation($method, $args)
|
||||
{
|
||||
$this->operations[] = array($method, $args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic function
|
||||
*/
|
||||
public function __call($methodName, $args)
|
||||
{
|
||||
$adapter = $this->getAdapter();
|
||||
$reflection = new \ReflectionClass(get_class($adapter));
|
||||
|
||||
if ($reflection->hasMethod($methodName)) {
|
||||
$method = $reflection->getMethod($methodName);
|
||||
|
||||
if ($method->getNumberOfRequiredParameters() > count($args)) {
|
||||
throw new \InvalidArgumentException('Not enough arguments given for '.$methodName);
|
||||
}
|
||||
|
||||
$this->addOperation($methodName, $args);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
throw new \BadFunctionCallException('Invalid method: '.$methodName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialization of operations
|
||||
*/
|
||||
public function serializeOperations()
|
||||
{
|
||||
$datas = array();
|
||||
|
||||
foreach ($this->operations as $operation) {
|
||||
$method = $operation[0];
|
||||
$args = $operation[1];
|
||||
|
||||
foreach ($args as &$arg) {
|
||||
if ($arg instanceof self) {
|
||||
$arg = $arg->getHash();
|
||||
}
|
||||
}
|
||||
|
||||
$datas[] = array($method, $args);
|
||||
}
|
||||
|
||||
return serialize($datas);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the hash
|
||||
*/
|
||||
public function generateHash($type = 'guess', $quality = 80)
|
||||
{
|
||||
$inputInfos = $this->source->getInfos();
|
||||
|
||||
$datas = array(
|
||||
$inputInfos,
|
||||
$this->serializeOperations(),
|
||||
$type,
|
||||
$quality
|
||||
);
|
||||
|
||||
$this->hash = sha1(serialize($datas));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the hash
|
||||
*/
|
||||
public function getHash($type = 'guess', $quality = 80)
|
||||
{
|
||||
if (null === $this->hash) {
|
||||
$this->generateHash($type, $quality);
|
||||
}
|
||||
|
||||
return $this->hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the cache file name and generate it if it does not exists.
|
||||
* Note that if it exists, all the image computation process will
|
||||
* not be done.
|
||||
*
|
||||
* @param string $type the image type
|
||||
* @param int $quality the quality (for JPEG)
|
||||
*/
|
||||
public function cacheFile($type = 'jpg', $quality = 80, $actual = false)
|
||||
{
|
||||
if ($type == 'guess') {
|
||||
$type = $this->guessType();
|
||||
}
|
||||
|
||||
if (!count($this->operations) && $type == $this->guessType() && !$this->forceCache) {
|
||||
return $this->getFilename($this->getFilePath());
|
||||
}
|
||||
|
||||
// Computes the hash
|
||||
$this->hash = $this->getHash($type, $quality);
|
||||
|
||||
// Generates the cache file
|
||||
$cacheFile = '';
|
||||
|
||||
if (!$this->prettyName || $this->prettyPrefix) {
|
||||
$cacheFile .= $this->hash;
|
||||
}
|
||||
|
||||
if ($this->prettyPrefix) {
|
||||
$cacheFile .= '-';
|
||||
}
|
||||
|
||||
if ($this->prettyName) {
|
||||
$cacheFile .= $this->prettyName;
|
||||
}
|
||||
|
||||
$cacheFile .= '.'.$type;
|
||||
|
||||
// If the files does not exists, save it
|
||||
$image = $this;
|
||||
|
||||
// Target file should be younger than all the current image
|
||||
// dependencies
|
||||
$conditions = array(
|
||||
'younger-than' => $this->getDependencies()
|
||||
);
|
||||
|
||||
// The generating function
|
||||
$generate = function($target) use ($image, $type, $quality) {
|
||||
$result = $image->save($target, $type, $quality);
|
||||
|
||||
if ($result != $target) {
|
||||
throw new GenerationError($result);
|
||||
}
|
||||
};
|
||||
|
||||
// Asking the cache for the cacheFile
|
||||
try {
|
||||
$file = $this->cache->getOrCreateFile($cacheFile, $conditions, $generate, $actual);
|
||||
} catch (GenerationError $e) {
|
||||
$file = $e->getNewFile();
|
||||
}
|
||||
|
||||
if ($actual) {
|
||||
return $file;
|
||||
} else {
|
||||
return $this->getFilename($file);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cache data (to render the image)
|
||||
*
|
||||
* @param string $type the image type
|
||||
* @param int $quality the quality (for JPEG)
|
||||
*/
|
||||
public function cacheData($type = 'jpg', $quality = 80)
|
||||
{
|
||||
return file_get_contents($this->cacheFile($type, $quality));
|
||||
}
|
||||
|
||||
/**
|
||||
* Hook to helps to extends and enhance this class
|
||||
*/
|
||||
protected function getFilename($filename)
|
||||
{
|
||||
return $filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates and output a jpeg cached file
|
||||
*/
|
||||
public function jpeg($quality = 80)
|
||||
{
|
||||
return $this->cacheFile('jpg', $quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates and output a gif cached file
|
||||
*/
|
||||
public function gif()
|
||||
{
|
||||
return $this->cacheFile('gif');
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates and output a png cached file
|
||||
*/
|
||||
public function png()
|
||||
{
|
||||
return $this->cacheFile('png');
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates and output an image using the same type as input
|
||||
*/
|
||||
public function guess($quality = 80)
|
||||
{
|
||||
return $this->cacheFile('guess', $quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the files that this image depends on
|
||||
*
|
||||
* @return string[] this is an array of strings containing all the files that the
|
||||
* current Image depends on
|
||||
*/
|
||||
public function getDependencies()
|
||||
{
|
||||
$dependencies = array();
|
||||
|
||||
$file = $this->getFilePath();
|
||||
if ($file) {
|
||||
$dependencies[] = $file;
|
||||
}
|
||||
|
||||
foreach ($this->operations as $operation) {
|
||||
foreach ($operation[1] as $argument) {
|
||||
if ($argument instanceof self) {
|
||||
$dependencies = array_merge($dependencies, $argument->getDependencies());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $dependencies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies the operations
|
||||
*/
|
||||
public function applyOperations()
|
||||
{
|
||||
// Renders the effects
|
||||
foreach ($this->operations as $operation) {
|
||||
call_user_func_array(array($this->adapter, $operation[0]), $operation[1]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the adapter
|
||||
*/
|
||||
public function init()
|
||||
{
|
||||
$this->getAdapter()->init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the file to a given output
|
||||
*/
|
||||
public function save($file, $type = 'guess', $quality = 80)
|
||||
{
|
||||
if ($file) {
|
||||
$directory = dirname($file);
|
||||
|
||||
if (!is_dir($directory)) {
|
||||
@mkdir($directory, 0777, true);
|
||||
}
|
||||
}
|
||||
|
||||
if (is_int($type)) {
|
||||
$quality = $type;
|
||||
$type = 'jpeg';
|
||||
}
|
||||
|
||||
if ($type == 'guess') {
|
||||
$type = $this->guessType();
|
||||
}
|
||||
|
||||
if (!isset(self::$types[$type])) {
|
||||
throw new \InvalidArgumentException('Given type ('.$type.') is not valid');
|
||||
}
|
||||
|
||||
$type = self::$types[$type];
|
||||
|
||||
try {
|
||||
$this->init();
|
||||
$this->applyOperations();
|
||||
|
||||
$success = false;
|
||||
|
||||
if (null == $file) {
|
||||
ob_start();
|
||||
}
|
||||
|
||||
if ($type == 'jpeg') {
|
||||
$success = $this->getAdapter()->saveJpeg($file, $quality);
|
||||
}
|
||||
|
||||
if ($type == 'gif') {
|
||||
$success = $this->getAdapter()->saveGif($file);
|
||||
}
|
||||
|
||||
if ($type == 'png') {
|
||||
$success = $this->getAdapter()->savePng($file);
|
||||
}
|
||||
|
||||
if (!$success) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (null === $file ? ob_get_clean() : $file);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
if ($this->useFallbackImage) {
|
||||
return (null === $file ? file_get_contents($this->fallback) : $this->getCacheFallback());
|
||||
} else {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the contents of the image
|
||||
*/
|
||||
public function get($type = 'guess', $quality = 80)
|
||||
{
|
||||
return $this->save(null, $type, $quality);
|
||||
}
|
||||
|
||||
/* Image API */
|
||||
|
||||
/**
|
||||
* Image width
|
||||
*/
|
||||
public function width()
|
||||
{
|
||||
return $this->getAdapter()->width();
|
||||
}
|
||||
|
||||
/**
|
||||
* Image height
|
||||
*/
|
||||
public function height()
|
||||
{
|
||||
return $this->getAdapter()->height();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tostring defaults to jpeg
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->guess();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returning basic html code for this image
|
||||
*/
|
||||
public function html($title = '', $type = 'jpg', $quality = 80)
|
||||
{
|
||||
return '<img title="' . $title . '" src="' . $this->cacheFile($type, $quality) . '" />';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Base64 inlinable representation
|
||||
*/
|
||||
public function inline($type = 'jpg', $quality = 80)
|
||||
{
|
||||
$mime = $type;
|
||||
if ($mime == 'jpg') {
|
||||
$mime = 'jpeg';
|
||||
}
|
||||
|
||||
return 'data:image/'.$mime.';base64,'.base64_encode(file_get_contents($this->cacheFile($type, $quality, true)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an instance, usefull for one-line chaining
|
||||
*/
|
||||
public static function open($file = '')
|
||||
{
|
||||
return new static($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an instance of a new resource
|
||||
*/
|
||||
public static function create($width, $height)
|
||||
{
|
||||
return new static(null, $width, $height);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an instance of image from its data
|
||||
*/
|
||||
public static function fromData($data)
|
||||
{
|
||||
$image = new static();
|
||||
$image->setData($data);
|
||||
|
||||
return $image;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an instance of image from resource
|
||||
*/
|
||||
public static function fromResource($resource)
|
||||
{
|
||||
$image = new static();
|
||||
$image->setResource($resource);
|
||||
|
||||
return $image;
|
||||
}
|
||||
}
|
93
developer/vendor/gregwar/image/Gregwar/Image/ImageColor.php
vendored
Normal file
93
developer/vendor/gregwar/image/Gregwar/Image/ImageColor.php
vendored
Normal file
@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image;
|
||||
|
||||
/**
|
||||
* Color manipulation class
|
||||
*/
|
||||
class ImageColor
|
||||
{
|
||||
private static $colors = array(
|
||||
'black' => 0x000000,
|
||||
'silver' => 0xc0c0c0,
|
||||
'gray' => 0x808080,
|
||||
'teal' => 0x008080,
|
||||
'aqua' => 0x00ffff,
|
||||
'blue' => 0x0000ff,
|
||||
'navy' => 0x000080,
|
||||
'green' => 0x008000,
|
||||
'lime' => 0x00ff00,
|
||||
'white' => 0xffffff,
|
||||
'fuschia' => 0xff00ff,
|
||||
'purple' => 0x800080,
|
||||
'olive' => 0x808000,
|
||||
'yellow' => 0xffff00,
|
||||
'orange' => 0xffA500,
|
||||
'red' => 0xff0000,
|
||||
'maroon' => 0x800000,
|
||||
'transparent' => 0x7fffffff
|
||||
);
|
||||
|
||||
public static function gdAllocate($image, $color)
|
||||
{
|
||||
$colorRGBA = self::parse($color);
|
||||
|
||||
$b = ($colorRGBA)&0xff;
|
||||
$colorRGBA >>= 8;
|
||||
$g = ($colorRGBA)&0xff;
|
||||
$colorRGBA >>= 8;
|
||||
$r = ($colorRGBA)&0xff;
|
||||
$colorRGBA >>= 8;
|
||||
$a = ($colorRGBA)&0xff;
|
||||
|
||||
$c = imagecolorallocatealpha($image, $r, $g, $b, $a);
|
||||
|
||||
if ($color == 'transparent') {
|
||||
imagecolortransparent($image, $c);
|
||||
}
|
||||
|
||||
return $c;
|
||||
}
|
||||
|
||||
public static function parse($color)
|
||||
{
|
||||
// Direct color representation (ex: 0xff0000)
|
||||
if (!is_string($color) && is_numeric($color))
|
||||
return $color;
|
||||
|
||||
// Color name (ex: "red")
|
||||
if (isset(self::$colors[$color]))
|
||||
return self::$colors[$color];
|
||||
|
||||
if (is_string($color)) {
|
||||
$color_string = str_replace(' ', '', $color);
|
||||
|
||||
// Color string (ex: "ff0000", "#ff0000" or "0xfff")
|
||||
if (preg_match('/^(#|0x|)([0-9a-f]{3,6})/i', $color_string, $matches)) {
|
||||
$col = $matches[2];
|
||||
|
||||
if (strlen($col) == 6)
|
||||
return hexdec($col);
|
||||
|
||||
if (strlen($col) == 3) {
|
||||
$r = '';
|
||||
for ($i=0; $i<3; $i++)
|
||||
$r.= $col[$i].$col[$i];
|
||||
return hexdec($r);
|
||||
}
|
||||
}
|
||||
|
||||
// Colors like "rgb(255, 0, 0)"
|
||||
if (preg_match('/^rgb\(([0-9]+),([0-9]+),([0-9]+)\)/i', $color_string, $matches)) {
|
||||
$r = $matches[1];
|
||||
$g = $matches[2];
|
||||
$b = $matches[3];
|
||||
if ($r>=0 && $r<=0xff && $g>=0 && $g<=0xff && $b>=0 && $b<=0xff) {
|
||||
return ($r << 16) | ($g << 8) | ($b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw new \InvalidArgumentException('Invalid color: '.$color);
|
||||
}
|
||||
}
|
19
developer/vendor/gregwar/image/Gregwar/Image/LICENSE
vendored
Normal file
19
developer/vendor/gregwar/image/Gregwar/Image/LICENSE
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
Copyright (c) <2012-2013> Grégoire Passault
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
275
developer/vendor/gregwar/image/Gregwar/Image/README.md
vendored
Normal file
275
developer/vendor/gregwar/image/Gregwar/Image/README.md
vendored
Normal file
@ -0,0 +1,275 @@
|
||||
# Gregwar's Image class
|
||||
|
||||
[](https://travis-ci.org/Gregwar/Image)
|
||||
|
||||
The `Gregwar\Image` class purpose is to provide a simple object-oriented images handling and caching API.
|
||||
|
||||
# Installation
|
||||
|
||||
With composer :
|
||||
|
||||
``` json
|
||||
{
|
||||
...
|
||||
"require": {
|
||||
"gregwar/image": "2.*"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
# Usage
|
||||
|
||||
## Basic handling
|
||||
|
||||
Using methods chaining, you can open, transform and save a file in a single line:
|
||||
|
||||
```php
|
||||
<?php use Gregwar\Image\Image;
|
||||
|
||||
Image::open('in.png')
|
||||
->resize(100, 100)
|
||||
->negate()
|
||||
->save('out.jpg');
|
||||
```
|
||||
|
||||
Here are the resize methods:
|
||||
|
||||
* `resize($width, $height, $background)`: resizes the image, will preserve scale and never
|
||||
enlarge it (background is `red` in order to understand what happens):
|
||||
|
||||

|
||||
|
||||
* `scaleResize($width, $height, $background)`: resizes the image, will preserve scale, can enlarge
|
||||
it (background is `red` in order to understand what happens):
|
||||
|
||||

|
||||
|
||||
* `forceResize($width, $height, $background)`: resizes the image forcing it to
|
||||
be exactly `$width` by `$height`
|
||||
|
||||

|
||||
|
||||
* `cropResize($width, $height, $background)`: resizes the image preserving scale (just like `resize()`)
|
||||
and croping the whitespaces:
|
||||
|
||||

|
||||
|
||||
* `zoomCrop($width, $height, $background, $xPos, $yPos)`: resize and crop the image to fit to given dimensions:
|
||||
|
||||

|
||||
|
||||
* In `zoomCrop()`, You can change the position of the resized image using the `$xPos` (center, left or right) and `$yPos` (center,
|
||||
top or bottom):
|
||||
|
||||

|
||||
|
||||
The other methods available are:
|
||||
|
||||
* `crop($x, $y, $w, $h)`: crops the image to a box located on coordinates $x,y and
|
||||
which size is $w by $h
|
||||
|
||||
* `negate()`: negates the image colors
|
||||
|
||||
* `brighness($b)`: applies a brightness effect to the image (from -255 to +255)
|
||||
|
||||
* `contrast($c)`: applies a contrast effect to the image (from -100 to +100)
|
||||
|
||||
* `grayscale()`: converts the image to grayscale
|
||||
|
||||
* `emboss()`: emboss the image
|
||||
|
||||
* `smooth($p)`: smooth the image
|
||||
|
||||
* `sharp()`: applies a mean removal filter on the image
|
||||
|
||||
* `edge()`: applies an edge effect on the image
|
||||
|
||||
* `colorize($red, $green, $blue)`: colorize the image (from -255 to +255 for each color)
|
||||
|
||||
* `sepia()`: applies a sepia effect
|
||||
|
||||
* `merge($image, $x, $y, $width, $height)`: merges two images
|
||||
|
||||
* `fill($color, $x, $y)`: fills the image with the given color
|
||||
|
||||
* `write($font, $text, $x, $y, $size, $angle, $color, $position)`: writes text over image, $position can be any of 'left', 'right', or 'center'
|
||||
|
||||
* `rectangle($x1, $y1, $x2, $y2, $color, $filled=false)`: draws a rectangle
|
||||
|
||||
* `rotate($angle, $background = 0xffffff)` : rotate the image to given angle
|
||||
|
||||
* `roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled=false)`: draws a rounded rectangle ($radius can be anything from 0)
|
||||
|
||||
* `line($x1, $y1, $x2, $y2, $color)`: draws a line
|
||||
|
||||
* `ellipse($cx, $cy, $width, $height, $color, $filled=false)`: draws an ellipse
|
||||
|
||||
* `circle($cx, $cy, $r, $color, $filled=false)`: draws a circle
|
||||
|
||||
* `fillBackground($bg=0xffffff)`: fills the background of a transparent image to the 'bg' color
|
||||
|
||||
* `fixOrientation()`: return the image rotated and flipped using image exif information
|
||||
|
||||
* `html($title = '', $type = 'jpg')`: return the `<img ... />` tag with the cache image
|
||||
|
||||
* `flip($flipVertical, $flipHorizontal)`: flips the image in the given directions. Both params are boolean and at least one must be true.
|
||||
|
||||
* `inline($type = 'jpg')`: returns the HTML inlinable base64 string (see `demo/inline.php`)
|
||||
|
||||
You can also create image from scratch using:
|
||||
|
||||
```php
|
||||
<?php
|
||||
Image::create(200, 100);
|
||||
```
|
||||
|
||||
Where 200 is the width and 100 the height
|
||||
|
||||
## Saving the image
|
||||
|
||||
You can save the image to an explicit file using `save($file, $type = 'jpg', $quality = 80)`:
|
||||
|
||||
```php
|
||||
<?php
|
||||
// ...
|
||||
$image->save('output.jpg', 'jpg', 85);
|
||||
```
|
||||
|
||||
You can also get the contents of the image using `get($type = 'jpg', $quality = 80)`, which will return the binary contents of the image
|
||||
|
||||
## Using cache
|
||||
|
||||
Each operation above is not actually applied on the opened image, but added in an operations
|
||||
array. This operation array, the name, type and modification time of file are hashed using
|
||||
`sha1()` and the hash is used to look up for a cache file.
|
||||
|
||||
Once the cache directory configured, you can call the following methods:
|
||||
|
||||
* `jpeg($quality = 80)`: lookup or create a jpeg cache file on-the-fly
|
||||
|
||||
* `gif()`: lookup or create a gif cache file on-the-fly
|
||||
|
||||
* `png()`: lookup or create a png cache file on-the-fly
|
||||
|
||||
* `guess($quality = 80)`: guesses the type (use the same as input) and lookup or create a
|
||||
cache file on-the-fly
|
||||
|
||||
* `setPrettyName($prettyName, $prefix = true)`: sets a "pretty" name suffix for the file, if you want it to be more SEO-friendly.
|
||||
for instance, if you call it "Fancy Image", the cache will look like something/something-fancy-image.jpg.
|
||||
If `$prefix` is passed to `false` (default `true`), the pretty name won't have any hash prefix.
|
||||
If you want to use non-latin1 pretty names, **behat/transliterator** package must be installed.
|
||||
|
||||
For instance:
|
||||
|
||||
```php
|
||||
<?php use Gregwar\Image\Image;
|
||||
|
||||
echo Image::open('test.png')
|
||||
->sepia()
|
||||
->jpeg();
|
||||
|
||||
//Outputs: cache/images/1/8/6/9/c/86e4532dbd9c073075ef08e9751fc9bc0f4.jpg
|
||||
```
|
||||
|
||||
If the original file and operations do not change, the hashed value will be the same and the
|
||||
cache will not be generated again.
|
||||
|
||||
You can use this directly in an HTML document:
|
||||
|
||||
|
||||
```php
|
||||
<?php use Gregwar\Image\Image;
|
||||
|
||||
// ...
|
||||
<img src="<?php echo Image::open('image.jpg')->resize(150, 150)->jpeg(); ?>" />
|
||||
// ...
|
||||
```
|
||||
|
||||
This is powerful since if you change the original image or any of your code the cached hash
|
||||
will change and the file will be regenerated.
|
||||
|
||||
Writing image
|
||||
-------------
|
||||
|
||||
You can also create your own image on-the-fly using drawing functions:
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
$img_src = Image::create(300, 300)
|
||||
->fill(0xffaaaa) // Filling with a light red
|
||||
->rectangle(0xff3333, 0, 100, 300, 200, true) // Drawing a red rectangle
|
||||
// Writing "Hello $username !" on the picture using a custom TTF font file
|
||||
->write('./fonts/CaviarDreams.ttf', 'Hello '.$username.'!', 150, 150, 20, 0, 'white', 'center')
|
||||
->jpeg();
|
||||
?>
|
||||
<img src="<?= $img_src ?>" />
|
||||
```
|
||||
|
||||
## Using fallback image
|
||||
|
||||
If the image file doesn't exists, you can configurate a fallback image that will be used
|
||||
by the class (note that this require the cache directory to be available).
|
||||
|
||||
A default "error" image which is used is in `images/error.jpg`, you can change it with:
|
||||
|
||||
```php
|
||||
<?php
|
||||
$img->setFallback('/path/to/my/fallback.jpg');
|
||||
```
|
||||
|
||||
## Garbage Collect
|
||||
|
||||
To prevent the cache from growing forever, you can use the provided GarbageCollect class as below:
|
||||
|
||||
```php
|
||||
<?php use Gregwar\Image\GarbageCollect;
|
||||
|
||||
// This could be a cron called each day @3:00AM for instance
|
||||
// Removes all the files from ../cache that are more than 30 days
|
||||
// old. A verbose output will explain which files are deleted
|
||||
GarbageCollect::dropOldFiles(__DIR__.'/../cache', 30, true);
|
||||
|
||||
```
|
||||
|
||||
# Development
|
||||
|
||||
`Gregwar\Image` is using PHP metaprogramming paradigms that makes it easy to enhance.
|
||||
|
||||
Each function that handles the image is implemented in an *Adapter*, this is where
|
||||
all the specific actions take place.
|
||||
|
||||
The `Common` adapter is design to contain common abstract actions, while the
|
||||
specific adatpers (like `GD`) are designed to contain actions specific to the low
|
||||
level layer.
|
||||
|
||||
You can add your own methods by adding it in the corresponding adapter.
|
||||
|
||||
```php
|
||||
<?php
|
||||
// In the adapter
|
||||
private function myFilter()
|
||||
{
|
||||
$this->negate();
|
||||
$this->sepia();
|
||||
}
|
||||
```
|
||||
|
||||
Which could be used on the Image
|
||||
|
||||
```php
|
||||
<?php
|
||||
$image->myFilter();
|
||||
```
|
||||
|
||||
You can also write your own adapter which could extend one of this repository and use it by calling `setAdapter()`:
|
||||
|
||||
```php
|
||||
<?php
|
||||
$image->setAdapter(new MyCustomAdapter);
|
||||
```
|
||||
|
||||
# License
|
||||
|
||||
`Gregwar\Image` is under MIT License, please read the LICENSE file for further details.
|
||||
Do not hesitate to fork this repository and customize it !
|
38
developer/vendor/gregwar/image/Gregwar/Image/Source/Create.php
vendored
Normal file
38
developer/vendor/gregwar/image/Gregwar/Image/Source/Create.php
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Source;
|
||||
|
||||
/**
|
||||
* Creates a new image from scratch
|
||||
*/
|
||||
class Create extends Source
|
||||
{
|
||||
protected $width;
|
||||
protected $height;
|
||||
|
||||
public function __construct($width, $height)
|
||||
{
|
||||
$this->width = $width;
|
||||
$this->height = $height;
|
||||
}
|
||||
|
||||
public function getWidth()
|
||||
{
|
||||
return $this->width;
|
||||
}
|
||||
|
||||
public function getHeight()
|
||||
{
|
||||
return $this->height;
|
||||
}
|
||||
|
||||
public function getInfos()
|
||||
{
|
||||
return array($this->width, $this->height);
|
||||
}
|
||||
|
||||
public function correct()
|
||||
{
|
||||
return $this->width > 0 && $this->height > 0;
|
||||
}
|
||||
}
|
26
developer/vendor/gregwar/image/Gregwar/Image/Source/Data.php
vendored
Normal file
26
developer/vendor/gregwar/image/Gregwar/Image/Source/Data.php
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Source;
|
||||
|
||||
/**
|
||||
* Having image in some string
|
||||
*/
|
||||
class Data extends Source
|
||||
{
|
||||
protected $data;
|
||||
|
||||
public function __construct($data)
|
||||
{
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
public function getData()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
public function getInfos()
|
||||
{
|
||||
return sha1($this->data);
|
||||
}
|
||||
}
|
63
developer/vendor/gregwar/image/Gregwar/Image/Source/File.php
vendored
Normal file
63
developer/vendor/gregwar/image/Gregwar/Image/Source/File.php
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Source;
|
||||
|
||||
use Gregwar\Image\Image;
|
||||
|
||||
/**
|
||||
* Open an image from a file
|
||||
*/
|
||||
class File extends Source
|
||||
{
|
||||
protected $file;
|
||||
|
||||
public function __construct($file)
|
||||
{
|
||||
$this->file = $file;
|
||||
}
|
||||
|
||||
public function getFile()
|
||||
{
|
||||
return $this->file;
|
||||
}
|
||||
|
||||
public function correct()
|
||||
{
|
||||
return false !== @exif_imagetype($this->file);
|
||||
}
|
||||
|
||||
public function guessType()
|
||||
{
|
||||
if (function_exists('exif_imagetype')) {
|
||||
$type = @exif_imagetype($this->file);
|
||||
|
||||
if (false !== $type) {
|
||||
if ($type == IMAGETYPE_JPEG) {
|
||||
return 'jpeg';
|
||||
}
|
||||
|
||||
if ($type == IMAGETYPE_GIF) {
|
||||
return 'gif';
|
||||
}
|
||||
|
||||
if ($type == IMAGETYPE_PNG) {
|
||||
return 'png';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$parts = explode('.', $this->file);
|
||||
$ext = strtolower($parts[count($parts)-1]);
|
||||
|
||||
if (isset(Image::$types[$ext])) {
|
||||
return Image::$types[$ext];
|
||||
}
|
||||
|
||||
return 'jpeg';
|
||||
}
|
||||
|
||||
public function getInfos()
|
||||
{
|
||||
return $this->file;
|
||||
}
|
||||
}
|
21
developer/vendor/gregwar/image/Gregwar/Image/Source/Resource.php
vendored
Normal file
21
developer/vendor/gregwar/image/Gregwar/Image/Source/Resource.php
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Source;
|
||||
|
||||
/**
|
||||
* Have the image directly in a specific resource
|
||||
*/
|
||||
class Resource extends Source
|
||||
{
|
||||
protected $resource;
|
||||
|
||||
public function __construct($resource)
|
||||
{
|
||||
$this->resource = $resource;
|
||||
}
|
||||
|
||||
public function getResource()
|
||||
{
|
||||
return $this->resource;
|
||||
}
|
||||
}
|
34
developer/vendor/gregwar/image/Gregwar/Image/Source/Source.php
vendored
Normal file
34
developer/vendor/gregwar/image/Gregwar/Image/Source/Source.php
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace Gregwar\Image\Source;
|
||||
|
||||
/**
|
||||
* An Image source
|
||||
*/
|
||||
class Source
|
||||
{
|
||||
/**
|
||||
* Guess the type of the image
|
||||
*/
|
||||
public function guessType()
|
||||
{
|
||||
return 'jpeg';
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this image correct ?
|
||||
*/
|
||||
public function correct()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information about images, these informations should
|
||||
* change only if the original image changed
|
||||
*/
|
||||
public function getInfos()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
21
developer/vendor/gregwar/image/Gregwar/Image/autoload.php
vendored
Normal file
21
developer/vendor/gregwar/image/Gregwar/Image/autoload.php
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
$vendors = __DIR__.'/vendor/autoload.php';
|
||||
if (file_exists($vendors)) {
|
||||
require($vendors);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers an autoload for all the classes in Gregwar\Image
|
||||
*/
|
||||
spl_autoload_register(function ($className) {
|
||||
$namespace = 'Gregwar\\Image';
|
||||
|
||||
if (strpos($className, $namespace) === 0) {
|
||||
$className = str_replace($namespace, '', $className);
|
||||
$fileName = __DIR__ . '/' . str_replace('\\', '/', $className) . '.php';
|
||||
if (file_exists($fileName)) {
|
||||
require($fileName);
|
||||
}
|
||||
}
|
||||
});
|
BIN
developer/vendor/gregwar/image/Gregwar/Image/images/error.jpg
vendored
Normal file
BIN
developer/vendor/gregwar/image/Gregwar/Image/images/error.jpg
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
Reference in New Issue
Block a user