Hier mal ein Stück Python-Code, das eigentlich tauglich sein sollte (mangels Daten habe ich es aber nicht getestet). Es berechnet den Abstand zweier Farben im RGB-Raum und "rundet" die alten Pixel auf die am besten passende neue Farbe.
Man müsste nur die Paletten im passenden Format einfügen und das ganze sollte laufen. Ich nehme an, dass man den Code auch leicht für andere Sprachen anpassen könnte; bis auf die sum()-Funktion steckt da eigentlich nichts besonderes drin.
PS: Der Code ist natürlich ziemlich schlicht, es wird für jeden Pixel einmal über die komplette neue Palette iteriert (bei 1024 Pixeln und 64 Paletten-Einträgen sollte das aber noch immer nicht soo lange dauern.)
Code:
input_file = "schick.bin" # Roh-Daten eines Bildes; e.g. [0, 1, 2, 2, 1, 0, 0, 2]
output_file = "riva.bin"
palette_1 = [] # alte Palette; e.g. [[255, 0, 0], [0, 255, 0], [0, 0, 255]]
palette_2 = [] # neue Palette; e.g. [[255, 0, 0], [0, 255, 0], [0, 0, 255]]
data = open(input_file, "rb"):
raw = data.read()
# jeden Pixel mit am besten passender neuer Farbe ersetzen
for x in range(len(raw)):
rgb_1 = palette_1[raw[x]] # alte Farbe
optimum_index = None
optimum_distance = None
# beste Farbe finden, indem kleinster Farb-Abstand berechnet wird
for y in range(len(palette_2)):
rgb_2 = palette_2[y]
# quadrierten Vektor-Abstand berechnen
distance = sum([(x - y)**2 for (x, y) in zip(rgb_1, rgb_2)])
if optimum_distance is None or optimum_distance > distance:
optimum_distance = distance
optimum_index = y
elif optimum_distance == distance and palette_2[optimum_index] != rgb_2:
# Ausgabe wenn der Abstand zu zwei Farben identisch ist
print("Ambiguous colours detected for pixel %s: %s and %s" % (x, palette_2[optimum_index], rgb_2) )
raw[x] = optimum_index
# konvertiertes Bild liegt in 'raw' vor
with open (output_file, "wb") as data:
data.write(bytearray(raw))
Man müsste nur die Paletten im passenden Format einfügen und das ganze sollte laufen. Ich nehme an, dass man den Code auch leicht für andere Sprachen anpassen könnte; bis auf die sum()-Funktion steckt da eigentlich nichts besonderes drin.
PS: Der Code ist natürlich ziemlich schlicht, es wird für jeden Pixel einmal über die komplette neue Palette iteriert (bei 1024 Pixeln und 64 Paletten-Einträgen sollte das aber noch immer nicht soo lange dauern.)
NLT-Spielstandskonverter - konvertiert Spielstände zwischen beliebigen Teilen der Nordlandtrilogie
(alternativer Link)
Gravis Ultrasound+Sternenschweif
Battletech? MechWarrior: Living Legends! (Trailer)
(alternativer Link)
Gravis Ultrasound+Sternenschweif
Battletech? MechWarrior: Living Legends! (Trailer)