{"id":70477,"date":"2023-10-02T14:11:41","date_gmt":"2023-10-02T12:11:41","guid":{"rendered":"https:\/\/kinqsta.com\/es\/?p=70477&#038;preview=true&#038;preview_id=70477"},"modified":"2023-10-09T08:19:27","modified_gmt":"2023-10-09T06:19:27","slug":"generador-de-imagenes-ai","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/","title":{"rendered":"Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI"},"content":{"rendered":"<p>En el din\u00e1mico panorama de la tecnolog\u00eda, donde la innovaci\u00f3n da forma continuamente a los l\u00edmites de lo posible, la inteligencia artificial (IA) nunca deja de cautivar nuestra imaginaci\u00f3n.<\/p>\n<p>La IA se refiere a la simulaci\u00f3n de procesos de inteligencia humana por parte de sistemas inform\u00e1ticos. Estos procesos incluyen tareas como el aprendizaje, el razonamiento, la resoluci\u00f3n de problemas, la percepci\u00f3n, la <a href=\"https:\/\/kinqsta.com\/es\/blog\/deteccion-de-contenidos-ia\/\">comprensi\u00f3n del lenguaje<\/a> y la toma de decisiones.<\/p>\n<p>En la actualidad, personas y empresas han desarrollado y entrenado varios modelos de IA para realizar determinadas tareas mejor que los humanos en tiempo real. Entre las innumerables aplicaciones de la IA, un \u00e1rea especialmente interesante es la generaci\u00f3n de im\u00e1genes con IA.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Lo que Est\u00e1s Construyendo<\/h2>\n<p>Esta gu\u00eda explica c\u00f3mo construir una aplicaci\u00f3n React que se integre perfectamente con la API <a href=\"https:\/\/labs.openai.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenAI DALL-E<\/a> a trav\u00e9s de un backend <a href=\"https:\/\/kinqsta.com\/es\/blog\/que-es-node-js\/\">Node.js<\/a> y genere im\u00e1genes fascinantes basadas en indicaciones textuales.<\/p>\n<figure style=\"width: 1600px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/09\/ai-image-generator-demo.gif\" alt=\"Generador de im\u00e1genes AI en acci\u00f3n, produciendo im\u00e1genes v\u00edvidas y creativas usando DALL-E API\" width=\"1600\" height=\"877\"><figcaption class=\"wp-caption-text\">Generador de im\u00e1genes de IA en acci\u00f3n, produciendo im\u00e1genes v\u00edvidas y creativas utilizando la API DALL-E.<\/figcaption><\/figure>\n<h3>Requisitos Previos<\/h3>\n<p>Para seguir este proyecto, debes tener:<\/p>\n<ul>\n<li>Conocimientos fundamentales de <a href=\"https:\/\/kinqsta.com\/es\/blog\/que-es-el-html\/\">HTML<\/a>, <a href=\"https:\/\/kinqsta.com\/es\/blog\/buenas-practicas-css\/\">CSS<\/a> y <a href=\"https:\/\/kinqsta.com\/javascript\/\">JavaScript<\/a><\/li>\n<li>Conocimientos b\u00e1sicos de <a href=\"https:\/\/kinqsta.com\/es\/blog\/que-es-react-js\/\">React<\/a> y <a href=\"https:\/\/kinqsta.com\/es\/blog\/deno-vs-node-js\/\">Node.js<\/a><\/li>\n<li>Node.js y npm (<a href=\"https:\/\/kinqsta.com\/es\/blog\/que-es-npm\/\">Node Package Manager<\/a>) o yarn instalados en tu ordenador<\/li>\n<\/ul>\n<h2>\u00bfQu\u00e9 es la API OpenAI DALL-E?<\/h2>\n<p>La API OpenAI es una plataforma basada en la nube que permite a los <a href=\"https:\/\/kinqsta.com\/es\/blog\/tipos-de-desarrolladores\/\">desarrolladores<\/a> acceder a los modelos de IA preentrenados de OpenAI, como DALL-E y GPT-3 (utilizamos este modelo para <a href=\"https:\/\/kinqsta.com\/es\/blog\/clon-chatgpt\/\">construir un clon de ChatGPT<\/a> con el c\u00f3digo de <a href=\"https:\/\/github.com\/kinsta\/chatgpt-clone\" target=\"_blank\" rel=\"noopener noreferrer\">este repositorio Git<\/a>). Permite a los desarrolladores a\u00f1adir funciones de IA como el resumen, la traducci\u00f3n, la generaci\u00f3n de im\u00e1genes y la modificaci\u00f3n a sus programas sin necesidad de desarrollar y entrenar sus modelos.<\/p>\n<p>Para utilizar la API de OpenAI, crea una cuenta utilizando tu cuenta de Google o tu correo electr\u00f3nico en el <a href=\"https:\/\/platform.openai.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">sitio web de OpenAI<\/a> y obt\u00e9n una clave API. Para generar una clave API, haz clic en <strong>Personal<\/strong> en la esquina superior derecha del sitio web y, a continuaci\u00f3n, selecciona <strong>Ver claves API<\/strong>.<\/p>\n<figure style=\"width: 1600px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/09\/create-openai-api-secret-key.jpg\" alt=\"El proceso de creaci\u00f3n de una clave secreta de la API de OpenAI.\" width=\"1600\" height=\"877\"><figcaption class=\"wp-caption-text\">El proceso de creaci\u00f3n de una clave secreta de la API de OpenAI.<\/figcaption><\/figure>\n<p>Haz clic en el bot\u00f3n <strong>Crear nueva clave secreta<\/strong>, y <a href=\"https:\/\/kinqsta.com\/es\/blog\/administradores-contrasenas\/\">guarda la clave<\/a> en alg\u00fan sitio. La utilizar\u00e1s en esta aplicaci\u00f3n para interactuar con la API DALL-E de OpenAI.<\/p>\n<h2>Configurar el Entorno de Desarrollo<\/h2>\n<p>Puedes crear una aplicaci\u00f3n React desde cero y desarrollar tu propia interfaz, o puedes coger nuestra plantilla de inicio <a href=\"https:\/\/kinqsta.com\/es\/secciones\/git\/\">Git<\/a> siguiendo estos pasos:<\/p>\n<ol start=\"1\">\n<li>Visita el <a href=\"https:\/\/github.com\/kinsta\/ai-img-generator\" target=\"_blank\" rel=\"noopener noreferrer\">repositorio GitHub<\/a> de este proyecto.<\/li>\n<li>Selecciona <strong>Usar esta plantilla<\/strong> &gt; <strong>Crear un nuevo repositorio<\/strong> para copiar el c\u00f3digo de inicio en un repositorio dentro de tu cuenta de GitHub (marca la casilla para <strong>incluir todas las ramas<\/strong>).<\/li>\n<li>Extrae el repositorio a tu ordenador local y cambia a la rama <a href=\"https:\/\/github.com\/kinsta\/ai-img-generator\/tree\/starter-files\" target=\"_blank\" rel=\"noopener noreferrer\">starter-files<\/a> utilizando el comando : <code>git checkout starter-files<\/code>.<\/li>\n<\/ol>\n<ol start=\"4\">\n<li>Instala las dependencias necesarias ejecutando el comando <code>npm install<\/code>.<\/li>\n<\/ol>\n<p>Una vez completada la instalaci\u00f3n, puedes lanzar el proyecto en tu ordenador local con <code>npm run start<\/code>. Esto hace que el proyecto est\u00e9 disponible en <a href=\"http:\/\/localhost:3000\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/localhost:3000\/<\/a>.<\/p>\n<figure style=\"width: 1600px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/09\/ai-image-generator-ui.jpg\" alt=\"Interfaz de usuario de una aplicaci\u00f3n generadora de im\u00e1genes AI que muestra el poder de la inteligencia artificial en la creaci\u00f3n de im\u00e1genes.\" width=\"1600\" height=\"877\"><figcaption class=\"wp-caption-text\">Interfaz de usuario de una aplicaci\u00f3n generadora de im\u00e1genes de IA que muestra el poder de la inteligencia artificial en la creaci\u00f3n de im\u00e1genes.<\/figcaption><\/figure>\n<h3>Comprender los Archivos del Proyecto<\/h3>\n<p>En este proyecto, hemos a\u00f1adido todas las dependencias necesarias para tu aplicaci\u00f3n React. Aqu\u00ed tienes un resumen de lo que se ha instalado:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/file-server\" target=\"_blank\" rel=\"noopener noreferrer\">file-server<\/a>: Esta biblioteca de utilidades simplifica el proceso de descarga de las im\u00e1genes generadas. Est\u00e1 vinculada al bot\u00f3n de descarga, lo que garantiza una experiencia de usuario fluida.<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/uuid\" target=\"_blank\" rel=\"noopener noreferrer\">uuid<\/a>: Esta biblioteca asigna una identificaci\u00f3n \u00fanica a cada imagen. Esto evita cualquier posibilidad de que las im\u00e1genes compartan el mismo nombre de archivo por defecto, manteniendo el orden y la claridad.<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/react-icons\" target=\"_blank\" rel=\"noopener noreferrer\">react-icons<\/a>: Integrada en el proyecto, esta biblioteca incorpora iconos sin esfuerzo, mejorando el atractivo visual de tu aplicaci\u00f3n.<\/li>\n<\/ul>\n<p>En el core de tu aplicaci\u00f3n React se encuentra la carpeta <strong>src<\/strong>. Aqu\u00ed es donde se aloja el c\u00f3digo JavaScript esencial para Webpack. Vamos a entender los archivos y carpetas de la carpeta <strong>src<\/strong>:<\/p>\n<ul>\n<li><strong>assets:<\/strong> En este directorio encontrar\u00e1s las im\u00e1genes y el cargador gif que se utilizan en todo el proyecto.<\/li>\n<li><strong>data:<\/strong> Esta carpeta contiene un archivo <strong>index.js<\/strong> que exporta un array de 30 prompts. Estos prompts pueden utilizarse para generar im\u00e1genes diversas y aleatorias. Si\u00e9ntete libre de editarlo.<\/li>\n<li><strong>index.css:<\/strong> Aqu\u00ed es donde se almacenan los estilos utilizados en este proyecto.<\/li>\n<\/ul>\n<h4>Comprender la Carpeta Utils<\/h4>\n<p>Dentro de esta carpeta, el archivo <strong>index.js<\/strong> define dos funciones reutilizables. La primera funci\u00f3n aleatoriza la selecci\u00f3n de prompts que describen varias im\u00e1genes que se pueden generar.<\/p>\n<pre><code class=\"language-js\">import { randomPrompts } from '..\/data';\n\nexport const getRandomPrompt = () =&gt; {\n    const randomIndex = Math.floor(Math.random() * randomPrompts.length);\n    const randomPrompt = randomPrompts[randomIndex];\n\n    return randomPrompt;\n}<\/code><\/pre>\n<p>La segunda funci\u00f3n gestiona la descarga de las im\u00e1genes generadas aprovechando la dependencia <strong>file-saver<\/strong>. Ambas funciones se han creado para ofrecer modularidad y eficacia, y pueden importarse c\u00f3modamente en componentes cuando sea necesario.<\/p>\n<pre><code class=\"language-js\">import FileSaver from 'file-saver';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport async function downloadImage(photo) {\n    const _id = uuidv4();\n    FileSaver.saveAs(photo, `download-${_id}.jpg`);\n}<\/code><\/pre>\n<p>En el c\u00f3digo anterior, la dependencia <strong>uuid<\/strong> da a cada archivo de imagen generado un ID \u00fanico, para que no tengan el mismo nombre de archivo.<\/p>\n<h4>Comprender los Componentes<\/h4>\n<p>Son peque\u00f1os bloques de c\u00f3digo separados para que tu c\u00f3digo sea f\u00e1cil de mantener y comprender. Para este proyecto, se crearon tres componentes: <strong>Header.jsx<\/strong>, <strong>Footer.jsx<\/strong> y <strong>Form.jsx<\/strong>. El componente principal es el componente Form, donde se recibe la entrada y se pasa al archivo <strong>App.jsx<\/strong> con la funci\u00f3n <code>generateImage<\/code> a\u00f1adida como evento <code>onClick<\/code> al bot\u00f3n <strong>Generar imagen<\/strong>.<\/p>\n<p>En el componente Form, se crea un estado para almacenar y actualizar la solicitud. Adem\u00e1s, una funci\u00f3n te permite hacer clic en un icono aleatorio para generar los prompts aleatorios. Esto es posible gracias a la funci\u00f3n <code>handleRandomPrompt<\/code>, que utiliza la funci\u00f3n <code>getRandomPrompt<\/code> que ya has configurado. Cuando haces clic en el icono, se obtiene un prompt aleatorio y se actualiza el estado con \u00e9l:<\/p>\n<pre><code class=\"language-jsx\">const handleRandomPrompt = () =&gt; {\n    const randomPrompt = getRandomPrompt();\n    setPrompt(randomPrompt)\n}<\/code><\/pre>\n<h4>Comprender el Archivo App.jsx<\/h4>\n<p>Aqu\u00ed es donde reside la mayor parte del c\u00f3digo. Aqu\u00ed se re\u00fanen todos los componentes. Tambi\u00e9n hay un \u00e1rea designada para mostrar la imagen generada. Si a\u00fan no se ha generado ninguna imagen, se muestra una imagen de marcador de posici\u00f3n (Imagen de vista previa).<\/p>\n<p>Dentro de este archivo, se gestionan dos estados:<\/p>\n<ul>\n<li><code>isGenerating<\/code>: Mantiene un registro de si se est\u00e1 generando actualmente una imagen. Por defecto, se establece en falso.<\/li>\n<li><code>generatedImage<\/code>: Este estado almacena informaci\u00f3n sobre la imagen que se ha generado.<\/li>\n<\/ul>\n<p>Adem\u00e1s, se importa la funci\u00f3n de utilidad <code>downloadImage<\/code>, que te permite activar la descarga de la imagen generada cuando pulsas el bot\u00f3n <strong>Descargar<\/strong>:<\/p>\n<pre><code class=\"language-jsx\">&lt;button\n    className=\"btn\"\n    onClick={() =&gt; downloadImage(generatedImage.photo)}\n&gt;<\/code><\/pre>\n<p>Ahora que ya conoces los archivos de inicio y has configurado tu proyecto. Empecemos a manejar la l\u00f3gica de esta aplicaci\u00f3n.<\/p>\n<h2>Generar Im\u00e1genes con la API DALL-E de OpenAI<\/h2>\n<p>Para aprovechar las capacidades de la API DALL-E de OpenAI, utilizar\u00e1s Node.js para establecer un servidor. Dentro de este servidor, crear\u00e1s una ruta POST. Esta ruta se encargar\u00e1 de recibir el texto del prompt enviado desde tu aplicaci\u00f3n React y de utilizarlo para generar una imagen.<\/p>\n<p>Para empezar, instala las dependencias necesarias en el directorio de tu proyecto ejecutando el siguiente comando:<\/p>\n<pre><code class=\"language-bash\">npm i express cors openai<\/code><\/pre>\n<p>Adem\u00e1s, instala las siguientes dependencias como dependencias dev. Estas herramientas te ayudar\u00e1n a configurar tu servidor <a href=\"https:\/\/kinqsta.com\/es\/blog\/construir-slackbot-para-gestion-de-sitios\/\">Node.js<\/a>:<\/p>\n<pre><code class=\"language-bash\">npm i -D dotenv nodemon<\/code><\/pre>\n<p>Las dependencias instaladas se explican a continuaci\u00f3n:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/express\" target=\"_blank\" rel=\"noopener noreferrer\">express<\/a>: Esta biblioteca ayuda a crear un servidor en Node.js.<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/cors\" target=\"_blank\" rel=\"noopener noreferrer\">cors<\/a>: CORS facilita la comunicaci\u00f3n segura entre diferentes dominios.<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/openai\" target=\"_blank\" rel=\"noopener noreferrer\">openai<\/a>: Esta dependencia te permite acceder a la API DALL-E de OpenAI.<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/dotenv\" target=\"_blank\" rel=\"noopener noreferrer\">dotenv<\/a>: dotenv ayuda a gestionar las variables de entorno.<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/nodemon\" target=\"_blank\" rel=\"noopener noreferrer\">nodemon<\/a>: nodemon es una herramienta de desarrollo que supervisa los cambios en tus archivos y reinicia autom\u00e1ticamente el servidor.<\/li>\n<\/ul>\n<p>Una vez realizada la instalaci\u00f3n, crea un archivo <strong>server.js<\/strong> en el root de tu proyecto. Aqu\u00ed es donde se almacenar\u00e1 todo el c\u00f3digo de tu servidor.<\/p>\n<p>En el archivo <strong>server.js<\/strong>, importa las <a href=\"https:\/\/kinqsta.com\/es\/blog\/bibliotecas-node-js\/\">bibliotecas<\/a> que acabas de instalar y crea una instancia de ellas:<\/p>\n<pre><code class=\"language-js\">\/\/ Import the necessary libraries\nconst express = require('express');\nconst cors = require('cors');\nrequire('dotenv').config();\nconst OpenAI = require('openai');\n\n\/\/ Create an instance of the Express application\nconst app = express();\n\n\/\/ Enable Cross-Origin Resource Sharing (CORS)\napp.use(cors());\n\n\/\/ Configure Express to parse JSON data and set a data limit\napp.use(express.json({ limit: '50mb' }));\n\n\/\/ Create an instance of the OpenAI class and provide your API key\nconst openai = new OpenAI({\n    apiKey: process.env.OPENAI_API_KEY,\n});\n\n\/\/ Define a function to start the server\nconst startServer = async () =&gt; {\n    app.listen(8080, () =&gt; console.log('Server started on port 8080'));\n};\n\n\/\/ Call the startServer function to begin listening on the specified port\nstartServer();<\/code><\/pre>\n<p>En el c\u00f3digo anterior, importa las bibliotecas necesarias. A continuaci\u00f3n, establece una instancia de la aplicaci\u00f3n Express utilizando <code>const app = express();<\/code>. Despu\u00e9s, habilita CORS. A continuaci\u00f3n, se configura Express para procesar los datos JSON entrantes, especificando un l\u00edmite de tama\u00f1o de datos de <code>50mb<\/code>.<\/p>\n<p>A continuaci\u00f3n, se crea una instancia de la clase OpenAI utilizando tu clave API OpenAI. Crea un archivo <strong>.env<\/strong> en el root de tu proyecto y a\u00f1ade tu clave API utilizando la variable <code>OPENAI_API_KEY<\/code>. Por \u00faltimo, define una funci\u00f3n as\u00edncrona <code>startServer<\/code> y ll\u00e1mala para poner en marcha el servidor.<\/p>\n<p>Ahora ya tienes configurado tu archivo <strong>server.js<\/strong>. Vamos a crear una ruta POST que puedas utilizar en tu aplicaci\u00f3n React para interactuar con este servidor:<\/p>\n<pre><code class=\"language-js\">app.post('\/api', async (req, res) =&gt; {\n    try {\n        const { prompt } = req.body;\n        const response = await openai.images.generate({\n            prompt,\n            n: 1,\n            size: '1024x1024',\n            response_format: 'b64_json',\n        });\n        const image = response.data[0].b64_json;\n        res.status(200).json({ photo: image });\n    } catch (error) {\n        console.error(error);\n    }\n});<\/code><\/pre>\n<p>En este c\u00f3digo, la ruta se establece en <code>\/api<\/code>, y est\u00e1 dise\u00f1ada para gestionar las peticiones POST entrantes. Dentro de la funci\u00f3n de devoluci\u00f3n de llamada de la ruta, recibes los datos enviados desde tu aplicaci\u00f3n React utilizando <code>req.body<\/code> &#8211; concretamente el valor <code>prompt<\/code>.<\/p>\n<p>A continuaci\u00f3n, se invoca el m\u00e9todo <code>images.generate<\/code> de la biblioteca OpenAI. Este m\u00e9todo toma el prompt proporcionado y genera una imagen como respuesta. Par\u00e1metros como <code>n<\/code> determinan el n\u00famero de im\u00e1genes a generar (aqu\u00ed, s\u00f3lo una), <code>size<\/code> especifica las dimensiones de la imagen, y <code>response_format<\/code> indica el formato en el que debe proporcionarse la respuesta (<code>b64_json<\/code> en este caso).<\/p>\n<p>Tras generar la imagen, extraes los datos de la imagen de la respuesta y los almacenas en la variable <code>image<\/code>. A continuaci\u00f3n, env\u00edas una respuesta JSON a la aplicaci\u00f3n React con los datos de la imagen generada, estableciendo el estado HTTP en <code>200<\/code> (indicando \u00e9xito) utilizando <code>res.status(200).json({ photo: image })<\/code>.<\/p>\n<p>Si se produce alg\u00fan error durante este proceso, se ejecuta el c\u00f3digo dentro del bloque <code>catch<\/code>, registrando el error en la consola para su depuraci\u00f3n.<\/p>\n<p>\u00a1Ahora el servidor est\u00e1 listo! Vamos a especificar el comando que se utilizar\u00e1 para ejecutar nuestro servidor en el archivo package.json objeto <code>scripts<\/code>:<\/p>\n<pre><code class=\"language-bash\">\"scripts\": {\n  \"dev:frontend\": \"react-scripts start\",\n  \"dev:backend\": \"nodemon server.js\",\n  \"build\": \"react-scripts build\",\n},<\/code><\/pre>\n<p>Ahora, cuando ejecutes <code>npm run dev:backend<\/code>, tu servidor se iniciar\u00e1 en <a href=\"http:\/\/localhost:8080\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/localhost:8080\/<\/a>, mientras que si ejecutas <code>npm run dev:frontend<\/code>, tu aplicaci\u00f3n React se iniciar\u00e1 en http:\/\/localhost:3000\/. Aseg\u00farate de que ambas se ejecutan en terminales diferentes.<\/p>\n<h2>Hacer Peticiones HTTP desde React al Servidor Node.js<\/h2>\n<p>En el archivo <strong>App.jsx<\/strong>, crear\u00e1s una funci\u00f3n <code>generateImage<\/code> que se activa cuando se pulsa el bot\u00f3n <strong>Generar Imagen<\/strong> en el componente <strong>Form.jsx<\/strong>. Esta funci\u00f3n acepta dos par\u00e1metros: <code>prompt<\/code> y <code>setPrompt<\/code> del componente <strong>Form.jsx.<\/strong><\/p>\n<p>En la funci\u00f3n <code>generateImage<\/code>, haz una petici\u00f3n HTTP POST al servidor Node.js:<\/p>\n<pre><code class=\"language-jsx\">const generateImage = async (prompt, setPrompt) =&gt; {\n    if (prompt) {\n        try {\n            setIsGenerating(true);\n            const response = await fetch(\n                'http:\/\/localhost:8080\/api',\n                {\n                    method: 'POST',\n                    headers: {\n                        'Content-Type': 'application\/json',\n                    },\n                    body: JSON.stringify({\n                        prompt,\n                    }),\n                }\n            );\n            const data = await response.json();\n            setGeneratedImage({\n                photo: `data:image\/jpeg;base64,${data.photo}`,\n                altText: prompt,\n            });\n        } catch (err) {\n            alert(err);\n        } finally {\n            setPrompt('');\n            setIsGenerating(false);\n        }\n    } else {\n        alert('Please provide proper prompt');\n    }\n};<\/code><\/pre>\n<p>En el c\u00f3digo anterior, comprueba si el par\u00e1metro <code>prompt<\/code> tiene un valor y, a continuaci\u00f3n, establece el estado <code>isGenerating<\/code> en <code>true<\/code>, ya que la operaci\u00f3n se est\u00e1 iniciando. Esto har\u00e1 que el cargador aparezca en la pantalla porque en el archivo <strong>App.jsx<\/strong>, tenemos este c\u00f3digo controlando la visualizaci\u00f3n del cargador:<\/p>\n<pre><code class=\"language-jsx\">{isGenerating && (\n    &lt;div&gt; className=\"loader-comp\"&gt;\n        &lt;img src={Loader} alt=\"\" className='loader-img' \/&gt;\n    &lt;\/div&gt;\n)}<\/code><\/pre>\n<p>A continuaci\u00f3n, utiliza el m\u00e9todo <code>fetch()<\/code> para hacer una petici\u00f3n POST al servidor utilizando <a href=\"http:\/\/localhost:8080\/api\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/localhost:8080\/api<\/a> \u2014 esta es la raz\u00f3n por la que instalamos CORS ya que estamos interactuando con una API en otra URL. Utilizamos la solicitud como cuerpo del mensaje. A continuaci\u00f3n, extrae la respuesta devuelta por el servidor Node.js y ponla en el estado <code>generatedImage<\/code>.<\/p>\n<p>Una vez que el estado <code>generatedImage<\/code> tenga un valor, se mostrar\u00e1 la imagen:<\/p>\n<pre><code class=\"language-jsx\">{generatedImage.photo ? (\n    &lt;img\n        src={generatedImage.photo}\n        alt={generatedImage.altText}\n        className=\"imgg ai-img\"\n    \/&gt;\n) : (\n    &lt;img\n        src={preview}\n        alt=\"preview\"\n        className=\"imgg preview-img\"\n    \/&gt;\n)}<\/code><\/pre>\n<p>Este es el aspecto que tendr\u00e1 tu archivo <strong>App.jsx<\/strong> completo:<\/p>\n<pre><code class=\"language-jsx\">import { Form, Footer, Header } from '.\/components';\nimport preview from '.\/assets\/preview.png';\nimport Loader from '.\/assets\/loader-3.gif'\nimport { downloadImage } from '.\/utils';\nimport { useState } from 'react';\n\nconst App = () =&gt; {\n    const [isGenerating, setIsGenerating] = useState(false);\n    const [generatedImage, setGeneratedImage] = useState({\n        photo: null,\n        altText: null,\n    });\n\n    const generateImage = async (prompt, setPrompt) =&gt; {\n        if (prompt) {\n            try {\n                setIsGenerating(true);\n                const response = await fetch(\n                    'http:\/\/localhost:8080\/api',\n                    {\n                        method: 'POST',\n                        headers: {\n                            'Content-Type': 'application\/json',\n                        },\n                        body: JSON.stringify({\n                            prompt,\n                        }),\n                    }\n                );\n                const data = await response.json();\n                setGeneratedImage({\n                    photo: `data:image\/jpeg;base64,${data.photo}`,\n                    altText: prompt,\n                });\n            } catch (err) {\n                alert(err);\n            } finally {\n                setPrompt('');\n                setIsGenerating(false);\n            }\n        } else {\n            alert('Please provide proper prompt');\n        }\n    };\n\n    return (\n        &lt;div className='container'&gt;\n            &lt;Header \/&gt;\n            &lt;main className=\"flex-container\"&gt;\n                &lt;Form generateImage={generateImage} prompt={prompt} \/&gt;\n                &lt;div className=\"image-container\"&gt;\n                    {generatedImage.photo ? (\n                        &lt;img\n                            src={generatedImage.photo}\n                            alt={generatedImage.altText}\n                            className=\"imgg ai-img\"\n                        \/&gt;\n                    ) : (\n                        &lt;img\n                            src={preview}\n                            alt=\"preview\"\n                            className=\"imgg preview-img\"\n                        \/&gt;\n                    )}\n                    {isGenerating && (\n                        &lt;div className=\"loader-comp\"&gt;\n                            &lt;img src={Loader} alt=\"\" className='loader-img' \/&gt;\n                        &lt;\/div&gt;\n                    )}\n                    &lt;button\n                        className=\"btn\"\n                        onClick={() =&gt; downloadImage(generatedImage.photo)}\n                    &gt;\n                        Download\n                    &lt;\/button&gt;\n                &lt;\/div&gt;\n            &lt;\/main&gt;\n            &lt;Footer \/&gt;\n        &lt;\/div&gt;\n    );\n};\n\nexport default App;<\/code><\/pre>\n<h2>Despliega tu Aplicaci\u00f3n Full-Stack en Kinsta<\/h2>\n<p>Hasta ahora, has construido con \u00e9xito una aplicaci\u00f3n React que interact\u00faa con Node.js, lo que la convierte en una aplicaci\u00f3n full-stack. Ahora vamos a desplegar esta aplicaci\u00f3n en Kinsta.<\/p>\n<p>En primer lugar, configura el servidor para que sirva los archivos est\u00e1ticos generados durante el proceso de construcci\u00f3n de la aplicaci\u00f3n React. Esto se consigue importando el m\u00f3dulo <code>path<\/code> y utiliz\u00e1ndolo para servir los archivos est\u00e1ticos:<\/p>\n<pre><code class=\"language-js\">const path = require('path');\n\napp.use(express.static(path.resolve(__dirname, '.\/build')));<\/code><\/pre>\n<p>Cuando ejecutes el comando <code>npm run build && npm run dev:backend<\/code>, tu aplicaci\u00f3n React full stack se cargar\u00e1 en http:\/\/localhost:8080\/. Esto se debe a que la aplicaci\u00f3n React se compila en <a href=\"https:\/\/docs.sevalla.com\/static-sites\/overview\">archivos est\u00e1ticos<\/a> dentro de la carpeta <strong>build<\/strong>. A continuaci\u00f3n, estos archivos se incorporan a tu servidor Node.js como directorio est\u00e1tico. En consecuencia, cuando ejecutes tu servidor Node, la aplicaci\u00f3n estar\u00e1 accesible.<\/p>\n<p>Antes de desplegar tu c\u00f3digo en el proveedor Git que hayas elegido (<a href=\"https:\/\/docs.sevalla.com\/applications\/git\/bitbucket#grant-access-to-the-kinsta-bitbucket-application\">Bitbucket<\/a>, <a href=\"https:\/\/docs.sevalla.com\/applications\/git\/github#authenticate-and-authorize\">GitHub<\/a> o <a href=\"https:\/\/docs.sevalla.com\/applications\/git\/gitlab#authorize-the-kinsta-gitlab-application\">GitLab<\/a>), recuerda modificar la URL de solicitud HTTP en tu archivo <strong>App.jsx<\/strong>. Cambia <code>http:\/\/localhost:8080\/api<\/code> por <code>\/api<\/code>, ya que se a\u00f1adir\u00e1 un prefijo a la URL.<\/p>\n<p>Por \u00faltimo, en tu archivo <strong>package.json<\/strong>, a\u00f1ade un comando script para el servidor Node.js que se utilizar\u00eda para el despliegue:<\/p>\n<pre><code class=\"language-bash\">\"scripts\": {\n  \/\/ \u2026\n  \"start\": \"node server.js\",\n},<\/code><\/pre>\n<p>A continuaci\u00f3n, env\u00eda tu c\u00f3digo a tu proveedor Git preferido y despliega tu repositorio en Kinsta siguiendo estos pasos:<\/p>\n<ol start=\"1\">\n<li>Accede a tu cuenta Kinsta en el panel <a href=\"https:\/\/my.kinqsta.com\/?lang=es\">MyKinsta<\/a>.<\/li>\n<li>Selecciona <strong>Aplicaci\u00f3n<\/strong> en la barra lateral izquierda y haz clic en el bot\u00f3n <strong>A\u00f1adir Aplicaci\u00f3n<\/strong>.<\/li>\n<li>En el modal que aparece, elige el repositorio que quieres desplegar. Si tienes varias ramas, puedes seleccionar la rama deseada y dar un nombre a tu aplicaci\u00f3n.<\/li>\n<li>Selecciona una de las ubicaciones de centros de datos disponibles.<\/li>\n<li>A\u00f1ade el <code>OPENAI_API_KEY<\/code> como variable de entorno. Kinsta crear\u00e1 un Dockerfile autom\u00e1ticamente por ti.<\/li>\n<li>Por \u00faltimo, en el campo de comando de inicio, a\u00f1ade <code>npm run build && npm run start<\/code>. Kinsta instalar\u00e1 las dependencias de tu aplicaci\u00f3n desde <strong>package.json<\/strong>, y luego construir\u00e1 y desplegar\u00e1 tu aplicaci\u00f3n.<\/li>\n<\/ol>\n<h2>Resumen<\/h2>\n<p>En esta gu\u00eda, has aprendido a aprovechar la potencia de la API DALL-E de OpenAI para la generaci\u00f3n de im\u00e1genes. Tambi\u00e9n has aprendido a trabajar con React y Node.js para construir una aplicaci\u00f3n b\u00e1sica full-stack.<\/p>\n<p>Las posibilidades son infinitas con la IA, ya que cada d\u00eda se introducen nuevos modelos, y puedes crear proyectos incre\u00edbles que se pueden desplegar en el <a href=\"https:\/\/sevalla.com\/application-hosting\/\">Alojamiento de Aplicaciones de Kinsta<\/a>.<\/p>\n<p><em>\u00bfQu\u00e9 modelo te gustar\u00eda explorar y sobre qu\u00e9 proyecto te gustar\u00eda que escribi\u00e9ramos pr\u00f3ximamente? Comp\u00e1rtelo en los comentarios.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En el din\u00e1mico panorama de la tecnolog\u00eda, donde la innovaci\u00f3n da forma continuamente a los l\u00edmites de lo posible, la inteligencia artificial (IA) nunca deja de &#8230;<\/p>\n","protected":false},"author":287,"featured_media":70478,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1311,1321],"class_list":["post-70477","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-node-js","topic-react"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Aprende paso a paso c\u00f3mo aprovechar el poder de la inteligencia artificial para generar im\u00e1genes asombrosas en esta completa gu\u00eda.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI\" \/>\n<meta property=\"og:description\" content=\"Aprende paso a paso c\u00f3mo aprovechar el poder de la inteligencia artificial para generar im\u00e1genes asombrosas en esta completa gu\u00eda.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-02T12:11:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-10-09T06:19:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Joel Olawanle\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Aprende paso a paso c\u00f3mo aprovechar el poder de la inteligencia artificial para generar im\u00e1genes asombrosas en esta completa gu\u00eda.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@olawanle_joel\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Olawanle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/\"},\"author\":{\"name\":\"Joel Olawanle\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\"},\"headline\":\"Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI\",\"datePublished\":\"2023-10-02T12:11:41+00:00\",\"dateModified\":\"2023-10-09T06:19:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/\"},\"wordCount\":2403,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/\",\"url\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/\",\"name\":\"Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg\",\"datePublished\":\"2023-10-02T12:11:41+00:00\",\"dateModified\":\"2023-10-09T06:19:27+00:00\",\"description\":\"Aprende paso a paso c\u00f3mo aprovechar el poder de la inteligencia artificial para generar im\u00e1genes asombrosas en esta completa gu\u00eda.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React\",\"item\":\"https:\/\/kinqsta.com\/es\/secciones\/react\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/es\/#website\",\"url\":\"https:\/\/kinqsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\",\"name\":\"Joel Olawanle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g\",\"caption\":\"Joel Olawanle\"},\"description\":\"Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 300 technical articles majorly around JavaScript and it's frameworks.\",\"sameAs\":[\"https:\/\/joelolawanle.com\/\",\"https:\/\/www.linkedin.com\/in\/olawanlejoel\/\",\"https:\/\/x.com\/olawanle_joel\",\"https:\/\/www.youtube.com\/@joelolawanle\"],\"gender\":\"male\",\"knowsAbout\":[\"JavaScript\",\"React\",\"Next.js\"],\"knowsLanguage\":[\"English\"],\"jobTitle\":\"Technical Editor\",\"worksFor\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/es\/blog\/author\/joelolawanle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI - Kinsta\u00ae","description":"Aprende paso a paso c\u00f3mo aprovechar el poder de la inteligencia artificial para generar im\u00e1genes asombrosas en esta completa gu\u00eda.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/","og_locale":"es_ES","og_type":"article","og_title":"Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI","og_description":"Aprende paso a paso c\u00f3mo aprovechar el poder de la inteligencia artificial para generar im\u00e1genes asombrosas en esta completa gu\u00eda.","og_url":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2023-10-02T12:11:41+00:00","article_modified_time":"2023-10-09T06:19:27+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg","type":"image\/jpeg"}],"author":"Joel Olawanle","twitter_card":"summary_large_image","twitter_description":"Aprende paso a paso c\u00f3mo aprovechar el poder de la inteligencia artificial para generar im\u00e1genes asombrosas en esta completa gu\u00eda.","twitter_image":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg","twitter_creator":"@olawanle_joel","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Joel Olawanle","Tiempo de lectura":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/"},"author":{"name":"Joel Olawanle","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07"},"headline":"Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI","datePublished":"2023-10-02T12:11:41+00:00","dateModified":"2023-10-09T06:19:27+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/"},"wordCount":2403,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg","inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/","url":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/","name":"Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinqsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg","datePublished":"2023-10-02T12:11:41+00:00","dateModified":"2023-10-09T06:19:27+00:00","description":"Aprende paso a paso c\u00f3mo aprovechar el poder de la inteligencia artificial para generar im\u00e1genes asombrosas en esta completa gu\u00eda.","breadcrumb":{"@id":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#primaryimage","url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg","contentUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/10\/ai-powered-image-generator-app-with-react-dall-e-1.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/es\/blog\/generador-de-imagenes-ai\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"React","item":"https:\/\/kinqsta.com\/es\/secciones\/react\/"},{"@type":"ListItem","position":3,"name":"Crea una Aplicaci\u00f3n React para la Generaci\u00f3n de Im\u00e1genes con IA utilizando la API DALL-E de OpenAI"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/es\/#website","url":"https:\/\/kinqsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinqsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07","name":"Joel Olawanle","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g","caption":"Joel Olawanle"},"description":"Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 300 technical articles majorly around JavaScript and it's frameworks.","sameAs":["https:\/\/joelolawanle.com\/","https:\/\/www.linkedin.com\/in\/olawanlejoel\/","https:\/\/x.com\/olawanle_joel","https:\/\/www.youtube.com\/@joelolawanle"],"gender":"male","knowsAbout":["JavaScript","React","Next.js"],"knowsLanguage":["English"],"jobTitle":"Technical Editor","worksFor":"Kinsta","url":"https:\/\/kinqsta.com\/es\/blog\/author\/joelolawanle\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/70477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/users\/287"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/comments?post=70477"}],"version-history":[{"count":9,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/70477\/revisions"}],"predecessor-version":[{"id":70661,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/70477\/revisions\/70661"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/70477\/translations\/en"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/70477\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/70477\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/70477\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/70477\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/70477\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/70477\/translations\/it"},{"href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/70477\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/media\/70478"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/media?parent=70477"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/tags?post=70477"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/topic?post=70477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}