Pixel art converteren met aco file

Pagina: 1
Acties:
  • 342 views

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Xmaster1004
  • Registratie: Maart 2023
  • Laatst online: 20-03-2023
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!
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 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 14:54

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Sorry, dit is niet de bedoeling hier. Het is niet de bedoeling dat je hier dik 150 regels code in een topic gooit en dat wij dan mogen gissen of gaan zoeken naar 't probleem. Dat mag je écht zelf doen. We kunnen je wél in de juiste richting wijzen als je concrete vragen stelt (en dus niet "dit is mijn code, wat is er mis?"). Dus: wat heb je zelf al gezocht en gevonden? Want die vragen die er staan wanneer je hier een nieuw topic opent staan er niet voor niets ;)
Mijn vraag
...

Relevante software en hardware die ik gebruik
...

Wat ik al gevonden of geprobeerd heb
...
Ik verzoek je vriendelijk onze Quickstart door te nemen en 't dan, mocht dat nog nodig zijn, een nieuw topic te openen met voorgenoemde zaken in acht genomen. Wanneer je code plaatst, plaats dan relevante(!) stukjes code - hele scripts van tientallen regels is dus niet de bedoeling.

[ Voor 6% gewijzigd door RobIII op 20-03-2023 15:54 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Dit topic is gesloten.