¿Qué hace collage?
Se te da un tema o un cuerpo de texto. Tu trabajo es producir una obra de collage, no una descripción de una. Trabaja de principio a fin: lee → extrae → encuentra imágenes → compón → renderiza → verifica → explica.
Esta habilidad es una carpeta, no un solo archivo
Una instalación solo está completa si SKILL.md, references/, scripts/, requirements.txt, install.sh, install.ps1 y scripts/check_setup.py están todos presentes en el mismo directorio. Si falta alguno, reinstala el paquete completo en lugar de copiar SKILL.md por sí solo.
Paso 0 — Verifica la instalación (haz esto una vez)
python3 scripts/check_setup.py
Esto verifica la versión de Python, cada archivo incluido, Pillow, NumPy, la resolución de fuentes, una prueba de humo del renderizador y una prueba de humo de recorte de contenido. Si falta algo:
bash install.sh # macOS / Linux: instala requirements.txt, luego vuelve a ejecutar la verificación
# Windows: powershell -ExecutionPolicy Bypass -File install.ps1
Los instaladores necesitan conexión de red solo para los paquetes de Python; cualquier otra parte de la habilidad funciona sin conexión.
La idea rectora proviene del material de referencia en references/: el collage es un ensamblaje de materiales que ya tienen una historia (Rise Art, Artsy), y su lógica visual es 断裂 / 重组 / 融合 — fractura, reensamblaje, fusión (UISDC). Por lo tanto, el resultado final debe parecer papel recortado que fue pegado y reescaneado, y debe transmitir una idea formada al poner juntas dos cosas diferentes.
No le pidas al usuario que tome decisiones artísticas
Infiera todo lo que se pueda inferir: estrategia, paleta, formato, titular, motivos. Solo pregunta si el resumen es una sola palabra ambigua sin contexto, o si los propios activos del usuario son claramente necesarios. Por defecto, usa un póster de 1200×1500, una de las seis estrategias a continuación y obtención autónoma de imágenes.
Paso 1 — Lee y extrae (este es el paso creativo; lo haces tú)
Lee el tema o pasaje del usuario y escribe un pequeño JSON de concepto. No te limites a enumerar los sustantivos del texto. Haz lo siguiente:
- Identifica la tensión o movimiento en el texto (qué cambia, qué se opone, qué regresa, qué se pierde). Un collage necesita dos cosas diferentes.
- Escribe una oración de emparejamiento: "X se encuentra con Y, lo que sugiere Z." Este es el argumento de la obra. Si no puedes escribirla, no has entendido el texto.
- Extrae de 2 a 4 motivos visuales que puedan transmitir ese argumento. Para cada uno, escribe una consulta de búsqueda de imágenes concreta (el inglés funciona mejor en Commons) y un
por quéexplicando lo que aporta. Prefiere objetos y texturas fotografiables sobre sustantivos abstractos. "memoria" no es un motivo; "un ticket de entrada descolorido", "una ola rompiendo", "un horizonte nocturno" sí lo son. - Elige una estrategia de
references/movements.mdque coincida con el registro emocional, y una paleta de 2 a 4 tintas. - Elige un titular (una frase corta recortada de una revista, en el idioma del usuario o en inglés) y opcionalmente un subtítulo (una línea mono pequeña).
Escríbelo en <job>/concept.json:
{
"theme": "潮汐与城市",
"headline": "TIDE / CITY",
"kicker": "A NOTE ON DISTANCE",
"statement": "The returning tide meets the sleeping city, suggesting a memory that keeps coming back.",
"strategy": "surrealism",
"palette": ["#16283a", "#d94f36", "#4a86a8", "#f0c94b"],
"motifs": [
{"id": "tide", "query": "breaking ocean wave water", "role": "hero",
"why": "the returning tide, the thing that keeps coming back"},
{"id": "city", "query": "city skyline night silhouette", "role": "ground",
"why": "the sleeping city, the fixed thing"},
{"id": "moon", "query": "moon crater lunar surface", "role": "satellite",
"why": "the distant witness, one impossible object inside the arch"}
]
}
strategy es uno de cubism, dada, surrealism, pop, decollage, editorial. role es hero (uno), ground o satellite. Esquema completo: references/concept-schema.md.
Cuando el usuario proporcione sus propias imágenes, omite el Paso 2 y escribe un manifiesto SOURCES.json que apunte a esos archivos, con license: "user-provided".
Paso 2 — Encuentra imágenes fuente de forma autónoma
python3 scripts/source_assets.py --concept <job>/concept.json \
--out-dir <job>/assets --per-motif 1
Esto busca en Wikimedia Commons, conserva solo resultados con licencia CC BY / BY-SA / CC0 / dominio público, omite archivos con advertencias de derechos de imagen personal, descarga miniaturas y escribe <job>/assets/SOURCES.json con el autor, la licencia y la página de origen de cada imagen. No omitas este manifiesto — la obra terminada debe ser atribuible. Usa --query-only "..." para probar un término de búsqueda cuando un motivo devuelva malos resultados, luego edita el concepto y vuelve a ejecutar.
Reglas para buenas consultas: sustantivos concretos, sin adjetivos estéticos ("hermoso", "vintage"), de 2 a 4 palabras, evita consultas que devuelvan personas. Si una imagen descargada resulta ser un retrato o un diagrama, reemplázala; verifica el resultado renderizado en el Paso 5 en lugar de confiar en el nombre del archivo.
Si el entorno no tiene red, indícalo y continúa con las fuentes de papel procesal (photo, newsprint, grid, wood, halftone), que no necesitan descargas. El renderizador se degrada correctamente cuando falta una ruta de activo.
Paso 3 — Recorta las imágenes según su contenido visible
Esto no es opcional. Un collage terminado no debe ser una pila de fotografías rectangulares enteras con bordes rasgados decorativos. Mira cada imagen fuente y recorta la cosa que transmite significado: una silueta, una mano, un teclado, una boca, una tabla de puente, una diagonal oscura, un campo azul, una fila de asientos, una pizarra, un paso a través de la hierba. Recombina esos fragmentos con forma de imagen para que la costura se convierta en un argumento. La guía para principiantes de Lydia Rink refuerza la versión física de esto: un bisturí/cúter es para cortar con precisión alrededor de elementos; organiza sin apretar antes de pegar; deja espacio negativo; varía la escala; usa capas para crear profundidad.
scripts/visual_cutout.py es un bisturí digital deliberadamente pequeño. Usa solo Pillow y NumPy. El modo principal es shape: observa la fotografía fuente y describe el objeto visible o la región estructural con un polígono normalizado. Un segundo modo silhouette elimina un borde/fondo plano mediante distancia de color. No hay dependencia pesada de segmentación de imágenes. El compilador también escribe cuts/contact-sheet.jpg; inspecciónalo antes de componer y ajusta el polígono si el recorte no captura el sujeto.
El compilador ejecuta los recortes y vincula los PNG transparentes resultantes a la receta con mask: "alpha":
python3 scripts/theme_to_recipe.py --concept <job>/concept.json \
--assets <job>/assets --recipe <job>/recipe.json \
--cutouts <job>/cuts --seed 11 --format poster
Describe los recortes en el concepto para cada motivo (cut) o en un mapa cuts indexado por id de motivo. Un motivo puede proporcionar una instrucción o una lista de instrucciones, lo que produce varios fragmentos a partir de una fotografía:
"cut": [
{"mode": "shape", "shape": "0.00,0.00;1.00,0.00;1.00,0.46;0.00,1.00"},
{"mode": "shape", "shape": "0.00,0.79;0.34,0.60;1.00,0.73;1.00,1.00;0.00,1.00"}
]
Usa shape para el contorno semántico que puedas ver en la fotografía; las coordenadas están normalizadas x,y;x,y;.... Usa silhouette solo cuando el objeto se encuentre sobre un fondo simple parecido al papel. Mantén uno o dos recortes geométricos/rasgados de papel como contrapunto, pero las fotografías encontradas deben recortarse primero por contenido. Consulta references/composition.md para el método de recorte y references/materials.md para las fuentes y máscaras alpha.
Paso 4 — Renderiza
python3 scripts/collage.py --recipe <job>/recipe.json --out <job>/final.png
El renderizador aplica fibra de papel, tramado de semitonos, bordes rasgados, registro de impresión, sombras paralelas, cinta, marcas de lápiz, grano y un lavado cálido unificador. Es determinista: la misma receta más la misma semilla da la misma imagen. Renderiza dos o tres semillas y elige la mejor: los bordes rasgados y los campos de faceta varían.
Paso 5 — Verifica, luego explica
Siempre mira la imagen que produjiste (ábrela o genera una hoja de contactos) antes de entregarla. Verifica los anti-patrones en references/composition.md: demasiados colores, sombra en cada capa, todo a 0°, bordes completamente rasgados, texto más pequeño que los recortes, y especialmente una fotografía que aún se lea como una ventana rectangular completa en lugar de una forma recortada de su propio contenido. Si el corte semántico no es legible en tamaño de miniatura, vuelve al Paso 3. Si falla, ajusta la receta o la estrategia y vuelve a renderizar.
Luego entrega el PNG más una breve explicación de la oración de emparejamiento, la estrategia y por qué se eligieron esos motivos. Incluye las líneas de crédito de SOURCES.json; reproduce los términos de la licencia cuando sea necesario (CC BY-SA puede requerir que la obra combinada se comparta de la misma manera). Indica al usuario que consulte recipe-rationale.md para el registro completo de decisiones.
Referencia rápida
| Quieres | Comando |
|---|---|
| Verificar la instalación | python3 scripts/check_setup.py |
| Instalar dependencias de Python | bash install.sh |
| Ver todos los estilos integrados | python3 scripts/collage.py --list |
| Renderizar un preajuste | python3 scripts/collage.py --preset dada-montage --out out.png |
| Guardar un preajuste como receta editable | python3 scripts/collage.py --preset cubist-grid --out x.png --dump x.json |
| Escribir una receta a mano | python3 scripts/collage.py --recipe x.json --out x.png |
| Recortar un contorno observado a mano | python3 scripts/visual_cutout.py --input photo.jpg --out cut.png --mode shape --shape "0,.1;1,0;.9,1;0,.9" --contact-sheet sheet.jpg |
| Eliminar un fondo simple | python3 scripts/visual_cutout.py --input object.jpg --out cut.png --mode silhouette |
| Probar una búsqueda de imágenes | python3 scripts/source_assets.py --query-only "moon crater" |
| Probar un concepto sin conexión | python3 scripts/source_assets.py --concept c.json --out-dir a --offline |
Archivos en esta habilidad
requirements.txt declara Pillow y NumPy. install.sh (macOS/Linux) e install.ps1 (Windows) los instalan y ejecutan scripts/check_setup.py. scripts/check_setup.py verifica cada archivo incluido, la versión de Python, la resolución de fuentes, una prueba de humo del renderizador y una prueba de humo de recorte. scripts/collage.py es el renderizador (Pillow + NumPy, sin red). scripts/visual_cutout.py recorta polígonos observados a mano y siluetas de fondo simple (Pillow + NumPy, sin red). scripts/source_assets.py es el buscador/descargador de Commons (solo stdlib). scripts/theme_to_recipe.py compila un concepto en una receta y ejecuta los comandos de recorte de contenido ligero. references/movements.md es el mapa de decisión histórico-artístico con fuentes. references/materials.md documenta los tipos de papel, fuentes, bordes y mezclas. references/composition.md documenta los sistemas de diseño y los anti-patrones. references/prompts.md proporciona patrones de prompt para cuando un modelo de texto a imagen es más adecuado que el renderizador. references/concept-schema.md es el contrato JSON del concepto. assets/ es el lugar opcional para las imágenes fuente proporcionadas por el usuario.
Un ejemplo histórico trabajado (tema → concepto → activos obtenidos → receta → justificación → PNG final) vive en el directorio examples/demo/ del repositorio; muestra el pipeline anterior de recortes rectangulares y se mantiene como ejemplo del renderizador, no como el flujo de trabajo actual de recorte por contenido. El repositorio en sí es el paquete instalable: SKILL.md, references/, scripts/, los instaladores y assets/ se encuentran en la raíz. dist/collage.skill es un ZIP de exactamente esos archivos, con las mismas rutas en la raíz del archivo.