/**
  * Applies the sepia filter to an image resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     if ($this->offset === 0) {
         return;
     }
     $resource = $aResource->getResource();
     $imagex = imagesx($resource);
     $imagey = imagesy($resource);
     for ($x = 0; $x < $imagex; ++$x) {
         for ($y = 0; $y < $imagey; ++$y) {
             $distx = rand($this->offset * -1, $this->offset);
             $disty = rand($this->offset * -1, $this->offset);
             if ($x + $distx >= $imagex) {
                 continue;
             }
             if ($x + $distx < 0) {
                 continue;
             }
             if ($y + $disty >= $imagey) {
                 continue;
             }
             if ($y + $disty < 0) {
                 continue;
             }
             $oldcol = imagecolorat($resource, $x, $y);
             $newcol = imagecolorat($resource, $x + $distx, $y + $disty);
             imagesetpixel($resource, $x, $y, $newcol);
             imagesetpixel($resource, $x + $distx, $y + $disty, $oldcol);
         }
     }
 }
 /**
  * Applies the sepia filter to an image resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     $dstImg = $aResource->getResource();
     $imgX = $aResource->getX();
     $imgY = $aResource->getY();
     $previous = array("index" => -1, "result" => 0);
     for ($y = 0; $y < $imgY; $y++) {
         for ($x = 0; $x < $imgX; $x++) {
             $dstRGB = imagecolorat($dstImg, $x, $y);
             if ($previous["index"] === $dstRGB) {
                 $newRGB = $previous["result"];
             } else {
                 $dstR = $dstRGB >> 16 & 0xff;
                 $dstG = $dstRGB >> 8 & 0xff;
                 $dstB = $dstRGB & 0xff;
                 $newR = $dstR * 0.393 + $dstG * 0.769 + $dstB * 0.189 - $this->darken;
                 $newG = $dstR * 0.349 + $dstG * 0.6860000000000001 + $dstB * 0.168 - $this->darken;
                 $newB = $dstR * 0.272 + $dstG * 0.534 + $dstB * 0.131 - $this->darken;
                 $newR = $newR > 255 ? 255 : ($newR < 0 ? 0 : $newR);
                 $newG = $newG > 255 ? 255 : ($newG < 0 ? 0 : $newG);
                 $newB = $newB > 255 ? 255 : ($newB < 0 ? 0 : $newB);
                 $newRGB = imagecolorallocate($dstImg, $newR, $newG, $newB);
                 $previous["index"] = $dstRGB;
                 $previous["result"] = $newRGB;
             }
             imagesetpixel($dstImg, $x, $y, $newRGB);
         }
     }
 }
예제 #3
0
 /**
  * Write the resource back to it's owner 
  * @param ImageResource $resource
  * @param Segment $segment
  * @throws ImageResourceException when segment's dimensions do not match resource dimensions
  */
 public function writeSegment(ImageResource $resource, Segment $segment)
 {
     if ($resource->getWidth() !== $segment->getWidth() || $resource->getHeight() !== $segment->getHeight()) {
         throw new ImageResourceException("Dimensions of resource and segment differ");
     }
     imagecopy($this->resource->getResource(), $resource->getResource(), $segment->getCoordinate()->getX(), $segment->getCoordinate()->getY(), 0, 0, $segment->getWidth(), $segment->getHeight());
 }
 /**
  * Applies the sepia filter to an image resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     if ($this->degrees === 0) {
         return;
     }
     $width = $aResource->getX();
     $height = $aResource->getY();
     // cache calculated colors in a map...
     $colorMap = array();
     for ($x = 0; $x < $width; ++$x) {
         for ($y = 0; $y < $height; ++$y) {
             $color = ColorUtil::getColorAt($aResource, Coordinate::create($x, $y));
             if (!isset($colorMap[$color->getColorIndex()])) {
                 // calculate the new color
                 $hsl = ColorUtil::rgb2hsl($color->getRed(), $color->getGreen(), $color->getBlue());
                 $hsl[0] += $this->degrees;
                 $rgb = ColorUtil::hsl2rgb($hsl[0], $hsl[1], $hsl[2]);
                 $newcol = imagecolorallocate($aResource->getResource(), $rgb[0], $rgb[1], $rgb[2]);
                 $colorMap[$color->getColorIndex()] = $newcol;
             } else {
                 $newcol = $colorMap[$color->getColorIndex()];
             }
             imagesetpixel($aResource->getResource(), $x, $y, $newcol);
         }
     }
     $colorMap = null;
 }
 /**
  * (non-PHPdoc)
  * @see \imagemanipulation\filter\IImageFilter::applyFilter()
  */
 public function applyFilter(ImageResource $resource)
 {
     if ($this->radius === 0) {
         return;
     }
     $source_image = $resource->getResource();
     $source_width = $resource->getX();
     $source_height = $resource->getY();
     $corner_image = imagecreatetruecolor($this->radius, $this->radius);
     $clear_colour = imagecolorallocate($corner_image, 0, 0, 0);
     imagecolortransparent($corner_image, $clear_colour);
     $solid_colour = imagecolorallocate($corner_image, $this->color->getRed(), $this->color->getGreen(), $this->color->getBlue());
     imagefill($corner_image, 0, 0, $solid_colour);
     imagefilledellipse($corner_image, $this->radius, $this->radius, $this->radius * 2, $this->radius * 2, $clear_colour);
     /*
      * render the top-left, bottom-left, bottom-right, top-right corners by rotating and copying the mask
      */
     imagecopymerge($source_image, $corner_image, 0, 0, 0, 0, $this->radius, $this->radius, 100);
     $corner_image = imagerotate($corner_image, 90, 0);
     imagecopymerge($source_image, $corner_image, 0, $source_height - $this->radius, 0, 0, $this->radius, $this->radius, 100);
     $corner_image = imagerotate($corner_image, 90, 0);
     imagecopymerge($source_image, $corner_image, $source_width - $this->radius, $source_height - $this->radius, 0, 0, $this->radius, $this->radius, 100);
     $corner_image = imagerotate($corner_image, 90, 0);
     imagecopymerge($source_image, $corner_image, $source_width - $this->radius, 0, 0, 0, $this->radius, $this->radius, 100);
 }
 /**
  * (non-PHPdoc)
  * @see \imagemanipulation\filter\IImageFilter::applyFilter()
  */
 public function applyFilter(ImageResource $aResource)
 {
     $watermarkRes = new ImageImageResource($this->watermark);
     imagealphablending($aResource->getResource(), true);
     imagealphablending($watermarkRes->getResource(), true);
     if ($this->position == 'random') {
         $this->position = rand(1, 8);
     }
     if ($this->watermarkOpacity) {
         $opacityFilter = new ImageFilterOpacity($this->watermarkOpacity);
         $opacityFilter->applyFilter($watermarkRes);
     }
     $destWidth = $aResource->getX();
     $destHeight = $aResource->getY();
     $watermarkWidth = $watermarkRes->getX();
     $watermarkHeight = $watermarkRes->getY();
     switch ($this->position) {
         case 'top-right':
         case 'right-top':
         case 1:
             $result = imagecopy($aResource->getResource(), $watermarkRes->getResource(), $destWidth - $watermarkWidth, 0, 0, 0, $watermarkWidth, $watermarkHeight);
             break;
         case 'top-left':
         case 2:
             $result = imagecopy($aResource->getResource(), $watermarkRes->getResource(), 0, 0, 0, 0, $watermarkWidth, $watermarkHeight);
             break;
         case 'bottom-right':
         case 3:
             $result = imagecopy($aResource->getResource(), $watermarkRes->getResource(), $destWidth - $watermarkWidth, $destHeight - $watermarkHeight, 0, 0, $watermarkWidth, $watermarkHeight);
             break;
         case 'bottom-left':
         case 4:
             $result = imagecopy($aResource->getResource(), $watermarkRes->getResource(), 0, $destHeight - $watermarkHeight, 0, 0, $watermarkWidth, $watermarkHeight);
             break;
         case 'center':
         case 5:
             $result = imagecopy($aResource->getResource(), $watermarkRes->getResource(), $destWidth / 2 - $watermarkWidth / 2, $destHeight / 2 - $watermarkHeight / 2, 0, 0, $watermarkWidth, $watermarkHeight);
             break;
         case 'top':
         case 6:
             $result = imagecopy($aResource->getResource(), $watermarkRes->getResource(), $destWidth / 2 - $watermarkWidth / 2, 0, 0, 0, $watermarkWidth, $watermarkHeight);
             break;
         case 'bottom':
         case 7:
             $result = imagecopy($aResource->getResource(), $watermarkRes->getResource(), $destWidth / 2 - $watermarkWidth / 2, $destHeight - $watermarkHeight, 0, 0, $watermarkWidth, $watermarkHeight);
             break;
         case 'left':
         case 8:
             $result = imagecopy($aResource->getResource(), $watermarkRes->getResource(), 0, $destHeight / 2 - $watermarkHeight / 2, 0, 0, $watermarkWidth, $watermarkHeight);
             break;
         case 'right':
         case 9:
             $result = imagecopy($aResource->getResource(), $watermarkRes->getResource(), $destWidth - $watermarkWidth, $destHeight / 2 - $watermarkHeight / 2, 0, 0, $watermarkWidth, $watermarkHeight);
             break;
             imagedestroy($watermarkRes->getResource());
             if (!$result) {
                 throw new \Exception('Applying watermark failed');
             }
     }
 }
 /**
  * Applies the filter to the resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     $width = $aResource->getX();
     $height = $aResource->getY();
     $lineRes = imagecreatetruecolor($width, 1);
     $bgc = imagecolorallocatealpha($lineRes, $this->backgroundColor->getRed(), $this->backgroundColor->getGreen(), $this->backgroundColor->getBlue(), $this->backgroundColor->getAlpha());
     // Background color
     imagefilledrectangle($lineRes, 0, 0, $width, 1, $bgc);
     $rotateFilter = new ImageFilterRotate(180, $this->backgroundColor);
     $rotateFilter->applyFilter($aResource);
     $bg = imagecreatetruecolor($width, $this->height);
     imagecopyresampled($bg, $aResource->getResource(), 0, 0, 0, 0, $width, $height, $width, $height);
     $im = $bg;
     $bg = imagecreatetruecolor($width, $this->height);
     for ($x = 0; $x < $width; $x++) {
         imagecopy($bg, $im, $x, 0, $width - $x, 0, 1, $this->height);
     }
     $im = $bg;
     $in = 100 / $this->height;
     for ($i = 0; $i <= $this->height; $i++) {
         imagecopymerge($im, $lineRes, 0, $i, 0, 0, $width, 1, $this->startOpacity);
         if ($this->startOpacity < 100) {
             $this->startOpacity += $in;
         }
     }
     imagecopymerge($im, $lineRes, 0, 0, 0, 0, $width, $this->divLineHeight, 100);
     // Divider
     $aResource->setResource($im);
 }
 /**
  * Tests ImageResource->setResource()
  */
 public function testSetResourceFail()
 {
     try {
         $this->res->setResource(false);
         $this->fail('Expected an exception');
     } catch (ImageResourceException $ex) {
     }
 }
 /**
  * (non-PHPdoc)
  * @see \imagemanipulation\filter\IImageFilter::applyFilter()
  */
 public function applyFilter(ImageResource $aResource)
 {
     $resource = $aResource->getResource();
     $imagex = $aResource->getX();
     $imagey = $aResource->getY();
     for ($x = 0; $x < $imagex; $x += $this->blocksize) {
         for ($y = 0; $y < $imagey; $y += $this->blocksize) {
             // get the pixel colour at the top-left of the square
             $thiscol = imagecolorat($resource, $x, $y);
             // set the new red, green, and blue values to 0
             $newr = 0;
             $newg = 0;
             $newb = 0;
             // create an empty array for the colours
             $colours = array();
             // cycle through each pixel in the block
             for ($k = $x; $k < $x + $this->blocksize; ++$k) {
                 for ($l = $y; $l < $y + $this->blocksize; ++$l) {
                     // if we are outside the valid bounds of the image, use a safe colour
                     if ($k < 0) {
                         $colours[] = $thiscol;
                         continue;
                     }
                     if ($k >= $imagex) {
                         $colours[] = $thiscol;
                         continue;
                     }
                     if ($l < 0) {
                         $colours[] = $thiscol;
                         continue;
                     }
                     if ($l >= $imagey) {
                         $colours[] = $thiscol;
                         continue;
                     }
                     // if not outside the image bounds, get the colour at this pixel
                     $colours[] = imagecolorat($resource, $k, $l);
                 }
             }
             // cycle through all the colours we can use for sampling
             foreach ($colours as $colour) {
                 // add their red, green, and blue values to our master numbers
                 $newr += $colour >> 16 & 0xff;
                 $newg += $colour >> 8 & 0xff;
                 $newb += $colour & 0xff;
             }
             // now divide the master numbers by the number of valid samples to get an average
             $numelements = count($colours);
             $newr /= $numelements;
             $newg /= $numelements;
             $newb /= $numelements;
             // and use the new numbers as our colour
             $newcol = imagecolorallocate($resource, $newr, $newg, $newb);
             imagefilledrectangle($resource, $x, $y, $x + $this->blocksize - 1, $y + $this->blocksize - 1, $newcol);
         }
     }
 }
예제 #10
0
 /**
  * Create a new image with specified width, height and color
  * 
  * @param int $width The new image width in pixels
  * @param int $height The new image height in pixels
  * @param Color $color The new image color
  * 
  * @return \imagemanipulation\ImageResource
  */
 public static function create($width, $height, Color $color)
 {
     Args::int($width, 'width')->required()->min(1);
     Args::int($height, 'height')->required()->min(1);
     $res = new ImageResource(imagecreatetruecolor($width, $height));
     $color = ImageUtil::allocateColor($res->getResource(), $color);
     imagefill($res->getResource(), 0, 0, $color);
     $res->saveAlpha();
     return $res;
 }
 /**
  * Applies the filter to the resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     $width = $aResource->getX();
     $height = $aResource->getY();
     $blockImg = imagecreate(1, 1);
     imagecolorallocatealpha($blockImg, $this->blockColor->getRed(), $this->blockColor->getGreen(), $this->blockColor->getBlue(), $this->blockColor->getAlpha());
     for ($i = 0; $i <= $this->nrOfBlocks; $i++) {
         $xPos = rand(0, $width - $this->blockSize - 1);
         $yPos = rand(0, $height - $this->blockSize - 1);
         imagecopy($aResource->getResource(), $blockImg, $xPos, $yPos, $xPos, $yPos, $this->blockSize, $this->blockSize);
     }
 }
 /**
  * Applies the filter to the resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     //comic effect
     $width = $aResource->getX();
     $height = $aResource->getY();
     /* @var $imgK \imagemanipulation\ImageResource */
     $imgK = $aResource->cloneResource();
     $trueColorFilter = new ImageFilterTrueColor('ffffff', '000000');
     $trueColorFilter->applyFilter($imgK);
     imagecopymerge($aResource->getResource(), $imgK->getResource(), 0, 0, 0, 0, $width, $height, $this->opacity);
     imagedestroy($imgK->getResource());
 }
 /**
  * Applies the filter to the image resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     $function = 'imageflip';
     if (function_exists($function)) {
         $function($aResource->getResource(), $this->getMode());
     } else {
         $width = $aResource->getX();
         $height = $aResource->getY();
         $dest = imagecreatetruecolor($width, $height);
         imagealphablending($dest, false);
         imagesavealpha($dest, true);
         switch ($this->getMode()) {
             case self::FLIP_VERTICALLY:
                 $this->flipVertically($dest, $aResource->getResource(), $height, $width);
                 break;
             case self::FLIP_HORIZONTALLY:
                 $this->flipHorizontally($dest, $aResource->getResource(), $height, $width);
                 break;
             case self::FLIP_BOTH:
                 $this->flipVertically($dest, $aResource->getResource(), $height, $width);
                 $copy = imagecreatetruecolor($width, $height);
                 imagecopy($copy, $dest, 0, 0, 0, 0, $width, $height);
                 $this->flipHorizontally($dest, $copy, $height, $width);
                 break;
         }
         $aResource->setResource($dest);
     }
 }
 /**
  * Applies the filter to the resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     $this->width = $aResource->getX();
     $this->height = $aResource->getY();
     $im = $aResource->getResource();
     for ($x = 0; $x < $this->width; ++$x) {
         for ($y = 0; $y < $this->height; ++$y) {
             $index = imagecolorat($im, $x, $y);
             $rgb = imagecolorsforindex($im, $index);
             $this->vignetteToPixel($x, $y, $rgb);
             $color = imagecolorallocate($im, $rgb['red'], $rgb['green'], $rgb['blue']);
             imagesetpixel($im, $x, $y, $color);
         }
     }
 }
 /**
  * Applies the filter to the resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     $dest = $aResource->getResource();
     if (imageistruecolor($dest)) {
         imagetruecolortopalette($dest, false, 256);
     }
     foreach ($this->search as $search) {
         $searchRgb = new Color($search);
         $index = imagecolorclosest($aResource->getResource(), $searchRgb->getRed(), $searchRgb->getGreen(), $searchRgb->getBlue());
         // get White COlor
         imagecolorset($aResource->getResource(), $index, $this->replace->getRed(), $this->replace->getGreen(), $this->replace->getBlue());
         // SET NEW COLOR
     }
     $aResource->setResource($dest);
 }
 /**
  * Applies the filter to the image resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     if ($this->angle == 0 || $this->angle == 360) {
         return;
     }
     imageantialias($aResource->getResource(), true);
     $aResource->setResource(imagerotate($aResource->getResource(), $this->angle, $this->bgColor->getColorIndex(), $this->bgColor->getAlpha()));
     $new_imgres = imagecreatetruecolor($aResource->getX(), $aResource->getY());
     $success = imagecopy($new_imgres, $aResource->getResource(), 0, 0, 0, 0, $aResource->getX(), $aResource->getY());
     if (!$success) {
         throw new FilterException(self::$filterType);
     }
     imagedestroy($new_imgres);
 }
예제 #17
0
 /**
  * Applies the filter to the image resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     if ($this->percentage == 0) {
         return;
         // percentage = 0, do nothing !
     }
     $resource = $aResource->getResource();
     $rgb = 0;
     $d = array();
     $s = array();
     $dstx = 0;
     $dsty = 0;
     $dest = imagecreatetruecolor($aResource->getX(), $aResource->getY());
     for ($i = 0; $i < $aResource->getY(); $i++) {
         for ($j = 0; $j < $aResource->getX(); $j++) {
             $rgb = imagecolorat($dest, $dstx + $j, $dsty + $i);
             $d[0] = $rgb >> 16 & 0xff;
             $d[1] = $rgb >> 8 & 0xff;
             $d[2] = $rgb & 0xff;
             $rgb = imagecolorat($aResource->getResource(), $j, $i);
             $s[0] = $rgb >> 16 & 0xff;
             $s[1] = $rgb >> 8 & 0xff;
             $s[2] = $rgb & 0xff;
             $d[0] += min($s[0], 0xff - $d[0]) * $this->percentage / 100;
             $d[1] += min($s[1], 0xff - $d[1]) * $this->percentage / 100;
             $d[2] += min($s[2], 0xff - $d[2]) * $this->percentage / 100;
             imagesetpixel($resource, $dstx + $j, $dsty + $i, imagecolorallocate($resource, $d[0], $d[1], $d[2]));
         }
     }
 }
 /**
  * Tests ImageResource->setResource()
  */
 public function testSetResourceFail()
 {
     try {
         $this->res->setResource(false);
         $this->fail('Expected an exception');
     } catch (ImageResourceException $ex) {
         $this->assertNotNull($ex->getMessage());
     }
 }
예제 #19
0
 /**
  * (non-PHPdoc)
  * @see \imagemanipulation\filter\IImageFilter::applyFilter()
  */
 public function applyFilter(ImageResource $aResource)
 {
     if ($this->noise === 0) {
         return;
     }
     $resource = $aResource->getResource();
     $imagex = $aResource->getX();
     $imagey = $aResource->getY();
     for ($x = 0; $x < $imagex; ++$x) {
         for ($y = 0; $y < $imagey; ++$y) {
             if (rand(0, 1)) {
                 $rgb = imagecolorat($resource, $x, $y);
                 $red = $rgb >> 16 & 0xff;
                 $green = $rgb >> 8 & 0xff;
                 $blue = $rgb & 0xff;
                 $modifier = rand($this->noise * -1, $this->noise);
                 $red += $modifier;
                 $green += $modifier;
                 $blue += $modifier;
                 if ($red > 255) {
                     $red = 255;
                 }
                 if ($green > 255) {
                     $green = 255;
                 }
                 if ($blue > 255) {
                     $blue = 255;
                 }
                 if ($red < 0) {
                     $red = 0;
                 }
                 if ($green < 0) {
                     $green = 0;
                 }
                 if ($blue < 0) {
                     $blue = 0;
                 }
                 $newcol = imagecolorallocate($resource, $red, $green, $blue);
                 imagesetpixel($resource, $x, $y, $newcol);
             }
         }
     }
 }
 public function applyFilter(ImageResource $aResource)
 {
     $x = $aResource->getX();
     $y = $aResource->getY();
     $resource = $aResource->getResource();
     // Create a new image
     $ip = imagecreatetruecolor($x, $y);
     // Loop through the whole height of the image
     for ($i = 0; $i < $y; $i++) {
         // Loop through the whole width of the image
         for ($j = 0; $j < $x; $j++) {
             // Get the pixel color ( $this->img->x - 1 needs to be there because of the imagestart @ 0,0 ;) )
             $c = imagecolorat($resource, $x - 1 - $j, $i);
             // Get the rgb values from color $c
             $r = $c >> 16 & 0xff;
             $g = $c >> 8 & 0xff;
             $b = $c & 0xff;
             // Set the color
             $clr = imagecolorallocate($ip, $r, $g, $b);
             // Set the pixel color in the new image
             imagesetpixel($ip, $j, $i, $clr);
         }
     }
     $aResource->setResource(imagecreatetruecolor($x, $y));
     imagecopy($aResource->getResource(), $ip, 0, 0, 0, 0, $x, $y);
 }
 /**
  * Applies the filter to the resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     $width = $aResource->getWidth();
     $height = $aResource->getHeight();
     $lineRes = imagecreatetruecolor($width, 1);
     $bgc = imagecolorallocatealpha($lineRes, $this->backgroundColor->getRed(), $this->backgroundColor->getGreen(), $this->backgroundColor->getBlue(), $this->backgroundColor->getAlpha());
     // Background color
     imagefilledrectangle($lineRes, 0, 0, $width, 1, $bgc);
     $rotated = $aResource->cloneResource();
     $rotateFilter = new ImageFilterRotate(180, $this->backgroundColor);
     $rotateFilter->applyFilter($rotated);
     $bg = imagecreatetruecolor($width, $this->height);
     imagecopyresampled($bg, $rotated->getResource(), 0, 0, 0, 0, $width, $height, $width, $height);
     $im = $bg;
     $bg = imagecreatetruecolor($width, $this->height);
     for ($x = 0; $x < $width; $x++) {
         imagecopy($bg, $im, $x, 0, $width - $x, 0, 1, $this->height);
     }
     $im = $bg;
     $in = 100 / $this->height;
     for ($i = 0; $i <= $this->height; $i++) {
         imagecopymerge($im, $lineRes, 0, $i, 0, 0, $width, 1, $this->startOpacity);
         if ($this->startOpacity < 100) {
             $this->startOpacity += $in;
         }
     }
     imagecopymerge($im, $lineRes, 0, 0, 0, 0, $width, $this->divLineHeight, 100);
     // Divider
     if ($this->includeOriginal) {
         // we need to include the original
         $mergeWidth = imagesx($im) + $aResource->getWidth();
         $mergeHeight = imagesy($im) + $aResource->getHeight();
         $imMerge = imagecreatetruecolor($width, $mergeHeight);
         imagecopy($imMerge, $aResource->getResource(), 0, 0, 0, 0, $width, $height);
         imagecopy($imMerge, $im, 0, $aResource->getHeight(), 0, 0, $width, $height);
         $aResource->setResource($imMerge);
     } else {
         $aResource->setResource($im);
     }
 }
 /**
  * Applies the sepia filter to an image resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     $dstImg = $aResource->getResource();
     $imgX = $aResource->getX();
     $imgY = $aResource->getY();
     for ($y = 0; $y < $imgY; $y++) {
         for ($x = 0; $x < $imgX; $x++) {
             $dstRGB = imagecolorat($dstImg, $x, $y);
             //$dstA = ($dstRGB >> 24) << 1;
             $dstR = $dstRGB >> 16 & 0xff;
             $dstG = $dstRGB >> 8 & 0xff;
             $dstB = $dstRGB & 0xff;
             $newR = $dstR * 0.393 + $dstG * 0.769 + $dstB * 0.189 - $this->darken;
             $newG = $dstR * 0.349 + $dstG * 0.6860000000000001 + $dstB * 0.168 - $this->darken;
             $newB = $dstR * 0.272 + $dstG * 0.534 + $dstB * 0.131 - $this->darken;
             $newR = $newR > 255 ? 255 : ($newR < 0 ? 0 : $newR);
             $newG = $newG > 255 ? 255 : ($newG < 0 ? 0 : $newG);
             $newB = $newB > 255 ? 255 : ($newB < 0 ? 0 : $newB);
             $newRGB = imagecolorallocate($dstImg, $newR, $newG, $newB);
             imagesetpixel($dstImg, $x, $y, $newRGB);
         }
     }
 }
 /**
  * Applies the sepia filter to an image resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     if ($this->red === 0 && $this->green === 0 && $this->blue === 0) {
         return;
     }
     $res = $aResource->getResource();
     $width = $aResource->getX();
     $height = $aResource->getY();
     for ($y = 0; $y < $height; $y++) {
         for ($x = 0; $x < $width; $x++) {
             $colorIndex = imagecolorat($res, $x, $y);
             $dstA = $colorIndex >> 24 << 1;
             $dstR = $colorIndex >> 16 & 0xff;
             $dstG = $colorIndex >> 8 & 0xff;
             $dstB = $colorIndex & 0xff;
             $newR = min(255, $this->red + $dstR);
             $newG = min(255, $this->green + $dstG);
             $newB = min(255, $this->blue + $dstB);
             $newColor = imagecolorallocatealpha($res, $newR, $newG, $newB, $dstA);
             imagesetpixel($res, $x, $y, $newColor);
         }
     }
 }
예제 #24
0
 /**
  * Create the thumbnail
  *
  * @param $aResource ImageResource The image resource of the original image
  *       
  * @return ImageResource The image resource of the thumbnail
  */
 public function create(ImageResource $aResource)
 {
     // The original PHP image resource
     $origImgRes = $aResource->getResource();
     // Create a new image resource
     $newResource = clone $aResource;
     $this->strategy->init($aResource);
     $originalBegin = $this->strategy->getSourceBegin($newResource);
     $originalEnd = $this->strategy->getSourceEnd($newResource);
     $targetBegin = $this->strategy->getDestinationBegin($aResource);
     $targetEnd = $this->strategy->getDestinationEnd($newResource);
     // no change, return original
     if ($originalBegin == $targetBegin && $originalEnd == $targetEnd) {
         return $aResource;
     }
     $aResource->setResource(imagecreatetruecolor($targetEnd->getX(), $targetEnd->getY()));
     imagecolortransparent($aResource->getResource(), imagecolorallocate($newResource->getResource(), 0, 0, 0));
     imagealphablending($aResource->getResource(), false);
     imageantialias($aResource->getResource(), true);
     imagecopyresampled($aResource->getResource(), $newResource->getResource(), $targetBegin->getX(), $targetBegin->getY(), $originalBegin->getX(), $originalBegin->getY(), $targetEnd->getX(), $targetEnd->getY(), $originalEnd->getX(), $originalEnd->getY());
     $aResource->setResource($aResource->getResource());
     $newResource->destroy();
     return $aResource;
 }
 /**
  * Applies the filter to the resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     //comic effect
     $width = $aResource->getX();
     $height = $aResource->getY();
     $imgK = imagecreatetruecolor($width, $height);
     $lowR = $this->lowcolor->getRed();
     $lowG = $this->lowcolor->getGreen();
     $lowB = $this->lowcolor->getBlue();
     $highR = $this->highcolor->getRed();
     $highG = $this->highcolor->getGreen();
     $highB = $this->highcolor->getBlue();
     for ($y = 0; $y < $height; $y++) {
         for ($x = 0; $x < $width; $x++) {
             $rgb = imagecolorat($aResource->getResource(), $x, $y);
             $r = $rgb >> 16 & 0xff;
             $g = $rgb >> 8 & 0xff;
             $b = $rgb & 0xff;
             $bw = $r + $g + $b > 300 ? imagecolorallocate($imgK, $lowR, $lowG, $lowB) : imagecolorallocate($imgK, $highR, $highG, $highB);
             imagesetpixel($imgK, $x, $y, $bw);
         }
     }
     $aResource->setResource($imgK);
 }
 /**
  * (non-PHPdoc)
  * @see \imagemanipulation\filter\IImageFilter::applyFilter()
  */
 public function applyFilter(ImageResource $aResource)
 {
     $placeholder = imagecreatetruecolor($aResource->getX(), $aResource->getY());
     imagealphablending($placeholder, false);
     imagesavealpha($placeholder, true);
     $destWidth = $this->fill ? $aResource->getX() : $this->overlay->getX();
     $destHeight = $this->fill ? $aResource->getY() : $this->overlay->getY();
     imagecopyresized($placeholder, $this->overlay->getResource(), 0, 0, 0, 0, $destWidth, $destHeight, $this->overlay->getX(), $this->overlay->getY());
     imagecopymerge($aResource->getResource(), $placeholder, $this->startX, $this->startY, 0, 0, $destWidth, $destHeight, $this->opacity);
 }
 /**
  * (non-PHPdoc)
  * @see \imagemanipulation\filter\IImageFilter::applyFilter()
  */
 public function applyFilter(ImageResource $aResource)
 {
     $destWidth = $this->fill ? $aResource->getX() : $this->overlay->getX();
     $destHeight = $this->fill ? $aResource->getY() : $this->overlay->getY();
     imagealphablending($this->overlay->getResource(), false);
     imagesavealpha($this->overlay->getResource(), false);
     imagecopyresized($this->overlay->getResource(), $this->overlay->getResource(), 0, 0, 0, 0, $destWidth, $destHeight, $this->overlay->getX(), $this->overlay->getY());
     imagealphablending($aResource->getResource(), true);
     imagesavealpha($aResource->getResource(), true);
     imagecopyresampled($aResource->getResource(), $this->overlay->getResource(), $this->startX, $this->startY, 0, 0, $destWidth, $destHeight, $destWidth, $destHeight);
 }
 /**
  * Applies the filter to the resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     if (!isset($this->opacity)) {
         return;
     }
     $this->opacity /= 100;
     //get image width and height
     $w = $aResource->getX();
     $h = $aResource->getY();
     //turn alpha blending off
     imagealphablending($aResource->getResource(), false);
     //find the most opaque pixel in the image (the one with the smallest alpha value)
     $minalpha = 127;
     for ($x = 0; $x < $w; $x++) {
         for ($y = 0; $y < $h; $y++) {
             $alpha = imagecolorat($aResource->getResource(), $x, $y) >> 24 & 0xff;
             if ($alpha < $minalpha) {
                 $minalpha = $alpha;
             }
         }
     }
     //loop through image pixels and modify alpha for each
     for ($x = 0; $x < $w; $x++) {
         for ($y = 0; $y < $h; $y++) {
             //get current alpha value (represents the TANSPARENCY!)
             $colorxy = imagecolorat($aResource->getResource(), $x, $y);
             $alpha = $colorxy >> 24 & 0xff;
             //calculate new alpha
             if ($minalpha !== 127) {
                 $alpha = 127 + 127 * $this->opacity * ($alpha - 127) / (127 - $minalpha);
             } else {
                 $alpha += 127 * $this->opacity;
             }
             //get the color index with new alpha
             $alphacolorxy = imagecolorallocatealpha($aResource->getResource(), $colorxy >> 16 & 0xff, $colorxy >> 8 & 0xff, $colorxy & 0xff, $alpha);
             //set pixel with the new color + opacity
             if (!imagesetpixel($aResource->getResource(), $x, $y, $alphacolorxy)) {
                 return;
             }
         }
     }
 }
 /**
  * Applies the filter to the resource
  *
  * @param ImageResource $aResource
  */
 public function applyFilter(ImageResource $aResource)
 {
     $orig_time_limit = ini_get('max_execution_time');
     set_time_limit(180);
     // creating the image
     $starting_img = $aResource->getResource();
     // this will be the final image, same width and height of the original
     $final = imagecreatetruecolor($aResource->getX(), $aResource->getY());
     // looping through ALL pixels!!
     for ($x = 1; $x < $aResource->getX() - 1; $x++) {
         for ($y = 1; $y < $aResource->getY() - 1; $y++) {
             // getting gray value of all surrounding pixels
             $pixel_up = $this->getLuminance(imagecolorat($starting_img, $x, $y - 1));
             $pixel_down = $this->getLuminance(imagecolorat($starting_img, $x, $y + 1));
             $pixel_left = $this->getLuminance(imagecolorat($starting_img, $x - 1, $y));
             $pixel_right = $this->getLuminance(imagecolorat($starting_img, $x + 1, $y));
             $pixel_up_left = $this->getLuminance(imagecolorat($starting_img, $x - 1, $y - 1));
             $pixel_up_right = $this->getLuminance(imagecolorat($starting_img, $x + 1, $y - 1));
             $pixel_down_left = $this->getLuminance(imagecolorat($starting_img, $x - 1, $y + 1));
             $pixel_down_right = $this->getLuminance(imagecolorat($starting_img, $x + 1, $y + 1));
             // appliying convolution mask
             $conv_x = $pixel_up_right + $pixel_right * 2 + $pixel_down_right - ($pixel_up_left + $pixel_left * 2 + $pixel_down_left);
             $conv_y = $pixel_up_left + $pixel_up * 2 + $pixel_up_right - ($pixel_down_left + $pixel_down * 2 + $pixel_down_right);
             // calculating the distance
             $gray = (int) sqrt($conv_x * $conv_x + $conv_y + $conv_y);
             // inverting the distance not to get the negative image
             $gray = 255 - $gray;
             // adjusting distance if it's greater than 255 or less than zero (out of color range)
             if ($gray > 255) {
                 $gray = 255;
             }
             if ($gray < 0) {
                 $gray = 0;
             }
             // creation of the new gray
             $new_gray = imagecolorallocate($final, $gray, $gray, $gray);
             // adding the gray pixel to the new image
             imagesetpixel($final, $x, $y, $new_gray);
         }
     }
     imagedestroy($starting_img);
     $aResource->setResource($final);
     set_time_limit($orig_time_limit);
 }
 public function applyFilter(ImageResource $aResource)
 {
     imagefilter($aResource->getResource(), IMG_FILTER_MEAN_REMOVAL);
 }