private function _applyImageEffects($imageInstance, $effects)
{
// apply effects in the order they were entered
foreach ($effects as $effect => $value) {
$effect = mb_strtolower($effect);
if ($effect == 'grayscale' || $effect == 'greyscale') {
// we do not participate in that quarrel
$imageInstance->effects()->grayscale();
}
if ($effect == 'negative') {
$imageInstance->effects()->negative();
}
if ($effect == 'blur') {
$imageInstance->effects()->blur(is_int($value) || is_float($value) ? $value : 1);
}
if ($effect == 'sharpen') {
$imageInstance->effects()->sharpen();
}
if ($effect == 'gamma') {
$imageInstance->effects()->gamma(is_int($value) || is_float($value) ? $value : 1);
}
if ($effect == 'colorize') {
$color = $imageInstance->palette()->color($value);
$imageInstance->effects()->colorize($color);
}
/**
* Effects that are imagick only. Will be ignored if GD is used
*/
if ($this->imageDriver == 'imagick') {
$imagickInstance = $imageInstance->getImagick();
// colorBlend is almost like colorize, but works with alpha and use blend modes.
if ($effect == 'colorblend') {
if (is_array($value)) {
if (count($value) > 1) {
$this->_colorBlend($imagickInstance, $value[0], $value[1]);
} else {
$this->_colorBlend($imagickInstance, $value[0], 1);
}
} else {
$this->_colorBlend($imagickInstance, $value, 1);
}
}
// sepia, just because it's there.
if ($effect == 'sepia') {
$imagickInstance->sepiaToneImage($value);
}
// tint
if ($effect == 'tint' && is_array($value)) {
$tint = new \ImagickPixel($value[0]);
$opacity = new \ImagickPixel($value[1]);
$imagickInstance->tintImage($tint, $opacity);
}
// contrast
if ($effect == 'contrast') {
if (is_int($value)) {
for ($i = 0; $i < abs($value); $i++) {
if ($value > 0) {
$imagickInstance->contrastImage(true);
} else {
$imagickInstance->contrastImage(false);
}
}
} else {
$imagickInstance->contrastImage($value);
}
}
// modulate
if ($effect == 'modulate' && is_array($value) && count($value) == 3) {
$imagickInstance->modulateImage($value[0], $value[1], $value[2]);
}
// normalize
if ($effect == 'normalize') {
$imagickInstance->normalizeImage();
}
// contrast stretch
if ($effect == 'contraststretch' && is_array($value) && count($value) >= 2) {
$imagickInstance->contrastStretchImage($value[0], $value[1]);
}
// posterize
if ($effect == 'posterize' && is_array($value) && count($value) == 2) {
$imagickInstance->posterizeImage($value[0], isset(ImagerService::$ditherKeyTranslate[$value[1]]) ? ImagerService::$ditherKeyTranslate[$value[1]] : \Imagick::DITHERMETHOD_NO);
}
// unsharpMask
if ($effect == 'unsharpmask' && is_array($value) && count($value) == 4) {
$imagickInstance->unsharpMaskImage($value[0], $value[1], $value[2], $value[3]);
}
// vignette
// todo : make a better vignette
if ($effect == 'vignette' && is_array($value) && count($value) >= 3) {
$this->_vignette($imagickInstance, $value[0], $value[1], $value[2]);
}
// custom filter
if ($effect == 'customfilter') {
$this->_applyCustomFilter($imagickInstance, $value);
}
}
}
}