From 48363a3644f75f7b28e24f017c1193de22a3b6c4 Mon Sep 17 00:00:00 2001 From: tonydspaniard Date: Fri, 20 Dec 2013 14:02:59 +0100 Subject: [PATCH 01/13] Add active id to options if input widget has a model fixes #1550 --- extensions/yii/jui/InputWidget.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extensions/yii/jui/InputWidget.php b/extensions/yii/jui/InputWidget.php index e100d6c..68334c7 100644 --- a/extensions/yii/jui/InputWidget.php +++ b/extensions/yii/jui/InputWidget.php @@ -10,6 +10,7 @@ namespace yii\jui; use Yii; use yii\base\Model; use yii\base\InvalidConfigException; +use yii\helpers\Html; /** * InputWidget is the base class for all jQuery UI input widgets. @@ -46,6 +47,9 @@ class InputWidget extends Widget if (!$this->hasModel() && $this->name === null) { throw new InvalidConfigException("Either 'name' or 'model' and 'attribute' properties must be specified."); } + if($this->hasModel() && !array_key_exists('id', $this->options)) { + $this->options['id'] = Html::getInputId($this->model, $this->attribute); + } parent::init(); } From 045295e3c6aee2648ab507dc38b5c988aeaa1acf Mon Sep 17 00:00:00 2001 From: tonydspaniard Date: Fri, 20 Dec 2013 14:04:48 +0100 Subject: [PATCH 02/13] Update change log --- extensions/yii/jui/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/yii/jui/CHANGELOG.md b/extensions/yii/jui/CHANGELOG.md index eb30e09..6f3cfb9 100644 --- a/extensions/yii/jui/CHANGELOG.md +++ b/extensions/yii/jui/CHANGELOG.md @@ -4,7 +4,7 @@ Yii Framework 2 jui extension Change Log 2.0.0 beta under development ---------------------------- -- no changes in this release. +- Bug #1550: Ensure active id to options when using models (tonydspaniard) 2.0.0 alpha, December 1, 2013 ----------------------------- From e86f33016413ebadf2f78229adef5ab352e0c532 Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sat, 28 Dec 2013 09:04:32 +0100 Subject: [PATCH 03/13] image helper proposal --- extensions/yii/imagine/CHANGELOG.md | 12 ++ extensions/yii/imagine/Image.php | 260 +++++++++++++++++++++++++++++++++++ extensions/yii/imagine/LICENSE.md | 32 +++++ extensions/yii/imagine/composer.json | 28 ++++ 4 files changed, 332 insertions(+) create mode 100644 extensions/yii/imagine/CHANGELOG.md create mode 100644 extensions/yii/imagine/Image.php create mode 100644 extensions/yii/imagine/LICENSE.md create mode 100644 extensions/yii/imagine/composer.json diff --git a/extensions/yii/imagine/CHANGELOG.md b/extensions/yii/imagine/CHANGELOG.md new file mode 100644 index 0000000..dffb353 --- /dev/null +++ b/extensions/yii/imagine/CHANGELOG.md @@ -0,0 +1,12 @@ +Yii Framework 2 imagine extension Change Log +================================================ + +2.0.0 beta under development +---------------------------- + +- no changes in this release. + +2.0.0 alpha, December 1, 2013 +----------------------------- + +- Initial release. diff --git a/extensions/yii/imagine/Image.php b/extensions/yii/imagine/Image.php new file mode 100644 index 0000000..5563f13 --- /dev/null +++ b/extensions/yii/imagine/Image.php @@ -0,0 +1,260 @@ + [ + * ... + * 'image' => [ + * 'class' => 'yii\imagine\Image', + * 'driver' => \yii\imagine\Image::DRIVER_GD2, + * ], + * ... + * ], + * ~~~ + * + * But you can also use it directly, + * + * ~~~ + * use yii\imagine\Image; + * + * $img = new Image(); + * ~~~ + * + * Example of use: + * + * ~~~ + * // thumb - saved on runtime path + * $imagePath = Yii::$app->getBasePath() . '/web/img/test-image.jpg'; + * $runtimePath = Yii::$app->getRuntimePath(); + * Yii::$app->image + * ->thumb($imagePath, 120, 120) + * ->save($runtime . '/thumb-test-image.jpg', ['quality' => 50]); + * ~~~ + * + * + * @see http://imagine.readthedocs.org/ + * + * @author Antonio Ramirez + * @since 2.0 + */ +class Image extends Component +{ + /** + * GD2 driver definition for Imagine implementation using the GD library. + */ + const DRIVER_GD2 = 'gd2'; + /** + * imagick driver definition. + */ + const DRIVER_IMAGICK = 'imagick'; + /** + * gmagick driver definition. + */ + const DRIVER_GMAGICK = 'gmagick'; + /** + * @var \Imagine\Image\ImagineInterface instance. + */ + private $_imagine; + /** + * @var string the driver to use. These can be: + * - gd2 + * - imagick + * - gmagick + */ + private $_driver = "gd2"; + + /** + * Sets the driver. + * @param $driver + * @throws \yii\base\InvalidConfigException + */ + public function setDriver($driver) + { + if (!is_string($driver) || !in_array($driver, $this->getAvailableDrivers(), true)) { + throw new InvalidConfigException( + strtr('"{class}::driver" should be string of these possible options "{drivers}", "{driver}" given.', [ + '{class}' => get_class($this), + '{drivers}' => implode(', ', $this->getAvailableDrivers()), + '{driver}' => $driver + ])); + } + $this->_driver = $driver; + } + + /** + * Returns the driver which is going to be used for \Imagine\Image\ImagineInterface instance creation. + * @return string the driver used. + */ + public function getDriver() + { + return $this->_driver; + } + + /** + * @return array of available drivers. + */ + public function getAvailableDrivers() + { + static $drivers; + if ($drivers === null) { + $drivers = [static::DRIVER_GD2, static::DRIVER_GMAGICK, static::DRIVER_IMAGICK]; + } + return $drivers; + } + + /** + * @return \Imagine\Image\ImagineInterface instance + */ + public function getImagine() + { + if ($this->_imagine === null) { + switch ($this->_driver) { + case static::DRIVER_GD2: + $this->_imagine = new \Imagine\Gd\Imagine(); + break; + case static::DRIVER_IMAGICK: + $this->_imagine = new \Imagine\Imagick\Imagine(); + break; + case static::DRIVER_GMAGICK: + $this->_imagine = new \Imagine\Gmagick\Imagine(); + break; + } + } + return $this->_imagine; + } + + /** + * Crops an image + * @param string $filename the full path to the image file + * @param int $width the crop width + * @param int $height the crop height + * @param int $startX the x starting point to crop from. Defaults to 0. + * @param int $startY the y starting point to crop from. Defaults to 0. + * @return \Imagine\Image\ManipulatorInterface + */ + public function crop($filename, $width, $height, $startX = 0, $startY = 0) + { + return $this->getImagine() + ->open($filename) + ->copy() + ->crop(new Point($startX, $startY), new Box($width, $height)); + } + + /** + * Creates a thumbnail image. The function differs from [[\Imagine\Image\ImageInterface::thumbnail()]] function that + * it keeps the aspect ratio of the image. + * @param string $filename the full path to the image file + * @param int $width the width to create the thumbnail + * @param int $height the height in pixels to create the thumbnail + * @param string $mode + * @return \Imagine\Image\ImageInterface|ManipulatorInterface + */ + public function thumb($filename, $width, $height, $mode = ManipulatorInterface::THUMBNAIL_OUTBOUND) + { + $box = new Box($width, $height); + $img = $this->getImagine() + ->open($filename); + + if(($img->getSize()->getWidth() <= $box->getWidth() && $img->getSize()->getHeight() <= $box->getHeight()) + || (!$box->getWidth() && !$box->getHeight())) { + return $img->copy(); + } + $img = $img->thumbnail($box, $mode); + + // create empty image to preserve aspect ratio of thumbnail + $thumb = $this->getImagine() + ->create($box); + + // calculate points + $size = $img->getSize(); + + $startX = 0; + $startY = 0; + if ($size->getWidth() < $width) { + $startX = ceil($width - $size->getWidth()) / 2; + } + if ($size->getHeight() < $height) { + $startY = ceil($height - $size->getHeight()) / 2; + } + + $thumb->paste($img, new Point($startX, $startY)); + + return $thumb; + } + + /** + * Paste a watermark image onto another. + * @param string $filename the full path to the image file to apply the watermark to + * @param string $watermarkFilename the full path to the image file to apply as watermark + * @param Point $pos the pixel position where to apply the watermark. If null, bottomRight will be default. + * @return ManipulatorInterface + */ + public function watermark($filename, $watermarkFilename, Point $pos = null) + { + $img = $this->getImagine()->open($filename); + $watermark = $this->getImagine()->open($watermarkFilename); + + $size = $img->getSize(); + $wSize = $watermark->getSize(); + + // if no Point position was given, set its bottom right by default + $pos = $pos === null ? + new Point($size->getWidth() - $wSize->getWidth() , $size->getHeight() - $wSize->getHeight()) + : $pos; + + return $img->paste($watermark, $pos); + } + + /** + * Draws text to an image. + * @param string $filename the full path to the image file + * @param string $text the text to write to the image + * @param array $fontConfig the font configuration. The font configuration holds the following keys: + * - font: The path to the font file to use to style the text. Required parameter. + * - size: The font size. Defaults to 12. + * - posX: The X position to write the text. Defaults to 5. + * - posY: The Y position to write the text. Defaults to 5. + * - angle: The angle to use to write the text. Defaults to 0. + * @return \Imagine\Image\ImageInterface + * @throws \Imagine\Exception\InvalidArgumentException + */ + public function text($filename, $text, array $fontConfig) + { + $img = $this->getImagine()->open($filename); + + $font = ArrayHelper::getValue($fontConfig, 'font'); + if ($font === null) { + throw new InvalidArgumentException('"' . get_class($this) . + '::text()" "$fontConfig" parameter should contain a "font" key with the path to the font file to use.'); + } + $fontSize = ArrayHelper::getValue($fontConfig, 'size', 12); + $fontColor = ArrayHelper::getValue($fontConfig, 'color', 'fff'); + $fontPosX = ArrayHelper::getValue($fontConfig, 'posX', 5); + $fontPosY = ArrayHelper::getValue($fontConfig, 'posY', 5); + $fontAngle = ArrayHelper::getValue($fontConfig, 'angle', 0); + + $font = $this->getImagine()->font($font, $fontSize, new Color($fontColor)); + $img->draw()->text($text, $font, new Point($fontPosX, $fontPosY), $fontAngle); + return $img; + } +} \ No newline at end of file diff --git a/extensions/yii/imagine/LICENSE.md b/extensions/yii/imagine/LICENSE.md new file mode 100644 index 0000000..0bb1a8d --- /dev/null +++ b/extensions/yii/imagine/LICENSE.md @@ -0,0 +1,32 @@ +The Yii framework is free software. It is released under the terms of +the following BSD License. + +Copyright © 2008-2013 by Yii Software LLC (http://www.yiisoft.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Yii Software LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/extensions/yii/imagine/composer.json b/extensions/yii/imagine/composer.json new file mode 100644 index 0000000..10d0056 --- /dev/null +++ b/extensions/yii/imagine/composer.json @@ -0,0 +1,28 @@ +{ + "name": "yiisoft/yii2-imagine", + "description": "The Imagine integration for the Yii framework", + "keywords": ["yii", "imagine", "image", "helper"], + "type": "yii2-extension", + "license": "BSD-3-Clause", + "support": { + "issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aimagine", + "forum": "http://www.yiiframework.com/forum/", + "wiki": "http://www.yiiframework.com/wiki/", + "irc": "irc://irc.freenode.net/yii", + "source": "https://github.com/yiisoft/yii2" + }, + "authors": [ + { + "name": "Antonio Ramirez", + "email": "amigo.cobos@gmail.com" + } + ], + "require": { + "yiisoft/yii2": "*", + "imagine/imagine": "v0.5.0" + }, + "autoload": { + "psr-0": { "yii\\imagine\\": "" } + }, + "target-dir": "yii/imagine" +} From 0efe892f158abd7bbf138974c0df6bab23d2b764 Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sat, 28 Dec 2013 09:33:55 +0100 Subject: [PATCH 04/13] fix merging issues --- extensions/yii/jui/InputWidget.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/extensions/yii/jui/InputWidget.php b/extensions/yii/jui/InputWidget.php index 7aae366..0facfb9 100644 --- a/extensions/yii/jui/InputWidget.php +++ b/extensions/yii/jui/InputWidget.php @@ -50,9 +50,6 @@ class InputWidget extends Widget if ($this->hasModel() && !isset($this->options['id'])) { $this->options['id'] = Html::getInputId($this->model, $this->attribute); } - if($this->hasModel() && !array_key_exists('id', $this->options)) { - $this->options['id'] = Html::getInputId($this->model, $this->attribute); - } parent::init(); } From 7efdad9c695c893b471c6cecbc4e85a7461a3316 Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sat, 28 Dec 2013 17:07:19 +0100 Subject: [PATCH 05/13] remove use of dumb static variable --- extensions/yii/imagine/Image.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/extensions/yii/imagine/Image.php b/extensions/yii/imagine/Image.php index 5563f13..70eb9f0 100644 --- a/extensions/yii/imagine/Image.php +++ b/extensions/yii/imagine/Image.php @@ -115,11 +115,7 @@ class Image extends Component */ public function getAvailableDrivers() { - static $drivers; - if ($drivers === null) { - $drivers = [static::DRIVER_GD2, static::DRIVER_GMAGICK, static::DRIVER_IMAGICK]; - } - return $drivers; + return [static::DRIVER_GD2, static::DRIVER_GMAGICK, static::DRIVER_IMAGICK]; } /** From 105a0bc4bad78fc7f8498643ff27218fc367f257 Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sat, 28 Dec 2013 21:53:30 +0100 Subject: [PATCH 06/13] added frame method --- extensions/yii/imagine/Image.php | 43 +++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/extensions/yii/imagine/Image.php b/extensions/yii/imagine/Image.php index 70eb9f0..287a955 100644 --- a/extensions/yii/imagine/Image.php +++ b/extensions/yii/imagine/Image.php @@ -115,7 +115,11 @@ class Image extends Component */ public function getAvailableDrivers() { - return [static::DRIVER_GD2, static::DRIVER_GMAGICK, static::DRIVER_IMAGICK]; + static $drivers; + if ($drivers === null) { + $drivers = [static::DRIVER_GD2, static::DRIVER_GMAGICK, static::DRIVER_IMAGICK]; + } + return $drivers; } /** @@ -142,10 +146,10 @@ class Image extends Component /** * Crops an image * @param string $filename the full path to the image file - * @param int $width the crop width - * @param int $height the crop height - * @param int $startX the x starting point to crop from. Defaults to 0. - * @param int $startY the y starting point to crop from. Defaults to 0. + * @param integer $width the crop width + * @param integer $height the crop height + * @param integer $startX the x starting point to crop from. Defaults to 0. + * @param integer $startY the y starting point to crop from. Defaults to 0. * @return \Imagine\Image\ManipulatorInterface */ public function crop($filename, $width, $height, $startX = 0, $startY = 0) @@ -160,8 +164,8 @@ class Image extends Component * Creates a thumbnail image. The function differs from [[\Imagine\Image\ImageInterface::thumbnail()]] function that * it keeps the aspect ratio of the image. * @param string $filename the full path to the image file - * @param int $width the width to create the thumbnail - * @param int $height the height in pixels to create the thumbnail + * @param integer $width the width to create the thumbnail + * @param integer $height the height in pixels to create the thumbnail * @param string $mode * @return \Imagine\Image\ImageInterface|ManipulatorInterface */ @@ -253,4 +257,29 @@ class Image extends Component $img->draw()->text($text, $font, new Point($fontPosX, $fontPosY), $fontAngle); return $img; } + + /** + * Adds a frame around of the image. Please note that the image will increase `$margin` x 2. + * @param string $filename the full path to the image file + * @param integer $margin the frame size to add around the image + * @param string $color the frame color + * @param integer $alpha + * @return \Imagine\Image\ImageInterface + */ + public function frame($filename, $margin, $color='000', $alpha = 100) + { + $img = $this->getImagine()->open($filename); + + $size = $img->getSize(); + + $pasteTo = new Point($margin, $margin); + $padColor = new Color($color, $alpha); + + $box = new Box($size->getWidth() + ceil($margin * 2), $size->getHeight() + ceil($margin * 2)); + + $image = $this->getImagine()->create( $box, $padColor); + $image->paste($img, $pasteTo); + + return $image; + } } \ No newline at end of file From c7b3d2b40ad3114c69cec44673d5e6e4765a076a Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sun, 29 Dec 2013 00:00:31 +0100 Subject: [PATCH 07/13] keep methods interface constant --- extensions/yii/imagine/Image.php | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/extensions/yii/imagine/Image.php b/extensions/yii/imagine/Image.php index 287a955..63fc1c0 100644 --- a/extensions/yii/imagine/Image.php +++ b/extensions/yii/imagine/Image.php @@ -148,16 +148,16 @@ class Image extends Component * @param string $filename the full path to the image file * @param integer $width the crop width * @param integer $height the crop height - * @param integer $startX the x starting point to crop from. Defaults to 0. - * @param integer $startY the y starting point to crop from. Defaults to 0. + * @param integer $x position on image to crop from. Defaults to 0. + * @param integer $y position on image to crop from. Defaults to 0. * @return \Imagine\Image\ManipulatorInterface */ - public function crop($filename, $width, $height, $startX = 0, $startY = 0) + public function crop($filename, $width, $height, $x = 0, $y = 0) { return $this->getImagine() ->open($filename) ->copy() - ->crop(new Point($startX, $startY), new Box($width, $height)); + ->crop(new Point($x, $y), new Box($width, $height)); } /** @@ -169,7 +169,7 @@ class Image extends Component * @param string $mode * @return \Imagine\Image\ImageInterface|ManipulatorInterface */ - public function thumb($filename, $width, $height, $mode = ManipulatorInterface::THUMBNAIL_OUTBOUND) + public function thumbnail($filename, $width, $height, $mode = ManipulatorInterface::THUMBNAIL_OUTBOUND) { $box = new Box($width, $height); $img = $this->getImagine() @@ -204,12 +204,14 @@ class Image extends Component /** * Paste a watermark image onto another. + * Note: If any of `$x` or `$y` parameters are null, bottom right position will be default. * @param string $filename the full path to the image file to apply the watermark to * @param string $watermarkFilename the full path to the image file to apply as watermark - * @param Point $pos the pixel position where to apply the watermark. If null, bottomRight will be default. + * @param integer $x position on image to apply watermark. Defaults to null. + * @param integer $y position on image to apply watermark. Defaults to null * @return ManipulatorInterface */ - public function watermark($filename, $watermarkFilename, Point $pos = null) + public function watermark($filename, $watermarkFilename, $x = null, $y = null) { $img = $this->getImagine()->open($filename); $watermark = $this->getImagine()->open($watermarkFilename); @@ -217,10 +219,10 @@ class Image extends Component $size = $img->getSize(); $wSize = $watermark->getSize(); - // if no Point position was given, set its bottom right by default - $pos = $pos === null ? - new Point($size->getWidth() - $wSize->getWidth() , $size->getHeight() - $wSize->getHeight()) - : $pos; + // if x or y position was not given, set its bottom right by default + $pos = $x === null || $y === null + ? new Point($size->getWidth() - $wSize->getWidth() , $size->getHeight() - $wSize->getHeight()) + : new Point($x, $y); return $img->paste($watermark, $pos); } From 6694acd568bc8341036b0a3040973022fc3b4c57 Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sun, 29 Dec 2013 18:32:36 +0100 Subject: [PATCH 08/13] refactor methods to simplify interface --- extensions/yii/imagine/Image.php | 71 ++++++++++++++++++++++++++++-------- extensions/yii/imagine/composer.json | 52 +++++++++++++------------- 2 files changed, 82 insertions(+), 41 deletions(-) diff --git a/extensions/yii/imagine/Image.php b/extensions/yii/imagine/Image.php index 63fc1c0..f5149da 100644 --- a/extensions/yii/imagine/Image.php +++ b/extensions/yii/imagine/Image.php @@ -77,11 +77,11 @@ class Image extends Component private $_imagine; /** * @var string the driver to use. These can be: - * - gd2 - * - imagick - * - gmagick + * - [[DRIVER_GD2]] + * - [[DRIVER_IMAGICK]] + * - [[DRIVER_GMAGICK]] */ - private $_driver = "gd2"; + private $_driver = self::DRIVER_GD2; /** * Sets the driver. @@ -94,7 +94,7 @@ class Image extends Component throw new InvalidConfigException( strtr('"{class}::driver" should be string of these possible options "{drivers}", "{driver}" given.', [ '{class}' => get_class($this), - '{drivers}' => implode(', ', $this->getAvailableDrivers()), + '{drivers}' => implode('", "', $this->getAvailableDrivers()), '{driver}' => $driver ])); } @@ -148,16 +148,36 @@ class Image extends Component * @param string $filename the full path to the image file * @param integer $width the crop width * @param integer $height the crop height - * @param integer $x position on image to crop from. Defaults to 0. - * @param integer $y position on image to crop from. Defaults to 0. + * @param mixed $point. This argument can be both an array or an \Imagine\Image\Point type class, containing both + * `x` and `y` coordinates. For example: + * ~~~ + * // as array + * $obj->crop('path\to\image.jpg', 200, 200, [5, 5]); + * // as \Imagine\Image\Point + * $point = new \Imagine\Image\Point(5, 5); + * $obj->crop('path\to\image.jpg', 200, 200, $point); + * ~~~ * @return \Imagine\Image\ManipulatorInterface + * @throws \InvalidArgumentException */ - public function crop($filename, $width, $height, $x = 0, $y = 0) + public function crop($filename, $width, $height, $point = null) { + if(is_array($point)) { + list($x, $y) = $point; + $point = new Point($x, $y); + } elseif ($point === null) { + $point = new Point(0, 0); + } elseif (!$point instanceof Point ) { + throw new \InvalidArgumentException( + strtr('"{class}::crop()" "$point" if not null, should be an "array" or a "{type}" class type, containing both "x" and "y" coordinates.', [ + '{class}' => get_class($this), + '{type}' => 'Imagine\\Image\\Point' + ])); + } return $this->getImagine() ->open($filename) ->copy() - ->crop(new Point($x, $y), new Box($width, $height)); + ->crop($point, new Box($width, $height)); } /** @@ -207,11 +227,19 @@ class Image extends Component * Note: If any of `$x` or `$y` parameters are null, bottom right position will be default. * @param string $filename the full path to the image file to apply the watermark to * @param string $watermarkFilename the full path to the image file to apply as watermark - * @param integer $x position on image to apply watermark. Defaults to null. - * @param integer $y position on image to apply watermark. Defaults to null + * @param mixed $point. This argument can be both an array or an \Imagine\Image\Point type class, containing both + * `x` and `y` coordinates. For example: + * ~~~ + * // as array + * $obj->watermark('path\to\image.jpg', 'path\to\watermark.jpg', [5, 5]); + * // as \Imagine\Image\Point + * $point = new \Imagine\Image\Point(5, 5); + * $obj->watermark('path\to\image.jpg', 'path\to\watermark.jpg', $point); + * ~~~ * @return ManipulatorInterface + * @throws \InvalidArgumentException */ - public function watermark($filename, $watermarkFilename, $x = null, $y = null) + public function watermark($filename, $watermarkFilename, $point = null) { $img = $this->getImagine()->open($filename); $watermark = $this->getImagine()->open($watermarkFilename); @@ -220,11 +248,22 @@ class Image extends Component $wSize = $watermark->getSize(); // if x or y position was not given, set its bottom right by default - $pos = $x === null || $y === null - ? new Point($size->getWidth() - $wSize->getWidth() , $size->getHeight() - $wSize->getHeight()) - : new Point($x, $y); + if(is_array($point)) { + list($x, $y) = $point; + $point = new Point($x, $y); + } elseif ($point === null) { + $x = $size->getWidth() - $wSize->getWidth(); + $y = $size->getHeight() - $wSize->getHeight(); + $point = new Point($x, $y); + } elseif (!$point instanceof Point) { + throw new \InvalidArgumentException( + strtr('"{class}::watermark()" "$point" if not null, should be an "array" or a "{type}" class type, containing both "x" and "y" coordinates.', [ + '{class}' => get_class($this), + '{type}' => 'Imagine\\Image\\Point' + ])); + } - return $img->paste($watermark, $pos); + return $img->paste($watermark, $point); } /** diff --git a/extensions/yii/imagine/composer.json b/extensions/yii/imagine/composer.json index 10d0056..7cfff10 100644 --- a/extensions/yii/imagine/composer.json +++ b/extensions/yii/imagine/composer.json @@ -1,28 +1,30 @@ { - "name": "yiisoft/yii2-imagine", - "description": "The Imagine integration for the Yii framework", - "keywords": ["yii", "imagine", "image", "helper"], - "type": "yii2-extension", - "license": "BSD-3-Clause", - "support": { - "issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aimagine", - "forum": "http://www.yiiframework.com/forum/", - "wiki": "http://www.yiiframework.com/wiki/", - "irc": "irc://irc.freenode.net/yii", - "source": "https://github.com/yiisoft/yii2" - }, - "authors": [ - { - "name": "Antonio Ramirez", - "email": "amigo.cobos@gmail.com" - } - ], - "require": { - "yiisoft/yii2": "*", + "name": "yiisoft/yii2-imagine", + "description": "The Imagine integration for the Yii framework", + "keywords": ["yii", "imagine", "image", "helper"], + "type": "yii2-extension", + "license": "BSD-3-Clause", + "support": { + "issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aimagine", + "forum": "http://www.yiiframework.com/forum/", + "wiki": "http://www.yiiframework.com/wiki/", + "irc": "irc://irc.freenode.net/yii", + "source": "https://github.com/yiisoft/yii2" + }, + "authors": [ + { + "name": "Antonio Ramirez", + "email": "amigo.cobos@gmail.com" + } + ], + "require": { + "yiisoft/yii2": "*", "imagine/imagine": "v0.5.0" - }, - "autoload": { - "psr-0": { "yii\\imagine\\": "" } - }, - "target-dir": "yii/imagine" + }, + "autoload": { + "psr-0": { + "yii\\imagine\\": "" + } + }, + "target-dir": "yii/imagine" } From 53160797df6edcf8546c35cc0b2e4fe62b575672 Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sun, 29 Dec 2013 21:43:26 +0100 Subject: [PATCH 09/13] added tests --- composer.json | 4 + tests/unit/data/imagine/GothamRnd-Light.otf | Bin 0 -> 131844 bytes tests/unit/data/imagine/large.jpg | Bin 0 -> 26019 bytes tests/unit/data/imagine/xparent.gif | Bin 0 -> 16449 bytes .../unit/extensions/imagine/AbstractImageTest.php | 118 +++++++++++++++++++++ tests/unit/extensions/imagine/ImageGdTest.php | 31 ++++++ tests/unit/extensions/imagine/ImageGmagickTest.php | 30 ++++++ tests/unit/extensions/imagine/ImageImagickTest.php | 30 ++++++ 8 files changed, 213 insertions(+) create mode 100644 tests/unit/data/imagine/GothamRnd-Light.otf create mode 100644 tests/unit/data/imagine/large.jpg create mode 100644 tests/unit/data/imagine/xparent.gif create mode 100644 tests/unit/extensions/imagine/AbstractImageTest.php create mode 100644 tests/unit/extensions/imagine/ImageGdTest.php create mode 100644 tests/unit/extensions/imagine/ImageGmagickTest.php create mode 100644 tests/unit/extensions/imagine/ImageImagickTest.php diff --git a/composer.json b/composer.json index 3af7dd3..9d6f0d2 100644 --- a/composer.json +++ b/composer.json @@ -55,6 +55,7 @@ "yiisoft/yii2-codeception": "self.version", "yiisoft/yii2-debug": "self.version", "yiisoft/yii2-elasticsearch": "self.version", + "yiisoft/yii2-imagine": "self.version", "yiisoft/yii2-gii": "self.version", "yiisoft/yii2-jui": "self.version", "yiisoft/yii2-mongodb": "self.version", @@ -81,6 +82,7 @@ "ext-mongo": ">=1.3.0", "ext-pdo": "*", "ext-pdo_mysql": "*", + "imagine/imagine": "v0.5.0", "smarty/smarty": "*", "swiftmailer/swiftmailer": "*", "twig/twig": "*" @@ -91,6 +93,7 @@ "ext-mongo": "required by yii2-mongo extension", "ext-pdo": "required by yii2-sphinx extension", "ext-pdo_mysql": "required by yii2-sphinx extension", + "imagine/imagine": "required by yii2-imagine extension", "smarty/smarty": "required by yii2-smarty extension", "swiftmailer/swiftmailer": "required by yii2-swiftmailer extension", "twig/twig": "required by yii2-twig extension" @@ -103,6 +106,7 @@ "yii\\debug\\": "extensions/", "yii\\elasticsearch\\": "extensions/", "yii\\gii\\": "extensions/", + "yii\\imagine\\" : "extensions/", "yii\\jui\\": "extensions/", "yii\\mongodb\\": "extensions/", "yii\\redis\\": "extensions/", diff --git a/tests/unit/data/imagine/GothamRnd-Light.otf b/tests/unit/data/imagine/GothamRnd-Light.otf new file mode 100644 index 0000000000000000000000000000000000000000..4181a78d413d03de832466d709aa2dbbeefbf3d1 GIT binary patch literal 131844 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 literal 0 HcmV?d00001 diff --git a/tests/unit/data/imagine/large.jpg b/tests/unit/data/imagine/large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81c47e565bf2871ce10d1b4d0513a9d11e4382a0 GIT binary patch literal 26019 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 bsaIbqKEyagnr9eWEXCbDimageFile = Yii::getAlias('@yiiunit/data/imagine/large') . '.jpg'; + $this->watermarkFile = Yii::getAlias('@yiiunit/data/imagine/xparent') . '.gif'; + $this->runtimeTextFile = Yii::getAlias('@yiiunit/runtime/image-text-test') . '.png'; + $this->runtimeWatermarkFile = Yii::getAlias('@yiiunit/runtime/image-watermark-test') . '.png'; + parent::setUp(); + } + + protected function tearDown() + { + @unlink($this->runtimeTextFile); + @unlink($this->runtimeWatermarkFile); + } + + public function testText() { + if(!$this->isFontTestSupported()) { + $this->markTestSkipped('Skipping ImageGdTest Gd not installed'); + } + + $fontFile = Yii::getAlias('@yiiunit/data/imagine/GothamRnd-Light') . '.otf'; + + $img = $this->image->text($this->imageFile, 'Yii-2 Image', [ + 'font' => $fontFile, + 'size' => 12, + 'color' => '000' + ]); + + $img->save($this->runtimeTextFile); + $this->assertTrue(file_exists($this->runtimeTextFile)); + + } + + public function testCrop() + { + $point = [20,20]; + $img = $this->image->crop($this->imageFile, 100, 100, $point); + + $this->assertEquals(100, $img->getSize()->getWidth()); + $this->assertEquals(100, $img->getSize()->getHeight()); + + $point = new Point(20, 20); + $img = $this->image->crop($this->imageFile, 100, 100, $point); + $this->assertEquals(100, $img->getSize()->getWidth()); + $this->assertEquals(100, $img->getSize()->getHeight()); + + } + + public function testWatermark() + { + $img = $this->image->watermark($this->imageFile, $this->watermarkFile); + $img->save($this->runtimeWatermarkFile); + $this->assertTrue(file_exists($this->runtimeWatermarkFile)); + } + + public function testFrame() + { + $frameSize = 5; + $original = $this->image->getImagine()->open($this->imageFile); + $originalSize = $original->getSize(); + $img = $this->image->frame($this->imageFile, $frameSize, '666', 0); + $size = $img->getSize(); + + $this->assertEquals($size->getWidth(), $originalSize->getWidth() + ($frameSize * 2)); + } + + public function testThumbnail() + { + $img = $this->image->thumbnail($this->imageFile, 120, 120); + + $this->assertEquals(120, $img->getSize()->getWidth()); + $this->assertEquals(120, $img->getSize()->getHeight()); + } + + /** + * @expectedException \yii\base\InvalidConfigException + */ + public function testShouldThrowExceptionOnDriverInvalidArgument() { + $this->image->setDriver('fake-driver'); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testShouldThrowExceptionOnCropInvalidArgument() { + $this->image->crop($this->imageFile, 100, 100, new \stdClass()); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testShouldThrowExceptionOnWatermarkInvalidArgument() { + $this->image->watermark($this->imageFile, $this->watermarkFile, new \stdClass()); + } + + + abstract protected function isFontTestSupported(); +} diff --git a/tests/unit/extensions/imagine/ImageGdTest.php b/tests/unit/extensions/imagine/ImageGdTest.php new file mode 100644 index 0000000..1fa73fb --- /dev/null +++ b/tests/unit/extensions/imagine/ImageGdTest.php @@ -0,0 +1,31 @@ +markTestSkipped('Skipping ImageGdTest, Gd not installed'); + } else { + $this->image = new Image(); + $this->image->setDriver(Image::DRIVER_GD2); + parent::setUp(); + } + } + + protected function isFontTestSupported() + { + $infos = gd_info(); + return isset($infos['FreeType Support']) ? $infos['FreeType Support'] : false; + } + +} \ No newline at end of file diff --git a/tests/unit/extensions/imagine/ImageGmagickTest.php b/tests/unit/extensions/imagine/ImageGmagickTest.php new file mode 100644 index 0000000..3a6daac --- /dev/null +++ b/tests/unit/extensions/imagine/ImageGmagickTest.php @@ -0,0 +1,30 @@ +markTestSkipped('Skipping ImageGmagickTest, Gmagick is not installed'); + } else { + $this->image = new Image(); + $this->image->setDriver(Image::DRIVER_GMAGICK); + parent::setUp(); + } + } + + protected function isFontTestSupported() + { + return true; + } + +} \ No newline at end of file diff --git a/tests/unit/extensions/imagine/ImageImagickTest.php b/tests/unit/extensions/imagine/ImageImagickTest.php new file mode 100644 index 0000000..26b0545 --- /dev/null +++ b/tests/unit/extensions/imagine/ImageImagickTest.php @@ -0,0 +1,30 @@ +markTestSkipped('Skipping ImageImagickTest, Imagick is not installed'); + } else { + $this->image = new Image(); + $this->image->setDriver(Image::DRIVER_IMAGICK); + parent::setUp(); + } + } + + protected function isFontTestSupported() + { + return true; + } + +} \ No newline at end of file From bccac04070c2b1dd72e1c728359f012f06268bf9 Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sun, 29 Dec 2013 21:52:01 +0100 Subject: [PATCH 10/13] added CHANGELOG entry --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 9126e71..7730749 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -22,6 +22,7 @@ Yii Framework 2 Change Log - Bug: Json::encode() did not handle objects that implement JsonSerializable interface correctly (cebe) - Bug: Fixed issue with tabular input on ActiveField::radio() and ActiveField::checkbox() (jom) - Bug: Fixed the issue that query cache returns the same data for the same SQL but different query methods (qiangxue) +- Enh #46: Added Image extension based on [Imagine library](http://imagine.readthedocs.org) (tonydspaniard) - Enh #364: Improve Inflector::slug with `intl` transliteration. Improved transliteration char map. (tonydspaniard) - Enh #797: Added support for validating multiple columns by `UniqueValidator` and `ExistValidator` (qiangxue) - Enh #1293: Replaced Console::showProgress() with a better approach. See Console::startProgress() for details (cebe) From fc28927ddb07ac6535475d4648ac6f8953b3685e Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sun, 29 Dec 2013 21:55:07 +0100 Subject: [PATCH 11/13] fix composer.json syntax --- composer.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 9d6f0d2..8a14611 100644 --- a/composer.json +++ b/composer.json @@ -55,7 +55,7 @@ "yiisoft/yii2-codeception": "self.version", "yiisoft/yii2-debug": "self.version", "yiisoft/yii2-elasticsearch": "self.version", - "yiisoft/yii2-imagine": "self.version", + "yiisoft/yii2-imagine": "self.version", "yiisoft/yii2-gii": "self.version", "yiisoft/yii2-jui": "self.version", "yiisoft/yii2-mongodb": "self.version", @@ -82,7 +82,7 @@ "ext-mongo": ">=1.3.0", "ext-pdo": "*", "ext-pdo_mysql": "*", - "imagine/imagine": "v0.5.0", + "imagine/imagine": "v0.5.0", "smarty/smarty": "*", "swiftmailer/swiftmailer": "*", "twig/twig": "*" @@ -93,7 +93,7 @@ "ext-mongo": "required by yii2-mongo extension", "ext-pdo": "required by yii2-sphinx extension", "ext-pdo_mysql": "required by yii2-sphinx extension", - "imagine/imagine": "required by yii2-imagine extension", + "imagine/imagine": "required by yii2-imagine extension", "smarty/smarty": "required by yii2-smarty extension", "swiftmailer/swiftmailer": "required by yii2-swiftmailer extension", "twig/twig": "required by yii2-twig extension" @@ -106,7 +106,7 @@ "yii\\debug\\": "extensions/", "yii\\elasticsearch\\": "extensions/", "yii\\gii\\": "extensions/", - "yii\\imagine\\" : "extensions/", + "yii\\imagine\\" : "extensions/", "yii\\jui\\": "extensions/", "yii\\mongodb\\": "extensions/", "yii\\redis\\": "extensions/", From 1bde5e0d2777ceca360139a527ff4b14f75af4e3 Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sun, 29 Dec 2013 22:11:35 +0100 Subject: [PATCH 12/13] minor fix on phpDoc --- extensions/yii/imagine/Image.php | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/yii/imagine/Image.php b/extensions/yii/imagine/Image.php index f5149da..6703b59 100644 --- a/extensions/yii/imagine/Image.php +++ b/extensions/yii/imagine/Image.php @@ -157,6 +157,7 @@ class Image extends Component * $point = new \Imagine\Image\Point(5, 5); * $obj->crop('path\to\image.jpg', 200, 200, $point); * ~~~ + * If null, it will crop from 0,0 pixel position * @return \Imagine\Image\ManipulatorInterface * @throws \InvalidArgumentException */ From 52ad66e3fc48c3df02e560280d3638a5947bb53a Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Mon, 30 Dec 2013 21:22:47 +0100 Subject: [PATCH 13/13] added README file --- extensions/yii/imagine/README.md | 70 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 extensions/yii/imagine/README.md diff --git a/extensions/yii/imagine/README.md b/extensions/yii/imagine/README.md new file mode 100644 index 0000000..324c0cd --- /dev/null +++ b/extensions/yii/imagine/README.md @@ -0,0 +1,70 @@ +Image Extension for Yii 2 +============================== + +This extension adds most common image functions and also acts as a wrapper to [Imagine](http://imagine.readthedocs.org/) +image manipulation library. + +Installation +------------ + +The preferred way to install this extension is through [composer](http://getcomposer.org/download/). + +Either run + +``` +php composer.phar require yiisoft/yii2-imagine "*" +``` + +or add + +```json +"yiisoft/yii2-imagine": "*" +``` + +to the `require` section of your composer.json. + + +Usage & Documentation +--------------------- + +This extension is a wrapper to the [Imagine](http://imagine.readthedocs.org/) and also adds the most common methods +used for Image manipulation. + +To use this extension, you can use it in to ways, whether you configure it on your application file or you use it +directly. + +The following shows how to use it via application configuration file: + +``` +// configuring on your application configuration file +'components' => [ + 'image' => [ + 'class' => 'yii\imagine\Image', + 'driver' => \yii\imagine\Image::DRIVER_GD2, + ] + ... +] + +// Once configured you can access to the extension like this: +$img = Yii::$app->image->thumb('path/to/image.jpg', 120, 120); + +``` + +This is how to use it directly: + +``` +use yii\imagine\Image; + +$image = new Image(); +$img = $image->thumb('path/to/image.jpg', 120, 120); +``` +**About the methods** +Each method returns an instance to `\Imagine\Image\ManipulatorInterface`, that means that you can easily make use of the methods included in the `Imagine` library: + +``` +// frame, rotate and save an image + +Yii::$app->image->frame('path/to/image.jpg', 5, '666', 0) + ->rotate(-8) + ->save('path/to/destination/image.jpg', ['quality' => 50]); +``` \ No newline at end of file