Files
fn_registry/python/functions/ml/comfyui_pixelize_image.md
T
egutierrez 10dbc510b7 feat(ml): LoRAs con prefijo de arquitectura (SD15_/SDXL_/FLUX_) + refs actualizadas
Mueve el indicador de arquitectura del SUFIJO al PREFIJO del nombre de cada
LoRA para que el dropdown del LoraLoader muestre de inmediato que LoRA casa con
que checkpoint (evita el shape mismatch SD1.5 vs SDXL que crashea ComfyUI).

- 20 LoRAs renombradas en disco (15 SD15/SDXL en /mnt/2tb, 5 FLUX en ~/ComfyUI),
  mapa de reversion en ~/ComfyUI/models/loras/_rename_map.json.
- Refs actualizadas en builders gamedev-2d, style presets, pipelines, tests y
  docs/capabilities. Defaults hardcodeados (pixel-art, lcm-lora, etc.) apuntan a
  los nombres con prefijo.
- Ejemplos genericos en docstrings normalizados a la convencion de prefijo.
- comfyui_replicate_civitai_oneshot::_norm ignora el token de arquitectura al
  comparar, robusto al reordenado (sufijo civitai vs prefijo instalado).

Refs a repos HuggingFace (nerijs/pixel-art-xl) y checkpoints (juggernaut_xl_v11)
preservados. Verificado: dropdown LoraLoader con prefijos + generacion real
pixel-art OK + tests comfyui verdes (481 ml + 26 pipelines).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 16:33:03 +02:00

4.5 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
comfyui_pixelize_image function py ml 1.0.0 impure def comfyui_pixelize_image(src_path: str, dst_path: str, *, downscale: int = 8, colors: int = 16, palette=None, dither: bool = False, upscale_back: bool = True) -> dict Post-proceso pixel-perfect (Fase 2 pixelart): imagen -> downscale nearest-neighbor por factor (colapsa cada bloque borroso a un pixel duro) -> cuantizacion a N colores (MEDIANCUT) o a una paleta fija embebida (game-boy / pico-8 / nes / lista de hex) -> opcional re-upscale nearest conservando los pixeles duros. Convierte el 'pixelart borroso de IA' en pixelart de verdad. Nucleo PIL puro, CPU-only: sin GPU, sin red. Devuelve {ok, out_path, size, n_colors_final, error}. Impura solo por la lectura/escritura de disco.
comfyui
gamedev-2d
pixelart
ml
pil
quantize
palette
image
false error_py_core
name desc
src_path ruta de la imagen de entrada (PNG/JPG/...).
name desc
dst_path ruta del PNG de salida (se crea el directorio si falta).
name desc
downscale factor entero de reduccion nearest (>=1); cada bloque downscale x downscale px colapsa a 1 pixel. 1 = solo cuantiza sin colapsar el grid. keyword-only.
name desc
colors numero de colores objetivo (2..256) cuando palette es None; cuantizacion MEDIANCUT determinista. keyword-only.
name desc
palette None (auto a 'colors'), nombre de paleta fija builtin ('game-boy','pico-8','nes') o lista de hex ('#rrggbb'/'rrggbb'). Una paleta fija ignora 'colors'. keyword-only.
name desc
dither aplica Floyd-Steinberg al cuantizar (off por defecto = pixelart limpio). keyword-only.
name desc
upscale_back re-escala nearest al tamano original (preview con pixeles duros). False deja la imagen pequena. keyword-only.
dict con ok (bool), out_path (str), size ([w,h] de la imagen final), n_colors_final (int, colores distintos del resultado), error (str, vacio si OK). true
test_golden_downscale_quantize
test_no_upscale_back_keeps_small
test_edge_fixed_palette_game_boy
test_edge_palette_list_hex
test_edge_downscale_1_only_quantizes
test_error_missing_src
test_error_downscale_zero
test_error_bad_palette
python/functions/ml/comfyui_pixelize_image_test.py python/functions/ml/comfyui_pixelize_image.py

Ejemplo

import sys, os
sys.path.insert(0, os.path.join(os.environ["HOME"], "fn_registry", "python", "functions"))
from ml.comfyui_pixelize_image import comfyui_pixelize_image

# Crudo SDXL+SDXL_pixel-art 1024x1024 -> pixelart 16 colores, grid de 128
res = comfyui_pixelize_image(
    os.path.expanduser("~/ComfyUI/output/pixelart_00001_.png"),
    "/tmp/hero_pixel.png",
    downscale=8, colors=16,
)
# {'ok': True, 'out_path': '/tmp/hero_pixel.png', 'size': [1024, 1024], 'n_colors_final': 16, 'error': ''}

# Forzar la paleta retro Game Boy (4 colores) y dejar la imagen pequena (sin upscale)
comfyui_pixelize_image("/tmp/hero_pixel.png", "/tmp/hero_gb.png",
                       palette="game-boy", upscale_back=False)

Cuando usarla

Fase 2 del pipeline pixelart: tras generar el crudo (SDXL + LoRA SDXL_pixel-art), para colapsar el grid borroso a pixeles duros y limitar la paleta. Tambien sirve para "pixelizar" cualquier imagen (sprite, render, foto) a estetica retro sin tocar la GPU. Para llevar el resultado a Godot con filtro Nearest: comfyui_export_asset_to_godot(out, "pixelart", proj).

Gotchas

  • nearest, no lanczos: el downscale usa NEAREST a proposito; interpolar suave re-difumina el grid. No lo cambies por "calidad".
  • palette fija (game-boy/pico-8/nes o lista de hex) ignora colors. La paleta se rellena internamente repitiendo su ultimo color para que quantize no introduzca un negro extra por entradas vacias (bug arreglado en v1.0.0).
  • downscale con upscale_back=False deja la imagen de w//downscale x h//downscale: util para spritesheets compactos; con True vuelve al tamano original con bordes duros (preview).
  • Todo error es dict ok=False (no excepcion): src_path inexistente, downscale<1, paleta desconocida -> error explica. No crashea ni borra nada.
  • n_colors_final cuenta colores distintos reales del PNG escrito; con paleta fija puede ser menor que el tamano de la paleta si la imagen no usa todos.
  • CPU-only: no toca la GPU ni el servidor ComfyUI; corre en cualquier interprete con Pillow.