手把手教你创建一个基于OpenAI和React的图片生成器(支持中文)

news/2024/7/15 6:38:36 标签: react.js, javascript, 前端, ecmascript, 前端框架

a84f1907021c8cd1492f60574cdc0c4a.png

Midjourney 创作,未来AI机器人

欢迎来到人工智能应用的世界!在本文中,我们将探索使用React和强大的OpenAI平台创建图像生成器应用程序的激动人心机会。无论你是初学者还是经验丰富的开发人员,你都将学习如何利用机器学习的力量,只需几行代码即可生成令人惊叹的图像。从构建前端界面到集成OpenAI API,我们将为您逐步介绍整个过程。那么,让我们开始,发现如何使用OpenAI创建基于人工智能的React图像生成器应用程序!

项目设置

让我们通过使用Vite设置新的React应用程序来构建我们的基于人工智能的React图像生成器应用程序。确保在您的系统上安装了Node.js和Yarn,并开始执行以下命令:

$ yarn create vite

接着,Vite将启动生成过程,并要求您输入一个项目名称:

dd1e71aff3c082c2a719edeb590e4335.jpeg

在下一步中,Vite会要求您选择一个框架。您可以使用键盘上的箭头键选择“React”选项,然后再次按回车键。最后,您需要决定使用哪个React项目。在本文的示例中,我们选择了“JavaScript + SWC”选项。

延伸阅读:什么是JavaScript + SWC?

"JavaScript + SWC" 是一个React项目的变体,其中 "SWC" 是指一个JavaScript编译器。在这个配置中,SWC编译器将用于编译JavaScript代码,以提高React应用程序的性能和执行效率。相比较于其他选项,例如 "TypeScript" 或者 "JavaScript + Babel",使用 "JavaScript + SWC" 可以获得更好的性能和更快的编译速度。

ef2a3fc4c46c711609e0a6b9faee5385.jpeg

使用以下命令进入新生成的项目文件夹:

$ cd react-image-gen

在该文件夹中执行 "yarn" 命令,确保所有依赖项都被下载并安装在项目文件夹中:

$ yarn

此外,我们需要确保将 "openai" 包添加到React项目中,以便能够访问OpenAI API:

$ yarn add openai

输入以下命令,可以启动开发Web服务器:

$ yarn dev

一旦服务器启动,您应该能够在浏览器中看到此默认项目:

db9d37302a54ce4f5f58139026117bbd.jpeg

清理原有代码

让我们清理默认代码。打开 src/App.jsx 并删除除以下基本 App 组件结构以外的所有内容:

import { useState } from 'react'
import './App.css'

function App() {
  return (
    <div className="App">
      <h1>React AI Image Generator</h1>
      <div className="card"></div>
      <p className="read-the-docs">
        Powered by OpenAI
      </p>
    </div>
  )
}

export default App

19566be27457613ddfb1e41d35bf67d5.jpeg

应用程序的实现

现在是时候开始实现React应用程序了。

首先,在 App.jsx 顶部插入另一个导入语句:

import { Configuration, OpenAIApi } from 'openai'

该代码从 openai 包中导入了两个对象,Configuration 和 OpenAIApi。接下来,在 App 组件内部插入以下代码:

const [prompt, setPrompt] = useState('')
const [result, setResult] = useState('')
const [loading, setLoading] = useState(false)

该代码使用 useState hook 在 App 组件中定义了三个状态变量。

prompt 是一个字符串状态变量,最初设置为空字符串。它用于存储将发送给 OpenAI API 以生成图像或文本的文本提示。

result 也是一个字符串状态变量,最初设置为空字符串。它用于存储发送提示后由 OpenAI API 返回的结果。

loading 是一个布尔状态变量,最初设置为 false。它用于指示当前是否正在进行与 OpenAI API 的请求。当 loading 设置为 true 时,表示请求正在进行中,而当它设置为 false 时,表示请求已完成或尚未启动。

useState hook 是一个内置的React hook,允许您向函数组件添加状态。它返回一个包含当前状态值和更新状态值的函数的数组。setPrompt、setResult 和 setLoading 函数用于更新它们各自的状态变量。

让我们继续实现,并将以下代码添加到 App 组件中:

const configuration = new Configuration({
    apiKey: import.meta.env.VITE_OPENAI_API_KEY,
  })

  const openai = new OpenAIApi(configuration);

该代码创建了两个对象,configuration 和 openai。

configuration 是从 openai 包导入的 Configuration 类的一个实例。它需要一个对象作为参数,该对象具有一个名为 apiKey 的属性。该属性的值是从
import.meta.env.VITE_OPENAI_API_KEY 变量中获取的。

VITE_OPENAI_API_KEY 包含用于访问OpenAI API的API密钥。为了使此环境变量可用,您需要在React项目的根文件夹中创建一个名为 .env 的新文件。在该文件中,您需要按以下方式设置此环境变量为您的个人OpenAI API密钥:

VITE_OPENAI_API_KEY=[INSERT YOUR OPENAI API KEY HERE]

要检索您的OpenAI API密钥,您需要在 https://openai.com/ 上创建一个用户帐户,并在OpenAI仪表板中访问API密钥部分以创建一个新的API密钥。

94c2da5bbaa7a82e6e1f9135181bcae9.jpeg

OpenAIApi 也是从 openai 包中导入的一个类。openai 是该类的一个实例,它是通过传递配置对象作为参数来创建的。

Configuration 类用于设置OpenAI API的必要配置,例如API密钥。OpenAIApi 类用于与OpenAI API交互,例如发送请求以生成图像或文本。

然后将配置对象作为参数传递给 OpenAIApi 类的构造函数,创建一个该类的实例,可用于与 OpenAI API 交互。

现在,让我们在 App 组件中创建一个用于生成图像的函数:

// 定义一个生成图像的异步函数
const generateImage = async () => {
  // 开始请求,设置 loading 为 true
  setLoading(true)

  // 调用 OpenAI API 创建图像,使用 prompt、n 和 size 作为参数
  const response = await openai.createImage({
    prompt: prompt, // 文本提示
    n: 1, // 生成图像的数量
    size: "512x512", // 生成图像的大小
  })

  // 请求结束,设置 loading 为 false
  setLoading(false)

  // 从响应数据中获取图像的 URL,存储到 result 状态变量中
  setResult(response.data.data[0].url)
}

该代码定义了一个名为 generateImage 的函数,它是一个异步函数,用于向 OpenAI API 发送请求,根据用户提供的提示生成图像。

该函数首先使用 setLoading 函数将 loading 状态变量设置为 true,以指示请求正在进行中。接下来,它使用 openai.createImage 方法(OpenAIApi 类提供的方法)向 OpenAI API 发送请求。请求包含提示、n(要生成的图像数量)和图像大小。一旦收到响应,该函数使用 setLoading 函数将 loading 状态变量设置为 false,以表示请求已完成。然后,它使用 setResult 函数使用生成的图像的 URL 更新 result 状态变量。该 URL 可以用于在前端显示图像。最后,我们需要扩展从 App 组件返回的 JSX 代码,以构建用户界面:

return (
  <div className="app">
    <h1>React AI Image Generator</h1>

    {/* 如果 loading 状态变量为 true,则显示正在生成图像的提示 */}
    {loading ? (
      <h2>正在生成图像,请稍候!</h2>
    ) : (
      // 否则什么也不显示
      <></>
    )}

    <div className="card">
      {/* 输入文本框 */}
      <textarea
        className="text-input"
        placeholder="输入提示"
        onChange={(e) => setPrompt(e.target.value)}
        row="5"
        cols="50"
      />

      {/* 生成图像按钮 */}
      <button className="button" onClick={generateImage}>
        生成图像
      </button>

      {/* 如果 result 状态变量中有图像的 URL,则显示生成的图像 */}
      {result.length > 0 ? (
        <img className="result-image" src={result} alt="生成的图像" />
      ) : (
        // 否则什么也不显示
        <></>
      )}
    </div>

    <p className="footer">Powered by OpenAI</p>
  </div>
)

这个 JSX 代码定义了渲染 React 应用程序用户界面的组件的结构。它返回一个 class 为 "app" 的 div 元素。它包含一个带有文本 "React AI Image Generator" 的标题 h1,它是应用程序的标题。然后它有一个三元运算符,它检查 loading 状态变量的值。如果为 true,则显示一个带有文本 "正在生成图像,请稍候!" 的 h2 元素,表示正在进行图像生成请求。如果为 false,则返回空的 JSX 元素 <></>。

在 div 元素内部,它有另一个 class 为 "card" 的 div 元素。该元素包含一个 textarea 元素,它用作文本输入区域,具有占位符 "输入提示" 和一个 onChange 事件,调用 setPrompt 函数并传递文本区域的值作为参数。它还包含一个带有 class 为 "button" 的 button 元素,当单击时,它调用 generateImage 函数。

然后它有另一个三元运算符,检查 result 状态变量的长度是否大于 0。如果为 true,则显示一个 img 元素,该元素是生成的图像,其 src 属性设置为 result 状态变量,并具有 alt 属性 "生成的图像"。如果为 false,则返回一个空的 JSX 元素 <></>。

这个 JSX 代码定义了组件的 UI,使用状态变量和函数来控制应用程序的 UI 和流程。

完整源代码

以下是 React AI Image Generator 应用程序的完整源代码:

import { useState } from 'react'
import { Configuration, OpenAIApi } from 'openai'
import './App.css'

function App() {
    // 定义三个 state 变量,分别表示输入框中的提示,生成的结果图片 URL 和加载状态
    const [prompt, setPrompt] = useState('')
    const [result, setResult] = useState('')
    const [loading, setLoading] = useState(false)

    // 创建 Configuration 实例,用于配置 OpenAI API 的 API Key
    const configuration = new Configuration({
        apiKey: import.meta.env.VITE_OPENAI_API_KEY,
    })

    // 创建 OpenAIApi 实例,用于和 OpenAI API 进行交互
    const openai = new OpenAIApi(configuration);

    // 定义生成图片的异步函数
    const generateImage = async () => {
        setLoading(true) // 开始请求,将加载状态设为 true
        // 发送请求并等待响应结果,结果中包含了生成的图片的 URL
        const response = await openai.createImage({
            prompt: prompt, // 提示文本
            n: 1, // 生成图片的数量
            size: "512x512", // 生成图片的大小
        });
        setLoading(false) // 请求结束,将加载状态设为 false
        setResult(response.data.data[0].url) // 将响应结果中的图片 URL 存储到 state 变量 result 中
    };

    // 返回应用程序的 UI
    return (
        <div className="app">
            <h1>ReactAI 图片生成器</h1>
            {loading ? ( // 如果正在加载,则显示“图片生成中...”的提示
                <h2> 正在生成图像,请稍候!</h2>
            ) : (<></>)}
            <div className="card">
        <textarea
            className="text-input"
            placeholder="输入提示词"
            onChange={(e) => setPrompt(e.target.value)} // 当文本框的值改变时,更新 state 变量 prompt
            row="5"
            cols="50"
        />
                <button className="button" onClick={generateImage}>生成图片</button> {/* 点击按钮时,调用异步函数 generateImage */}
                {result.length > 0 ? ( // 如果有生成的图片,则显示图片
                    <img className="result-image" src={result} alt="Generated Image" />
                ) : (
                    <></>
                )}
            </div>
            <p className="footer">
                Powered by OpenAI
            </p>
        </div>
    )
}

export default App

这段代码是应用程序的CSS样式代码,用于定义应用程序中各个元素的样式和布局。(src/App.css:)

/* 根元素的样式 */
#root {
  max-width: 1280px; /* 最大宽度为 1280 像素 */
  margin: 0 auto; /* 自动居中 */
  padding: 2rem; /* 上下左右内边距为 2 个 rems */
  text-align: center; /* 文字居中 */
}

/* 应用程序的样式 */
.app {
  display: flex; /* 设置弹性盒子 */
  flex-direction: column; /* 垂直排列子元素 */
  align-items: center; /* 子元素水平居中 */
}

/* 输入框的样式 */
.text-input {
  height: 50px; /* 高度为 50 像素 */
  width: 100%; /* 宽度为父元素的宽度 */
  margin-bottom: 20px; /* 下边距为 20 像素 */
  border: 2px solid lightgrey; /* 边框为 2 像素的浅灰色 */
  padding: 10px; /* 内边距为 10 像素 */
  font-size: 14px; /* 字体大小为 14 像素 */
  border-radius: 5px; /* 圆角半径为 5 像素 */
}

/* 结果图片的样式 */
.result-image {
  margin-top: 20px; /* 上边距为 20 像素 */
  border: 2px solid lightgray; /* 边框为 2 像素的浅灰色 */
  padding: 10px; /* 内边距为 10 像素 */
  width: 100%; /* 宽度为父元素的宽度 */
}

/* 卡片的样式 */
.card {
  padding: 2em; /* 上下左右内边距为 2 个 em */
  display: flex; /* 设置弹性盒子 */
  flex-direction: column; /* 垂直排列子元素 */
}

/* 底部文字的样式 */
.footer {
  color: #888; /* 文字颜色为浅灰色 */
}

测试应用程序

现在是时候测试我们的应用程序了。在浏览器中访问应用程序,您现在应该能够看到以下用户界面:

6af8817feaab542aa4cce883f56cf878.png

请尝试输入一个文本提示,描述您希望OpenAI生成的图片。(支持中文哦)

bf6159625de116996ceb73ea59b665df.png

点击“生成图片”按钮,生成图片需要几秒钟时间,生成完成后您将在网页上看到生成的图片

是不是很有趣,虽然和Midjourney有差距,但不至于像百度那样,不知道付费的GPT4接口会怎么样,我使用的是免费的GPT3接口:

bbee17ed6f3bea3e73d19c662329d2b4.png

结束

本篇博客向你展示了如何使用OpenAI API在React中构建一个AI图像生成器应用。通过本篇博客,你学会了如何创建一个视觉上引人注目的前端界面,并使用OpenAI API生成图像。通过这个应用程序,你现在可以按需生成图像,并将它们用于各种应用程序,如社交媒体、营销活动甚至艺术项目。希望这篇教程对你有所帮助,激发了你对其他AI项目的实验兴趣。祝你编程愉快!

今天的分享就到这里,感谢你的阅读,希望能够帮助到你,文章创作不易,如果你喜欢我的分享,别忘了点赞转发,让更多有需要的人看到,最后别忘记关注「前端达人」,你的支持将是我分享最大的动力,后续我会持续输出更多内容,敬请期待。

原文:
https://medium.com/codingthesmartway-com-blog/create-an-ai-powered-react-image-generator-app-using-openai-79b575d6b808

作者:Sebastian

非直接翻译,有自行改编和添加部分,翻译水平有限,难免有疏漏,欢迎指正


http://www.niftyadmin.cn/n/186853.html

相关文章

bitmap的六种压缩方式,Android图片压缩

Android中图片是以bitmap形式存在的&#xff0c;那么bitmap所占内存&#xff0c;直接影响到了应用所占内存大小&#xff0c;首先要知道bitmap所占内存大小计算方式&#xff1a; 图片长度 x 图片宽度 x 一个像素点占用的字节数 以下是图片的压缩格式&#xff1a; 其中&#xf…

章节2 行走数据江湖,只需一行代码

目录8. 数据筛选、过滤&#xff0c;[绘图前的必备功课]8.1 excel操作8.2 Python操作http://sa.mentorx.net 蔓藤教育8. 数据筛选、过滤&#xff0c;[绘图前的必备功课] 8.1 excel操作 筛选&#xff0c;18<年龄<30的学生的分数状况&#xff0c;且分数>80的学生 全部…

通过接口封装Shopee商品列表、shopee详情、shopee评论数据接口代码展示教程

业务背景&#xff1a;作为全球最大的 B2C 电子商务平台之一&#xff0c;Shopee 平台提供了丰富的商品资源&#xff0c;吸引了大量的全球买家和卖家。为了方便开发者接入 Shopee 平台&#xff0c;Shopee 平台提供了丰富的 API 接口&#xff0c;其中商品详情接口是非常重要的一部…

【C/C++实现生产者消费者模式】

文章目录概要&#xff1a;本期主要学习使用WINAPI中的信号量机制来实现生产者消费者模式。一、WINAPI中的信号量机制1.创建信号量![在这里插入图片描述](https://img-blog.csdnimg.cn/71e49ae08b8a4156a1aaeef8185bd71f.png)2.释放信号量3.等待信号量二、生产者消费者模型三、代…

English Learning - L2 语音作业打卡 复习 [u:] [i:] Day38 2023.3.30 周四

English Learning - L2 语音作业打卡 复习 [u:] [i:] Day38 2023.3.30 周四&#x1f48c;发音小贴士&#xff1a;&#x1f48c;当日目标音发音规则/技巧:后元音 [u:]前元音 [i:]&#x1f36d; Part 1【热身练习】&#x1f36d; Part2【练习内容】&#x1f36d;【练习感受】&…

【机器学习】Logistic回归---学习笔记

Logistic回归学习笔记Logistic回归学习线路预备知识&#xff1a;建议先去B站学习一下信息量&#xff0c;熵&#xff0c;BL散度&#xff0c;交叉熵的概念。Logistic回归的函数模型损失最小化架构分类函数最大概率分类函数阈值分类函数Logistic回归的优化算法梯度下降随机梯度下降…

8_linux系统中的软件管理

8_linux系统中的软件管理 文章目录8_linux系统中的软件管理一、Linux中软件包的类型二、软件包的名称结构三、rpm命令管理软件包四、本地软件仓库的搭建搭建方法五、dnf 软件管理命令安装管理包下载安装包六、网络软件仓库的搭建搭建方法七、第三方软件仓库的搭建方法步骤一、L…

Mac环境下安装Pod

Mac环境下安装Pod Mac环境下安装Pod-阿里云开发者社区 (aliyun.com) 简介&#xff1a; Mac 环境下安装Pod&#xff0c;Pod安装需要ruby&#xff0c;ruby需要rvm可以终端中查看rvm 安装没有 如果没有安装则按以下步骤安装 rvm安装 $ curl -L https://get.rvm.io | bash -s st…