/** * Rotates image counter clockwise * * @param \Intervention\Image\Image $image * @return boolean */ public function execute($image) { $angle = $this->argument(0)->type('numeric')->required()->value(); $color = $this->argument(1)->value(); $color = new Color($color); // rotate image $image->getCore()->rotateImage($color->getPixel(), $angle * -1); return true; }
/** * Draw current instance of line to given endpoint on given image * * @param Image $image * @param integer $x * @param integer $y * @return boolean */ public function applyToImage(Image $image, $x = 0, $y = 0) { $line = new \ImagickDraw(); $color = new Color($this->color); $line->setStrokeColor($color->getPixel()); $line->setStrokeWidth($this->width); $line->line($this->x, $this->y, $x, $y); $image->getCore()->drawImage($line); return true; }
/** * Read color information from a certain position * * @param \Intervention\Image\Image $image * @return boolean */ public function execute($image) { $x = $this->argument(0)->type('digit')->required()->value(); $y = $this->argument(1)->type('digit')->required()->value(); $format = $this->argument(2)->type('string')->value('array'); // pick color $color = new Color($image->getCore()->getImagePixelColor($x, $y)); // format to output $this->setOutput($color->format($format)); return true; }
/** * Creates new image instance * * @param integer $width * @param integer $height * @param string $background * @return \Intervention\Image\Image */ public function newImage($width, $height, $background = null) { $background = new Color($background); // create empty core $core = new \Imagick(); $core->newImage($width, $height, $background->getPixel(), 'png'); $core->setType(\Imagick::IMGTYPE_UNDEFINED); $core->setImagetype(\Imagick::IMGTYPE_UNDEFINED); $core->setColorspace(\Imagick::COLORSPACE_UNDEFINED); // build image $image = new \Intervention\Image\Image(new self(), $core); return $image; }
/** * Draws one pixel to a given image * * @param Intervention\Image\Image $image * @return boolean */ public function execute($image) { $color = $this->argument(0)->required()->value(); $color = new Color($color); $x = $this->argument(1)->type('integer')->required()->value(); $y = $this->argument(2)->type('integer')->required()->value(); // prepare pixel $draw = new \ImagickDraw(); $draw->setFillColor($color->getPixel()); $draw->point($x, $y); // apply pixel return $image->getCore()->drawImage($draw); }
/** * Draw rectangle to given image at certain position * * @param Image $image * @param integer $x * @param integer $y * @return boolean */ public function applyToImage(Image $image, $x = 0, $y = 0) { $rectangle = new \ImagickDraw(); // set background $bgcolor = new Color($this->background); $rectangle->setFillColor($bgcolor->getPixel()); // set border if ($this->hasBorder()) { $border_color = new Color($this->border_color); $rectangle->setStrokeWidth($this->border_width); $rectangle->setStrokeColor($border_color->getPixel()); } $rectangle->rectangle($this->x1, $this->y1, $this->x2, $this->y2); $image->getCore()->drawImage($rectangle); return true; }
/** * Draw polygon on given image * * @param Image $image * @param integer $x * @param integer $y * @return boolean */ public function applyToImage(Image $image, $x = 0, $y = 0) { $polygon = new \ImagickDraw(); // set background $bgcolor = new Color($this->background); $polygon->setFillColor($bgcolor->getPixel()); // set border if ($this->hasBorder()) { $border_color = new Color($this->border_color); $polygon->setStrokeWidth($this->border_width); $polygon->setStrokeColor($border_color->getPixel()); } $polygon->polygon($this->points); $image->getCore()->drawImage($polygon); return true; }
/** * Draw ellipse instance on given image * * @param Image $image * @param integer $x * @param integer $y * @return boolean */ public function applyToImage(Image $image, $x = 0, $y = 0) { $circle = new \ImagickDraw(); // set background $bgcolor = new Color($this->background); $circle->setFillColor($bgcolor->getPixel()); // set border if ($this->hasBorder()) { $border_color = new Color($this->border_color); $circle->setStrokeWidth($this->border_width); $circle->setStrokeColor($border_color->getPixel()); } $circle->ellipse($x, $y, $this->width / 2, $this->height / 2, 0, 360); $image->getCore()->drawImage($circle); return true; }
/** * Draws font to given image at given position * * @param Image $image * @param integer $posx * @param integer $posy * @return void */ public function applyToImage(Image $image, $posx = 0, $posy = 0) { // build draw object $draw = new \ImagickDraw(); $draw->setStrokeAntialias(true); $draw->setTextAntialias(true); // set font file if ($this->hasApplicableFontFile()) { $draw->setFont($this->file); } else { throw new \Intervention\Image\Exception\RuntimeException("Font file must be provided to apply text to image."); } // parse text color $color = new Color($this->color); $draw->setFontSize($this->size); $draw->setFillColor($color->getPixel()); // align horizontal switch (strtolower($this->align)) { case 'center': $align = \Imagick::ALIGN_CENTER; break; case 'right': $align = \Imagick::ALIGN_RIGHT; break; default: $align = \Imagick::ALIGN_LEFT; break; } $draw->setTextAlignment($align); // align vertical if (strtolower($this->valign) != 'bottom') { // calculate box size $dimensions = $image->getCore()->queryFontMetrics($draw, $this->text); // corrections on y-position switch (strtolower($this->valign)) { case 'center': case 'middle': $posy = $posy + $dimensions['textHeight'] * 0.65 / 2; break; case 'top': $posy = $posy + $dimensions['textHeight'] * 0.65; break; } } // apply to image $image->getCore()->annotateImage($draw, $posx, $posy, $this->angle * -1, $this->text); }
/** * Fills image with color or pattern * * @param \Intervention\Image\Image $image * @return boolean */ public function execute($image) { $filling = $this->argument(0)->value(); $x = $this->argument(1)->type('digit')->value(); $y = $this->argument(2)->type('digit')->value(); $imagick = $image->getCore(); try { // set image filling $source = new Decoder(); $filling = $source->init($filling); } catch (\Intervention\Image\Exception\NotReadableException $e) { // set solid color filling $filling = new Color($filling); } // flood fill if coordinates are set if (is_int($x) && is_int($y)) { // flood fill with texture if ($filling instanceof Image) { // create tile $tile = clone $image->getCore(); // mask away color at position $tile->transparentPaintImage($tile->getImagePixelColor($x, $y), 0, 0, false); // create canvas $canvas = clone $image->getCore(); // fill canvas with texture $canvas = $canvas->textureImage($filling->getCore()); // merge canvas and tile $canvas->compositeImage($tile, \Imagick::COMPOSITE_DEFAULT, 0, 0); // replace image core $image->setCore($canvas); // flood fill with color } elseif ($filling instanceof Color) { // create canvas with filling $canvas = new \Imagick(); $canvas->newImage($image->getWidth(), $image->getHeight(), $filling->getPixel(), 'png'); // create tile to put on top $tile = clone $image->getCore(); // mask away color at pos. $tile->transparentPaintImage($tile->getImagePixelColor($x, $y), 0, 0, false); // save alpha channel of original image $alpha = clone $image->getCore(); // merge original with canvas and tile $image->getCore()->compositeImage($canvas, \Imagick::COMPOSITE_DEFAULT, 0, 0); $image->getCore()->compositeImage($tile, \Imagick::COMPOSITE_DEFAULT, 0, 0); // restore alpha channel of original image $image->getCore()->compositeImage($alpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); } } else { if ($filling instanceof Image) { // fill whole image with texture $image->setCore($image->getCore()->textureImage($filling->getCore())); } elseif ($filling instanceof Color) { // fill whole image with color $draw = new \ImagickDraw(); $draw->setFillColor($filling->getPixel()); $draw->rectangle(0, 0, $image->getWidth(), $image->getHeight()); $image->getCore()->drawImage($draw); } } return true; }
/** * Draws font to given image at given position * * @param Image $image * @param integer $posx * @param integer $posy * @return void */ public function applyToImage(Image $image, $posx = 0, $posy = 0) { $draw = new \ImagickDraw(); if ($this->hasApplicableFontFile()) { $draw->setStrokeAntialias(true); $draw->setTextAntialias(true); // font file $draw->setFont($this->file); // font size $draw->setFontSize($this->size); // parse text color $color = new Color($this->color); $draw->setFillColor($color->getPixel()); } else { throw new \Intervention\Image\Exception\RuntimeException("Font file must be provided to apply text to image."); } // format text $text = $this->format(); // box size $box = $this->isBoxed() ? $this->box : $this->getBoxSize($text); // create empty canvas $canvas = $image->getDriver()->newImage($box->getWidth() + self::PADDING * 2, $box->getHeight() + self::PADDING * 2)->getCore(); $lines = $this->getLines($text); $baseline = $this->getCoreBoxSize($lines[0]); $box->align(sprintf('%s-%s', $this->align, 'top')); $ystart = 0; if ($this->isBoxed()) { switch (strtolower($this->valign)) { case 'bottom': $ystart = $box->getHeight() - $this->getBoxSize($text)->getHeight(); break; case 'center': case 'middle': $ystart = ($box->getHeight() - $this->getBoxSize($text)->getHeight()) / 2; break; } } // write line by line foreach ($lines as $count => $line) { $linesize = $this->getCoreBoxSize(trim($line)); $relative = $box->relativePosition($linesize->align($this->align)); // write line of text $canvas->annotateImage($draw, self::PADDING + $relative->x, self::PADDING + $ystart + $baseline->getHeight() + $count * $this->lineHeight * $this->size * 1.5, 0, trim($line)); } // valign switch (strtolower($this->valign)) { case 'top': # nothing to do... break; case 'center': case 'middle': $box->pivot->moveY($box->getHeight() / 2); break; case 'bottom': $box->pivot->moveY($box->getHeight()); break; default: case 'baseline': $box->pivot->moveY($baseline->getHeight()); break; } if ($this->isBoxed()) { $box->align('top-left'); } // rotate canvas if ($this->angle != 0) { $canvas->rotateImage(new \ImagickPixel('none'), $this->angle * -1); $box->rotate($this->angle); } // insert canvas foreach ($image as $frame) { $frame->getCore()->compositeImage($canvas, \Imagick::COMPOSITE_DEFAULT, $posx - $box->pivot->x - self::PADDING, $posy - $box->pivot->y - self::PADDING); } }
public function testDiffers() { $c1 = new Color(array(0, 0, 0)); $c2 = new Color(array(0, 0, 0)); $this->assertEquals(false, $c1->differs($c2)); $c1 = new Color(array(1, 0, 0)); $c2 = new Color(array(0, 0, 0)); $this->assertEquals(true, $c1->differs($c2)); $c1 = new Color(array(1, 0, 0)); $c2 = new Color(array(0, 0, 0)); $this->assertEquals(false, $c1->differs($c2, 10)); $c1 = new Color(array(127, 127, 127)); $c2 = new Color(array(0, 0, 0)); $this->assertEquals(true, $c1->differs($c2, 49)); $c1 = new Color(array(127, 127, 127)); $c2 = new Color(array(0, 0, 0)); $this->assertEquals(false, $c1->differs($c2, 50)); }