diff --git a/src/Drivers/Abstract/AbstractImage.php b/src/Drivers/Abstract/AbstractImage.php index 9efd6857..75994f5b 100644 --- a/src/Drivers/Abstract/AbstractImage.php +++ b/src/Drivers/Abstract/AbstractImage.php @@ -138,6 +138,13 @@ public function gamma(float $gamma): ImageInterface ); } + public function colorize(int $red = 0, int $green = 0, int $blue = 0): ImageInterface + { + return $this->modify( + $this->resolveDriverClass('Modifiers\ColorizeModifier', $red, $green, $blue) + ); + } + public function blur(int $amount = 5): ImageInterface { return $this->modify( diff --git a/src/Drivers/Gd/Modifiers/ColorizeModifier.php b/src/Drivers/Gd/Modifiers/ColorizeModifier.php new file mode 100644 index 00000000..6a55f245 --- /dev/null +++ b/src/Drivers/Gd/Modifiers/ColorizeModifier.php @@ -0,0 +1,31 @@ +red * 2.55); + $green = round($this->green * 2.55); + $blue = round($this->blue * 2.55); + + foreach ($image as $frame) { + imagefilter($frame->core(), IMG_FILTER_COLORIZE, $red, $green, $blue); + } + + return $image; + } +} diff --git a/src/Drivers/Imagick/Modifiers/ColorizeModifier.php b/src/Drivers/Imagick/Modifiers/ColorizeModifier.php new file mode 100644 index 00000000..3cf3302b --- /dev/null +++ b/src/Drivers/Imagick/Modifiers/ColorizeModifier.php @@ -0,0 +1,40 @@ +normalizeLevel($this->red); + $green = $this->normalizeLevel($this->green); + $blue = $this->normalizeLevel($this->blue); + + foreach ($image as $frame) { + $qrange = $frame->core()->getQuantumRange(); + $frame->core()->levelImage(0, $red, $qrange['quantumRangeLong'], Imagick::CHANNEL_RED); + $frame->core()->levelImage(0, $green, $qrange['quantumRangeLong'], Imagick::CHANNEL_GREEN); + $frame->core()->levelImage(0, $blue, $qrange['quantumRangeLong'], Imagick::CHANNEL_BLUE); + } + + return $image; + } + + private function normalizeLevel(int $level): int + { + return $level > 0 ? $level / 5 : ($level + 100) / 100; + } +} diff --git a/src/Interfaces/ImageInterface.php b/src/Interfaces/ImageInterface.php index 9797f2f3..b04e4f0c 100644 --- a/src/Interfaces/ImageInterface.php +++ b/src/Interfaces/ImageInterface.php @@ -218,6 +218,46 @@ public function text(string $text, int $x, int $y, ?callable $init = null): Imag */ public function greyscale(): ImageInterface; + /** + * Invert the colors of the current image + * + * @return ImageInterface + */ + public function invert(): ImageInterface; + + /** + * Adjust brightness of the current image + * + * @param int $level + * @return ImageInterface + */ + public function brightness(int $level): ImageInterface; + + /** + * Adjust contrast of the current image + * + * @param int $level + * @return ImageInterface + */ + public function contrast(int $level): ImageInterface; + + /** + * Apply gamma correction on the current image + * + * @param float $gamma + * @return ImageInterface + */ + public function gamma(float $gamma): ImageInterface; + + /** + * Adjust the intensity of the RGB color channels + * + * @param int $red + * @param int $green + * @param int $blue + * @return ImageInterface + */ + public function colorize(int $red = 0, int $green = 0, int $blue = 0): ImageInterface; /** * Blur current image by given strength diff --git a/tests/Drivers/Gd/Modifiers/ColorizeModifierTest.php b/tests/Drivers/Gd/Modifiers/ColorizeModifierTest.php new file mode 100644 index 00000000..16bb1146 --- /dev/null +++ b/tests/Drivers/Gd/Modifiers/ColorizeModifierTest.php @@ -0,0 +1,24 @@ +createTestImage('tile.png'); + $image = $image->modify(new ColorizeModifier(100, -100, -100)); + $this->assertColor(255, 0, 0, 255, $image->pickColor(5, 5)); + $this->assertColor(255, 0, 0, 255, $image->pickColor(15, 15)); + } +} diff --git a/tests/Drivers/Imagick/Modifiers/ColorizeModifierTest.php b/tests/Drivers/Imagick/Modifiers/ColorizeModifierTest.php new file mode 100644 index 00000000..df7f0b71 --- /dev/null +++ b/tests/Drivers/Imagick/Modifiers/ColorizeModifierTest.php @@ -0,0 +1,24 @@ +createTestImage('tile.png'); + $image = $image->modify(new ColorizeModifier(100, -100, -100)); + $this->assertColor(251, 0, 0, 255, $image->pickColor(5, 5)); + $this->assertColor(239, 0, 0, 255, $image->pickColor(15, 15)); + } +}