forked from jaildesigner-jailgames/jaildoctors_dilemma
- afegides noves paletes
- ordenades les paletes que tenien els color mal ubicats - eliminades responsabilitats a Options sobre les paletes - "pretty" name per a les paletes (canvia els "-" per " ") - nova tool/ en python per a reordenar paletes
This commit is contained in:
125
tools/sort_palette/sort_palette.py
Normal file
125
tools/sort_palette/sort_palette.py
Normal file
@@ -0,0 +1,125 @@
|
||||
import sys
|
||||
import math
|
||||
import tempfile
|
||||
import os
|
||||
|
||||
# ------------------------------
|
||||
# Utilidades de color
|
||||
# ------------------------------
|
||||
|
||||
def luminosidad(rgb):
|
||||
r, g, b = rgb
|
||||
return 0.2126*r + 0.7152*g + 0.0722*b
|
||||
|
||||
def distancia_rgb(c1, c2):
|
||||
return math.sqrt(
|
||||
(c1[0] - c2[0])**2 +
|
||||
(c1[1] - c2[1])**2 +
|
||||
(c1[2] - c2[2])**2
|
||||
)
|
||||
|
||||
# Paleta ZX Spectrum
|
||||
PALETA_SPECTRUM = [
|
||||
(0, 0, 0),
|
||||
(0, 0, 0),
|
||||
(0, 0, 216),
|
||||
(0, 0, 255),
|
||||
(216, 0, 0),
|
||||
(255, 0, 0),
|
||||
(216, 0, 216),
|
||||
(255, 0, 255),
|
||||
(0, 216, 0),
|
||||
(0, 255, 0),
|
||||
(0, 216, 216),
|
||||
(0, 255, 255),
|
||||
(216, 216, 0),
|
||||
(255, 255, 0),
|
||||
(216, 216, 216),
|
||||
(255, 255, 255),
|
||||
]
|
||||
|
||||
# ------------------------------
|
||||
# Lectura / escritura JASC-PAL
|
||||
# ------------------------------
|
||||
|
||||
def leer_paleta_jasc(ruta):
|
||||
with open(ruta, "r") as f:
|
||||
lineas = [l.strip() for l in f.readlines()]
|
||||
|
||||
if lineas[0] != "JASC-PAL":
|
||||
raise ValueError("El fichero no es un JASC-PAL válido")
|
||||
|
||||
num_colores = int(lineas[2])
|
||||
colores = []
|
||||
|
||||
for i in range(num_colores):
|
||||
r, g, b = map(int, lineas[3 + i].split())
|
||||
colores.append((r, g, b))
|
||||
|
||||
return colores
|
||||
|
||||
def guardar_paleta_jasc(ruta, colores):
|
||||
with open(ruta, "w") as f:
|
||||
f.write("JASC-PAL\n")
|
||||
f.write("0100\n")
|
||||
f.write(f"{len(colores)}\n")
|
||||
for r, g, b in colores:
|
||||
f.write(f"{r} {g} {b}\n")
|
||||
|
||||
# ------------------------------
|
||||
# Métodos de ordenación
|
||||
# ------------------------------
|
||||
|
||||
def ordenar_por_luminosidad(colores):
|
||||
return sorted(colores, key=luminosidad)
|
||||
|
||||
def ordenar_por_similitud_spectrum(colores):
|
||||
colores_disponibles = colores.copy()
|
||||
resultado = []
|
||||
|
||||
for ref in PALETA_SPECTRUM:
|
||||
mejor = min(colores_disponibles, key=lambda c: distancia_rgb(c, ref))
|
||||
resultado.append(mejor)
|
||||
colores_disponibles.remove(mejor)
|
||||
|
||||
return resultado
|
||||
|
||||
# ------------------------------
|
||||
# Main
|
||||
# ------------------------------
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 4:
|
||||
print("Uso: python ordenar_paleta.py entrada.pal salida.pal [luminosidad|spectrum]")
|
||||
return
|
||||
|
||||
entrada = sys.argv[1]
|
||||
salida = sys.argv[2]
|
||||
modo = sys.argv[3].lower()
|
||||
|
||||
colores = leer_paleta_jasc(entrada)
|
||||
|
||||
if modo == "luminosidad":
|
||||
colores_ordenados = ordenar_por_luminosidad(colores)
|
||||
elif modo == "spectrum":
|
||||
colores_ordenados = ordenar_por_similitud_spectrum(colores)
|
||||
else:
|
||||
print(f"Modo desconocido: {modo}")
|
||||
print("Modos disponibles: luminosidad, spectrum")
|
||||
return
|
||||
|
||||
# Si salida == entrada, sobrescribimos de forma segura
|
||||
if entrada == salida:
|
||||
# Guardamos primero en un temporal para evitar corrupción si algo falla
|
||||
with tempfile.NamedTemporaryFile(delete=False) as tmp:
|
||||
temp_path = tmp.name
|
||||
guardar_paleta_jasc(temp_path, colores_ordenados)
|
||||
os.replace(temp_path, entrada)
|
||||
print(f"Paleta sobrescrita ({modo}) en {entrada}")
|
||||
else:
|
||||
guardar_paleta_jasc(salida, colores_ordenados)
|
||||
print(f"Paleta ordenada ({modo}) guardada en {salida}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user