File indexing completed on 2025-01-26 05:29:14

0001 <?php
0002 
0003 namespace Intervention\Image\Imagick\Commands;
0004 
0005 class MaskCommand extends \Intervention\Image\Commands\AbstractCommand
0006 {
0007     /**
0008      * Applies an alpha mask to an image
0009      *
0010      * @param  \Intervention\Image\Image $image
0011      * @return boolean
0012      */
0013     public function execute($image)
0014     {
0015         $mask_source = $this->argument(0)->value();
0016         $mask_w_alpha = $this->argument(1)->type('bool')->value(false);
0017 
0018         // get imagick
0019         $imagick = $image->getCore();
0020 
0021         // build mask image from source
0022         $mask = $image->getDriver()->init($mask_source);
0023 
0024         // resize mask to size of current image (if necessary)
0025         $image_size = $image->getSize();
0026         if ($mask->getSize() != $image_size) {
0027             $mask->resize($image_size->width, $image_size->height);
0028         }
0029 
0030         $imagick->setImageMatte(true);
0031 
0032         if ($mask_w_alpha) {
0033 
0034             // just mask with alpha map
0035             $imagick->compositeImage($mask->getCore(), \Imagick::COMPOSITE_DSTIN, 0, 0);
0036 
0037         } else {
0038 
0039             // get alpha channel of original as greyscale image
0040             $original_alpha = clone $imagick;
0041             $original_alpha->separateImageChannel(\Imagick::CHANNEL_ALPHA);
0042 
0043             // use red channel from mask ask alpha
0044             $mask_alpha = clone $mask->getCore();
0045             $mask_alpha->compositeImage($mask->getCore(), \Imagick::COMPOSITE_DEFAULT, 0, 0);
0046             // $mask_alpha->setImageAlphaChannel(\Imagick::ALPHACHANNEL_DEACTIVATE);
0047             $mask_alpha->separateImageChannel(\Imagick::CHANNEL_ALL);
0048 
0049             // combine both alphas from original and mask
0050             $original_alpha->compositeImage($mask_alpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);
0051 
0052             // mask the image with the alpha combination
0053             $imagick->compositeImage($original_alpha, \Imagick::COMPOSITE_DSTIN, 0, 0);
0054         }
0055 
0056         return true;
0057     }
0058 }