diff --git a/src/safeds/data/image/containers/_image.py b/src/safeds/data/image/containers/_image.py index 41309159e..c5f9c2b31 100644 --- a/src/safeds/data/image/containers/_image.py +++ b/src/safeds/data/image/containers/_image.py @@ -6,7 +6,7 @@ from typing import Any, BinaryIO import PIL -from PIL import ImageFilter +from PIL import ImageFilter, ImageOps from PIL.Image import Image as PillowImage from PIL.Image import open as open_image @@ -316,3 +316,24 @@ def blur(self, radius: int = 1) -> Image: new_image = Image(data, self._format) new_image._image = new_image._image.filter(ImageFilter.BoxBlur(radius)) return new_image + + def invert_colors(self) -> Image: + """ + Return the image with inverted colors. + + Returns + ------- + result : Image + The image with inverted colors. + """ + data = io.BytesIO() + repr_png = self._repr_png_() + repr_jpeg = self._repr_jpeg_() + if repr_png is not None: + data = io.BytesIO(repr_png) + elif repr_jpeg is not None: + data = io.BytesIO(repr_jpeg) + + new_image = Image(data, self._format) + new_image._image = ImageOps.invert(new_image._image) + return new_image diff --git a/tests/resources/image/inverted_colors_original.jpg b/tests/resources/image/inverted_colors_original.jpg new file mode 100644 index 000000000..7d23aea98 Binary files /dev/null and b/tests/resources/image/inverted_colors_original.jpg differ diff --git a/tests/resources/image/inverted_colors_original.png b/tests/resources/image/inverted_colors_original.png new file mode 100644 index 000000000..9f69bedb6 Binary files /dev/null and b/tests/resources/image/inverted_colors_original.png differ diff --git a/tests/resources/image/original.jpg b/tests/resources/image/original.jpg new file mode 100644 index 000000000..9a299b37a Binary files /dev/null and b/tests/resources/image/original.jpg differ diff --git a/tests/safeds/data/image/containers/test_image.py b/tests/safeds/data/image/containers/test_image.py index 199892fc7..19ca708f1 100644 --- a/tests/safeds/data/image/containers/test_image.py +++ b/tests/safeds/data/image/containers/test_image.py @@ -265,6 +265,23 @@ def test_should_be_original(self) -> None: assert image == image2 +class TestInvertColors: + def test_should_invert_colors_png(self) -> None: + image = Image.from_png_file(resolve_resource_path("image/original.png")) + image = image.invert_colors() + image2 = Image.from_png_file(resolve_resource_path("image/inverted_colors_original.png")) + assert image == image2 + + def test_should_invert_colors_jpeg(self) -> None: + image = Image.from_jpeg_file(resolve_resource_path("image/original.jpg")) + image = image.invert_colors() + image.to_jpeg_file(resolve_resource_path("image/inverted_colors_original1.jpg")) + image = Image.from_jpeg_file(resolve_resource_path("image/inverted_colors_original1.jpg")) + image2 = Image.from_jpeg_file(resolve_resource_path("image/inverted_colors_original.jpg")) + assert image == image2 + Path.unlink(Path(resolve_resource_path("image/inverted_colors_original1.jpg"))) + + class TestBlur: def test_should_return_blurred_png_image(self) -> None: image = Image.from_png_file(resolve_resource_path("image/boy.png"))