DALLE3

Intermedio
OpenAI
OpenAI
Actualizado: 03/07/2025

Generar imágenes con DALL-E 3

DALL-E 3 es el modelo de generación de imágenes de OpenAI que permite crear imágenes de alta calidad a partir de descripciones textuales. A diferencia de versiones anteriores, DALL-E 3 ofrece una mejor comprensión del contexto y genera imágenes más precisas y detalladas según las instrucciones proporcionadas.

Configuración inicial

Para trabajar con DALL-E 3, necesitamos instalar el SDK de OpenAI y configurar nuestro entorno. El SDK detecta automáticamente la clave API desde las variables de entorno:

from openai import OpenAI
import base64

# El cliente se inicializa automáticamente con la API key del entorno
client = OpenAI()

Generación básica de imágenes

La forma más directa de generar imágenes con DALL-E 3 es utilizando la Image API. Esta API está diseñada para casos donde necesitamos generar una sola imagen a partir de un prompt:

from openai import OpenAI
import base64

client = OpenAI()

# Definir el prompt descriptivo
prompt = """
Un gato atigrado gris abrazando a una nutria que lleva una bufanda naranja,
estilo ilustración de libro infantil, colores cálidos y suaves
"""

# Generar la imagen
result = client.images.generate(
    model="dall-e-3",
    prompt=prompt,
    size="1024x1024",
    quality="standard",
    n=1
)

# Obtener los datos de la imagen en base64
image_base64 = result.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

# Guardar la imagen
with open("gato_nutria.png", "wb") as f:
    f.write(image_bytes)

Ejemplo:

Parámetros de configuración

DALL-E 3 ofrece varios parámetros de personalización que nos permiten controlar la calidad y características de las imágenes generadas:

Tamaños disponibles:

# Imagen cuadrada (por defecto)
result = client.images.generate(
    model="dall-e-3",
    prompt="Un paisaje montañoso al atardecer",
    size="1024x1024"
)

# Imagen horizontal
result = client.images.generate(
    model="dall-e-3",
    prompt="Un paisaje montañoso al atardecer",
    size="1792x1024"
)

# Imagen vertical
result = client.images.generate(
    model="dall-e-3",
    prompt="Un rascacielos futurista",
    size="1024x1792"
)

Niveles de calidad:

# Calidad estándar (más rápida y económica)
result = client.images.generate(
    model="dall-e-3",
    prompt="Un robot amigable en un jardín",
    quality="standard"
)

# Alta calidad (más detallada pero más lenta)
result = client.images.generate(
    model="dall-e-3",
    prompt="Un robot amigable en un jardín",
    quality="hd"
)

Optimización de prompts

La calidad del prompt es fundamental para obtener resultados precisos con DALL-E 3. El modelo responde mejor a descripciones detalladas y específicas:

# Prompt básico
prompt_basico = "Un perro"

# Prompt optimizado
prompt_optimizado = """
Un golden retriever adulto sentado en un prado verde,
luz dorada del atardecer, estilo fotografía profesional,
enfoque nítido, fondo ligeramente desenfocado
"""

result = client.images.generate(
    model="dall-e-3",
    prompt=prompt_optimizado,
    size="1024x1024",
    quality="hd"
)

Manejo de respuestas y errores

Es importante implementar un manejo robusto de las respuestas y posibles errores:

from openai import OpenAI
import base64
import os

client = OpenAI()

def generar_imagen(prompt, nombre_archivo="imagen_generada.png"):
    try:
        result = client.images.generate(
            model="dall-e-3",
            prompt=prompt,
            size="1024x1024",
            quality="standard"
        )
        
        # Verificar que se generó la imagen
        if result.data and len(result.data) > 0:
            image_data = result.data[0]
            
            # Obtener el prompt revisado por el modelo
            if hasattr(image_data, 'revised_prompt'):
                print(f"Prompt revisado: {image_data.revised_prompt}")
            
            # Guardar la imagen
            image_base64 = image_data.b64_json
            image_bytes = base64.b64decode(image_base64)
            
            with open(nombre_archivo, "wb") as f:
                f.write(image_bytes)
            
            print(f"Imagen guardada como: {nombre_archivo}")
            return True
            
    except Exception as e:
        print(f"Error al generar la imagen: {e}")
        return False

# Uso de la función
exito = generar_imagen(
    "Un café humeante en una mesa de madera, luz matutina suave",
    "cafe_matutino.png"
)

Generación de múltiples variaciones

Aunque DALL-E 3 genera una imagen por solicitud, podemos crear múltiples variaciones ejecutando varias llamadas con ligeras modificaciones en el prompt:

def generar_variaciones(prompt_base, num_variaciones=3):
    variaciones = [
        f"{prompt_base}, estilo realista",
        f"{prompt_base}, estilo artístico",
        f"{prompt_base}, estilo minimalista"
    ]
    
    for i, prompt in enumerate(variaciones):
        try:
            result = client.images.generate(
                model="dall-e-3",
                prompt=prompt,
                size="1024x1024"
            )
            
            image_base64 = result.data[0].b64_json
            image_bytes = base64.b64decode(image_base64)
            
            with open(f"variacion_{i+1}.png", "wb") as f:
                f.write(image_bytes)
                
            print(f"Variación {i+1} generada exitosamente")
            
        except Exception as e:
            print(f"Error en variación {i+1}: {e}")

# Generar variaciones de un concepto
generar_variaciones("Un árbol solitario en una colina")

Consideraciones de rendimiento y costos

DALL-E 3 tiene limitaciones importantes que debemos considerar en nuestras aplicaciones:

import time

def generar_con_reintentos(prompt, max_intentos=3):
    for intento in range(max_intentos):
        try:
            result = client.images.generate(
                model="dall-e-3",
                prompt=prompt,
                size="1024x1024"
            )
            
            return result.data[0].b64_json
            
        except Exception as e:
            print(f"Intento {intento + 1} fallido: {e}")
            if intento < max_intentos - 1:
                # Esperar antes del siguiente intento
                time.sleep(2 ** intento)  # Backoff exponencial
            else:
                raise e

# Uso con manejo de reintentos
try:
    imagen = generar_con_reintentos("Un castillo medieval en las nubes")
    print("Imagen generada exitosamente")
except Exception as e:
    print(f"No se pudo generar la imagen después de varios intentos: {e}")

La velocidad de generación varía según la complejidad del prompt y la calidad solicitada. Las imágenes de alta calidad pueden tardar significativamente más en procesarse, por lo que es recomendable implementar indicadores de progreso en aplicaciones interactivas.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en OpenAI

Documentación oficial de OpenAI
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, OpenAI es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de OpenAI

Explora más contenido relacionado con OpenAI y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender qué es DALL-E 3 y sus mejoras respecto a versiones anteriores.
  • Configurar el entorno y utilizar el SDK de OpenAI para generar imágenes.
  • Aprender a personalizar parámetros como tamaño y calidad de las imágenes.
  • Optimizar prompts para obtener resultados más precisos y detallados.
  • Implementar manejo de errores y generación de múltiples variaciones de imágenes.