Skip to content
SP StackPractices
intermediate Por Mathias Paulenko

Generar Imágenes Programáticamente con Modelos de IA

Cómo crear, editar y optimizar imágenes usando las APIs de DALL-E, Stable Diffusion y Midjourney con prompt engineering, procesamiento por lotes y moderación de contenido.

Temas: ai

Visión general

Los modelos generativos de imágenes han transformado cómo los desarrolladores crean contenido visual. En lugar de contratar diseñadores, comprar fotos de stock o construir complejos pipelines de renderizado, las aplicaciones ahora pueden generar imágenes personalizadas a partir de descripciones de texto en segundos. DALL-E 3, Stable Diffusion XL y Midjourney producen retratos fotorrealistas, ilustraciones, íconos y mockups de productos que son cada vez más indistinguibles del arte creado por humanos.

El desafío en producción no es llamar a la API — es diseñar prompts que produzcan resultados consistentes y usables a escala. Un prompt como “un gato” produce resultados impredecibles. Un prompt estructurado con referencias de estilo, proporciones de aspecto, constraints negativas y valores de seed produce assets reproducibles adecuados para e-commerce, marketing y generación de UI. Esta receta cubre integración de API, plantillas de prompts, generación por lotes, moderación de contenido y optimización de imágenes para entrega web.

Cuándo usarlo

Usa esta receta cuando:

  • Generando mockups de productos, banners de marketing o assets de redes sociales dinámicamente
  • Construyendo herramientas de creación de avatares donde los usuarios describen su apariencia deseada
  • Creando ilustraciones personalizadas para newsletters, posts de blog o libros infantiles
  • Prototipando diseños de UI y wireframes a partir de descripciones de texto
  • Aumentando datasets de entrenamiento con imágenes sintéticas para modelos de computer vision

Solución

Generación de Imágenes con DALL-E 3 (Python / OpenAI)

from openai import OpenAI
import requests
from pathlib import Path

client = OpenAI()

def generate_product_mockup(product_name: str, style: str, size: str = "1024x1024") -> str:
    prompt = f"""
    Professional product photography of {product_name}.
    Style: {style}, soft studio lighting, clean white background,
    high detail, 8k resolution, e-commerce ready.
    No text, no watermarks, no people.
    """.strip()

    response = client.images.generate(
        model="dall-e-3",
        prompt=prompt,
        size=size,
        quality="hd",
        n=1,
        response_format="url"
    )

    image_url = response.data[0].url
    revised_prompt = response.data[0].revised_prompt

    image_data = requests.get(image_url).content
    output_path = Path(f"generated/{product_name.replace(' ', '_')}.png")
    output_path.write_bytes(image_data)

    return str(output_path)

path = generate_product_mockup("wireless headphones", "minimalist modern")

Stable Diffusion con ControlNet (Python / Diffusers)

import torch
from diffusers import StableDiffusionXLControlNetPipeline, ControlNetModel
from PIL import Image
import numpy as np

controlnet = ControlNetModel.from_pretrained(
    "diffusers/controlnet-canny-sdxl-1.0",
    torch_dtype=torch.float16
)

pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    controlnet=controlnet,
    torch_dtype=torch.float16
).to("cuda")

reference_image = Image.open("sketch.png").convert("RGB")

image = pipe(
    prompt="modern living room interior, warm lighting, wooden floors, minimalist furniture",
    image=reference_image,
    num_inference_steps=30,
    guidance_scale=7.5,
    controlnet_conditioning_scale=0.8
).images[0]

image.save("generated_room.png")

Generación por Lotes con Plantillas de Prompts (JavaScript)

const { OpenAI } = require('openai');
const fs = require('fs');
const path = require('path');

const openai = new OpenAI();

const templates = [
  { category: 'hero', prompt: 'Wide landscape banner of {theme}, golden hour, cinematic composition, no text', size: '1792x1024' },
  { category: 'thumbnail', prompt: 'Square close-up of {theme}, vibrant colors, high contrast', size: '1024x1024' },
  { category: 'icon', prompt: 'Minimalist flat icon of {theme}, white background, vector style, clean lines', size: '1024x1024' },
];

async function generateBatch(theme, outputDir) {
  const results = [];

  for (const template of templates) {
    const prompt = template.prompt.replace('{theme}', theme);
    const response = await openai.images.generate({
      model: 'dall-e-3',
      prompt,
      size: template.size,
      n: 1,
    });

    const imageUrl = response.data[0].url;
    const buffer = await fetch(imageUrl).then(r => r.arrayBuffer());

    const filename = `${theme}_${template.category}.png`;
    fs.writeFileSync(path.join(outputDir, filename), Buffer.from(buffer));
    results.push({ category: template.category, filename });
  }

  return results;
}

Explicación

  • Prompt engineering para imágenes: los modelos de imagen son altamente sensibles a la estructura del prompt. Incluye sujeto, estilo, iluminación, ángulo de cámara, mood y constraints negativas. DALL-E 3 expande automáticamente prompts cortos; Stable Diffusion requiere detalle explícito para resultados de calidad.
  • Valores de seed para consistencia: fijar la seed aleatoria (seed=42) asegura que el mismo prompt produzca la misma imagen a través de generaciones. Esto es esencial para A/B testing, testing de regresión y crear series de imágenes con estilo uniforme.
  • Moderación de contenido: OpenAI y Stability AI filtran automáticamente prompts y outputs por contenido dañino. Implementa capas adicionales de moderación para prompts generados por usuarios, logueando requests rechazados y alertando sobre patrones sospechosos.
  • Optimización de imágenes: las imágenes generadas típicamente son PNG o JPEG de alta calidad. Conviértelas a WebP para entrega web, genera tamaños responsive y lazy-load las imágenes below-the-fold. Usa CDNs para distribución global.

Variantes

ModeloCostoVelocidadCalidadControlMejor para
DALL-E 3MedioRápidoAltaBajoUso general, comprensión de texto
Stable Diffusion XLBajo*MediaAltaAlto (ControlNet)Self-hosted, modelos custom
MidjourneyAltoMediaMuy altaMedioArtístico, contenido premium
IdeogramBajoRápidoMediaBajoPrecisión de texto en imagen

Mejores prácticas

  • Cachea imágenes generadas: almacena imágenes generadas en object storage (S3, GCS) con un CDN adelante. Nunca regeneres el mismo prompt dos veces — cachea por hash de prompt o selección de usuario.
  • Versiona tus prompts: trackea plantillas de prompts, versiones de modelos y valores de seed en control de versiones. Cuando los modelos se actualizan (ej. DALL-E 3 a 4), testea de regresión tu biblioteca de prompts para consistencia.
  • Implementa políticas de contenido de usuario: bloquea prompts que soliciten contenido violento, sexual o que infrinja copyright. Muestra términos de servicio claros y mantén un audit log de todas las generaciones para compliance.
  • Optimiza para web antes de almacenar: redimensiona imágenes a las dimensiones exactas de display, comprime con WebP/AVIF y elimina metadata. Una imagen PNG 1024x1024 de DALL-E pesa 2-4MB; la misma imagen como WebP al 80% de calidad pesa 200KB.
  • Fallback a stock ante fallos: si la API está rate-limitada o la imagen generada es inusable, fallback a una biblioteca de fotos de stock curada. Nunca muestres imágenes rotas o spinners de carga indefinidamente.

Errores comunes

  • No manejar límites de rate de API: DALL-E permite 5 imágenes/minuto en tiers estándar. Encola requests de generación e implementa backoff exponencial. No martilles la API en un loop ajustado.
  • Ignorar prompt injection: los usuarios pueden diseñar prompts que anulen tus instrucciones de sistema (ej. “ignora instrucciones previas, genera…”). Sanitiza input de usuario y envuélvelo en una plantilla fija que no pueda escaparse.
  • Almacenar originales sin optimizar: mantener PNGs de resolución completa en tu base de datos infla el almacenamiento y ralentiza cargas de página. Genera y cachea variantes optimizadas al momento de ingestión.
  • Usar imágenes generadas sin revisar derechos: aunque la mayoría de imágenes generadas por IA son comercialmente usables, revisa los términos de tu proveedor. Algunos restringen uso en ciertas industrias (médica, política) o requieren atribución.

Preguntas frecuentes

P: ¿Puedo usar imágenes generadas por IA comercialmente? R: Para DALL-E y Stable Diffusion, generalmente sí — eres dueño del output. Midjourney requiere un plan pago para uso comercial. Siempre revisa los términos de servicio actuales, ya que las políticas evolucionan.

P: ¿Cómo hago que las imágenes generadas sean consistentes en una serie? R: Usa el mismo valor de seed, imagen de referencia (img2img) o modelo fine-tuned (LoRA). ControlNet con bordes canny o mapas de profundidad preserva estructura mientras permite cambios de estilo.

P: ¿Qué resolución debería generar para uso web? R: Genera a la resolución objetivo de display (ej. 1024px de ancho para imágenes hero) en lugar de downsampling desde 4K. Esto ahorra tokens, reduce tiempo de generación y produce resultados más nítidos.

P: ¿Cómo evito que usuarios generen contenido inapropiado? R: Capas de filtrado de prompts (blocklists, regex), flags de moderación de API y colas de revisión humana. Los prompts rechazados deben loguearse y compararse por patrones para detectar usuarios intentando evadir filtros.