File size: 1,395 Bytes
c9f5fa7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from PIL import Image
from templates import image_template, example_templates

def find_closest_color_idx(color, template_colors):
    return min(enumerate(template_colors), key=lambda template_color: compute_difference(color, template_color[1]))[0]

def compute_difference(color1, color2):
    return abs(color1[0] - color2[0]) + abs(color1[1] - color2[1]) + abs(color1[2] - color2[2])



def replace_colors_by_template(image_template: image_template.ImageTemplate, target_colors: list[tuple[int, int, int]]):
    """Replaces colors in the template image based on the closest color difference. 
    
    Args:
        image_template: ImageTemplate object
        target_colors: List of RGB tuples for the target colors

    Returns:
        PIL Image object
    """
    img = Image.open(image_template.image).convert("RGB")
    pixels = img.load()
    width, height = img.size

    for x in range(width):
        for y in range(height):
            closest_color_idx = find_closest_color_idx(pixels[x, y], image_template.colors)
            pixels[x, y] = target_colors[closest_color_idx]
    return img


# Example usage

if __name__ == "__main__":
    target_colors = [(212,233,225), (46,98,67), (252,254,252)]
    image_template = example_templates.get_three_color_template()
    img = replace_colors_by_template(image_template, target_colors)
    img.save("output/modified_image.jpg")