Pixel art converteren met aco file.
Heb een aco file van 184 kleuren maar ik wil een script maken dat python er enkel maar 10 van mag gebruiken. De output blijft zwart (de jpeg die geconverteerd is)
...
Python 3.9.10 met package "Pillow colour"
...
Iemand heeft gezegd dat ik dit moest doen!
Dat heb ik gedaan volgens mij
...
Zie eerste code hier:
Zie aangepaste code:
Het fijt dat ik nog maar net begonnen ben en nog nieuw ben is het voormij wel nog wat zoeken als je een oplossing zou hebben laat het me weten en probeer het zo goed mogelijk uit te leggen dat zou me al heel erg helpen.
Heb een aco file van 184 kleuren maar ik wil een script maken dat python er enkel maar 10 van mag gebruiken. De output blijft zwart (de jpeg die geconverteerd is)
...
Python 3.9.10 met package "Pillow colour"
...
Iemand heeft gezegd dat ik dit moest doen!
.three distinct values (zie laatste code)
Dat heb ik gedaan volgens mij
...
Zie eerste code hier:
Python:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
| from PIL import Image from struct import unpack def read_aco_file(filepath): with open(filepath, "rb") as f: # Lees de eerste 4 bytes om te controleren op de juiste versie version = unpack(">H", f.read(2))[0] if version != 1: raise ValueError("Ongeldige ACO-versie") # Lees het aantal kleuren num_colors = unpack(">H", f.read(2))[0] # Lees alle kleuren colors = [] for i in range(num_colors): # Lees de kleurwaarden r, g, b = unpack(">HHH", f.read(6)) # Voeg de kleur toe aan de lijst colors.append((r, g, b)) return colors def find_closest_colors(base_color, all_colors, num_colors=10): # Bereken de Euclidische afstand tussen de base_color en alle kleuren in all_colors distances = [] for color in all_colors: distance = ((color[0] - base_color[0])**2 + (color[1] - base_color[1])**2 + (color[2] - base_color[2])**2)**0.5 distances.append(distance) # Sorteer de kleuren op basis van hun afstand tot de base_color en selecteer de num_colors dichtstbijzijnde kleuren sorted_colors = [x for _, x in sorted(zip(distances, all_colors))] closest_colors = sorted_colors[:num_colors] return closest_colors # Geef het pad naar het aco-bestand op aco_path = "Test.aco" # Lees het bestand all_colors = read_aco_file(aco_path) # Geef het pad naar de afbeelding op image_path = "iron golem2.jpg" # Open de afbeelding image = Image.open(image_path) # Converteer de afbeelding naar RGB-indeling image_rgb = image.convert("RGB") # Bereken het totale aantal pixels in de afbeelding total_pixels = image_rgb.width * image_rgb.height # Houd bij hoeveel pixels er zijn verwerkt processed_pixels = 0 # Loop over elke pixel in de afbeelding, vind de 10 dichtstbijzijnde kleuren en kies er een uit selected_colors = [] for y in range(image_rgb.height): for x in range(image_rgb.width): # Vind de 10 dichtstbijzijnde kleuren base_color = image_rgb.getpixel((x, y)) closest_colors = find_closest_colors(base_color, all_colors, num_colors=10) # Kies de eerste kleur uit de lijst van de 10 dichtstbijzijnde kleuren selected_color = closest_colors[0] selected_colors.append(selected_color) # Houd bij hoeveel pixels er zijn verwerkt en bereken het percentage voltooiing processed_pixels += 1 progress_percent = round(processed_pixels / total_pixels * 100, 2) print(f"{progress_percent}% voltooid", end="<\r") # Maak een nieuwe afbeelding met de geconverteerde pixels image_converted = Image.new("RGB", image_rgb.size) image_converted.putdata(selected_colors) # Geef het pad naar het bestand op waarin je de afbeelding wilt opslaan output_path = "converted_image.jpg" # Sla de afbeelding op als JPEG-bestand image_converted.save(output_path, format="JPEG") |
Zie aangepaste code:
Python:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
| from PIL import Image from struct import unpack def read_aco_file(filepath): with open(filepath, "rb") as f: # Lees de eerste 4 bytes om te controleren op de juiste versie version = unpack(">H", f.read(2))[0] if version != 1: raise ValueError("Ongeldige ACO-versie") # Lees het aantal kleuren num_colors = unpack(">H", f.read(2))[0] # Lees alle kleuren colors = [] for i in range(num_colors): # Lees de kleurwaarden r, g, b = unpack(">HHH", f.read(6)) # Voeg de kleur toe aan de lijst colors.append((r, g, b)) return colors def find_closest_colors(base_color, all_colors, num_colors=10): # Bereken de Euclidische afstand tussen de base_color en alle kleuren in all_colors distances = [] for color in all_colors: distance_r = color[0] - base_color[0] distance_g = color[1] - base_color[1] distance_b = color[2] - base_color[2] distances.append((distance_r, distance_g, distance_b)) # Sorteer de kleuren op basis van hun afstand tot de base_color en selecteer de num_colors dichtstbijzijnde kleuren sorted_colors = [x for _, x in sorted(zip(distances, all_colors), key=lambda pair: sum([abs(x) for x in pair[0]]))] closest_colors = sorted_colors[:num_colors] return closest_colors # Geef het pad naar het aco-bestand op aco_path = "Test.aco" # Lees het bestand all_colors = read_aco_file(aco_path) # Geef het pad naar de afbeelding op image_path = "iron golem2.jpg" # Open de afbeelding image = Image.open(image_path) # Converteer de afbeelding naar RGB-indeling image_rgb = image.convert("RGB") # Bereken het totale aantal pixels in de afbeelding total_pixels = image_rgb.width * image_rgb.height # Houd bij hoeveel pixels er zijn verwerkt processed_pixels = 0 # Loop over elke pixel in de afbeelding, vind de 10 dichtstbijzijnde kleuren en kies er een uit selected_colors = [] for y in range(image_rgb.height): for x in range(image_rgb.width): # Vind de 10 dichtstbijzijnde kleuren base_color = image_rgb.getpixel((x, y)) closest_colors = find_closest_colors(base_color, all_colors, num_colors=10) # Kies de eerste kleur uit de lijst van de 10 dichtstbijzijnde kleuren selected_color = closest_colors[0] selected_colors.append(selected_color) # Houd bij hoeveel pixels er zijn verwerkt en bereken het percentage voltooiing processed_pixels += 1 progress_percent = round(processed_pixels / total_pixels * 100, 2) print(f"{progress_percent}% voltooid", end="<\r") # Maak een nieuwe afbeelding met de geconverteerde pixels image_converted = Image.new("RGB", image_rgb.size) image_converted.putdata(selected_colors) # Geef het pad naar het bestand op waarin je de afbeelding wilt opslaan output_path = "converted_image.jpg" # Sla de afbeelding op als JPEG-bestand image_converted.save(output_path, format="JPEG") |
Het fijt dat ik nog maar net begonnen ben en nog nieuw ben is het voormij wel nog wat zoeken als je een oplossing zou hebben laat het me weten en probeer het zo goed mogelijk uit te leggen dat zou me al heel erg helpen.
[ Voor 0% gewijzigd door RobIII op 20-03-2023 15:53 . Reden: Python syntax highlighting toegevoegd ]