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 }