I’m new to python and just uses sources online to build my code so please bear with me if i dont understand something you are trying to explain to me. so: The output is black jpeg for some reason. is use the Pillow colour package. for my project. My first original code using Python 3.9.10
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")
Then i changed it with three distinct values but still black image output.
here latest code.
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")
If somebody could help me and explain it clearly what is happening and what i do wrong i would aprecciate it.