Skip to content

Commit 2cbee36

Browse files
feat: added color adjustment feature (#409)
Closes #380 ### Summary of Changes Added the color adjustment feature analogous to the previous image tasks. --------- Co-authored-by: megalinter-bot <[email protected]>
1 parent dab6419 commit 2cbee36

File tree

5 files changed

+89
-0
lines changed

5 files changed

+89
-0
lines changed

src/safeds/data/image/containers/_image.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,36 @@ def adjust_contrast(self, factor: float) -> Image:
334334
image_copy._image = ImageEnhance.Contrast(image_copy._image).enhance(factor)
335335
return image_copy
336336

337+
def adjust_color_balance(self, factor: float) -> Image:
338+
"""
339+
Adjust the image's color balance.
340+
341+
Parameters
342+
----------
343+
factor: float
344+
If factor > 1, increase color balance of image.
345+
If factor = 1, no changes will be made.
346+
If factor < 1, make image greyer.
347+
Has to be bigger than or equal to 0.
348+
349+
Returns
350+
-------
351+
image: Image
352+
The new, adjusted image.
353+
"""
354+
if factor < 0:
355+
raise ValueError("Color factor has to be 0 or bigger.")
356+
elif factor == 1:
357+
warnings.warn(
358+
"Color adjustment factor is 1.0, this will not make changes to the image.",
359+
UserWarning,
360+
stacklevel=2,
361+
)
362+
363+
image_copy = copy.deepcopy(self)
364+
image_copy._image = ImageEnhance.Color(image_copy._image).enhance(factor)
365+
return image_copy
366+
337367
def blur(self, radius: int) -> Image:
338368
"""
339369
Return the blurred image.
8.02 KB
Loading
8.01 KB
Loading
7.99 KB
Loading

tests/safeds/data/image/containers/test_image.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,65 @@ def test_should_invert_colors(self, image: Image, expected: Image) -> None:
324324
assert image == expected
325325

326326

327+
class TestColorAdjust:
328+
@pytest.mark.parametrize(
329+
("image", "factor", "expected"),
330+
[
331+
(
332+
Image.from_png_file(resolve_resource_path("image/original.png")),
333+
2,
334+
Image.from_png_file(resolve_resource_path("image/adjusted_colors/by_2.png")),
335+
),
336+
(
337+
Image.from_png_file(resolve_resource_path("image/original.png")),
338+
0.5,
339+
Image.from_png_file(resolve_resource_path("image/adjusted_colors/by_0.5.png")),
340+
),
341+
(
342+
Image.from_png_file(resolve_resource_path("image/original.png")),
343+
0,
344+
Image.from_png_file(resolve_resource_path("image/adjusted_colors/by_0.png")),
345+
),
346+
],
347+
ids=["add color", "remove color", "remove all color"],
348+
)
349+
def test_should_adjust_colors(self, image: Image, factor: float, expected: Image) -> None:
350+
image = image.adjust_color_balance(factor)
351+
assert image == expected
352+
353+
@pytest.mark.parametrize(
354+
("image", "factor"),
355+
[
356+
(
357+
Image.from_png_file(resolve_resource_path("image/original.png")),
358+
-1,
359+
),
360+
],
361+
ids=["negative"],
362+
)
363+
def test_should_throw(self, image: Image, factor: float) -> None:
364+
with pytest.raises(ValueError, match="Color factor has to be 0 or bigger."):
365+
image.adjust_color_balance(factor)
366+
367+
@pytest.mark.parametrize(
368+
("image", "factor"),
369+
[
370+
(
371+
Image.from_png_file(resolve_resource_path("image/original.png")),
372+
1,
373+
),
374+
],
375+
ids=["no change"],
376+
)
377+
def test_should_warn(self, image: Image, factor: float) -> None:
378+
with pytest.warns(
379+
UserWarning,
380+
match="Color adjustment factor is 1.0, this will not make changes to the image.",
381+
):
382+
adjust = image.adjust_color_balance(factor)
383+
assert adjust == image
384+
385+
327386
class TestBlur:
328387
@pytest.mark.parametrize(
329388
("image", "expected"),

0 commit comments

Comments
 (0)