」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 ReactJS 建立免費的 AI 圖像生成器

使用 ReactJS 建立免費的 AI 圖像生成器

發佈於2024-11-08
瀏覽:783

开发者们大家好,
今天,我将向您展示如何使用 ReactJS 创建图像生成器,并且完全可以免费使用,这要感谢黑森林实验室和 Together AI。

第 1 步:设置项目

在本教程中,我们将使用 Vite 来初始化应用程序并使用 Shadcn 来初始化 UI。我假设您已经设置了项目并安装了 Shadcn。

第 2 步:安装 Together AI 软件包

我们需要安装Together AI包来访问免费的Flux模型来生成图像。
在终端中运行以下命令

npm i together-ai

第 3 步:构建用户界面

现在,让我们为我们的应用程序创建 UI。以下是图像生成器组件的完整代码。它包括提示的文本输入。用于选择宽高比的下拉菜单。
请记住,我们需要使用“black-forest-labs/FLUX.1-schnell-Free”,因为它是免费的。

import { useRef, useState } from "react";
import Together from "together-ai";
import { ImagesResponse } from "together-ai";
import { Button } from "@/components/ui/button";
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from "@/components/ui/select";
import { Textarea } from "@/components/ui/textarea";
import { motion } from "framer-motion";
import { Separator } from "@/components/ui/separator";
import { DownloadIcon } from "@radix-ui/react-icons";
import { save } from "@tauri-apps/plugin-dialog";
import { writeFile } from "@tauri-apps/plugin-fs";

function App() {
  const [input, setInput] = useState("");
  const [imageUrl, setImageUrl] = useState("");
  const [ratio, setRatio] = useState("9:16");
  const [isLoading, setIsLoading] = useState(false);
  const [downloading, setDownloading] = useState(false);
  const imageRef = useRef(null);

  const hRatio = ratio.split(":").map(Number)[0];
  const vRatio = ratio.split(":").map(Number)[1];

  const width = hRatio === 1 ? 512 : hRatio * 64;
  const height = vRatio === 1 ? 512 : vRatio * 64;

  const together = new Together({
    apiKey: import.meta.env.VITE_TOGETHER_API_KEY,
  });

  const handleGenerateImage = async () => {
    setIsLoading(true);

    try {
      console.log(width, height);
      const response: ImagesResponse = await together.images.create({
        model: "black-forest-labs/FLUX.1-schnell-Free",
        prompt: input,
        width: width,
        height: height,
        // @ts-expect-error response_format is not defined in the type
        response_format: "b64_json",
      });

      const base64Image = response.data[0].b64_json;
      const dataUrl = `data:image/png;base64,${base64Image}`;
      setImageUrl(dataUrl);
    } catch (error) {
      console.error("Error generating image:", error);
      // You might want to add some error handling UI here
    } finally {
      setIsLoading(false);
    }
  };

  const handleDownloadImage = async () => {
    if (imageUrl) {
      setDownloading(true);
      try {
        // Remove the data URL prefix
        const base64Data = imageUrl.replace(/^data:image\/\w ;base64,/, "");

        // Convert base64 to binary
        const imageBuffer = Uint8Array.from(atob(base64Data), (c) =>
          c.charCodeAt(0)
        );

        // Open a save dialog
        const filePath = await save({
          filters: [
            {
              name: "Image",
              extensions: ["png"],
            },
          ],
        });

        if (filePath) {
          // Write the file
          await writeFile(filePath, imageBuffer);
          console.log("File saved successfully");
        }
      } catch (error) {
        console.error("Error saving image:", error);
      } finally {
        setDownloading(false);
      }
    }
  };

  return (
    

AI Image Generator for "Thảo"

Generated Image

{imageUrl ? ( Generated
) : (

Your generated image will appear here

)}
); } export default App;

Build a Free AI Image Generator with ReactJS

Build a Free AI Image Generator with ReactJS

最后的想法

通过此设置,您现在拥有一个简单的 ReactJS 应用程序,可以生成和下载 AI 生成的图像。
感谢您的阅读!如果您觉得这篇文章有趣,请不要犹豫,点个赞。快乐编码!

版本聲明 本文轉載於:https://dev.to/nhd2106/image-generator-app-for-free-2p0d?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 何時在 JavaScript Promise 中使用 Promise.reject 與 Throw?
    何時在 JavaScript Promise 中使用 Promise.reject 與 Throw?
    JavaScript Promise:Reject 與Throw 之謎使用JavaScript Promise 時,開發人員經常面臨一個困境:他們是否應該使用Promise . reject 或者只是拋出一個錯誤?雖然這兩種方法具有相似的目的,但關於它們的差異和潛在優勢仍然存在混淆。 探索相似之處最...
    程式設計 發佈於2024-11-08
  • 建立 Chrome 擴充功能:快速概述
    建立 Chrome 擴充功能:快速概述
    模组——修改? 如果您喜欢游戏,您就会知道没有什么比玩模组游戏更好的了。这是您最喜欢的游戏,但具有额外的功能、功能和乐趣。现在,想象一下为您的网络浏览体验带来同样的兴奋。这正是浏览器扩展的作用——它们就像浏览器的模组,以您从未想过的方式增强浏览器的功能。 通过 Chrome 扩展程序,您可以调整浏览...
    程式設計 發佈於2024-11-08
  • 如何使用 CSS 設定表格列寬?
    如何使用 CSS 設定表格列寬?
    設定表格列寬表格通常用於呈現表格數據,但調整列寬對於確保可讀性和正確性至關重要結盟。在本文中,我們將探討如何使用 CSS 設定表格列的寬度。 使用 CSS 寬度屬性的方法表格列的寬度可以使用 col 元素的 width 屬性進行設定。寬度值可以以像素為單位指定(例如 width: 200px;),也...
    程式設計 發佈於2024-11-08
  • 如何從 Python 中的巢狀函數存取非局部變數?
    如何從 Python 中的巢狀函數存取非局部變數?
    存取嵌套函數作用域中的非局部變數在Python 中,嵌套函數作用域提供對封閉作用域的訪問。但是,嘗試修改巢狀函數內封閉範圍內的變數可能會導致 UnboundLocalError。 要解決此問題,您有多種選擇:1。使用 'nonlocal' 關鍵字 (Python 3 ):對於 Pyt...
    程式設計 發佈於2024-11-08
  • 使用 CSS 將漸層應用於文字。
    使用 CSS 將漸層應用於文字。
    文字漸變 現在你可以在很多地方看到像文字漸變這樣的好技巧......但是呢?你有沒有想過它們是如何製作的?今天就讓我來教你。 .text-gradient { background: linear-gradient(-25deg, #5662f6 0%, #7fffd4 10...
    程式設計 發佈於2024-11-08
  • 如何在Python中執行自訂區間舍入?
    如何在Python中執行自訂區間舍入?
    Python 中捨入為自訂間隔在 Python 中,內建 round() 函數通常用於對數值進行舍入。然而,它採用以 10 為基數的捨入方案,這可能並不總是適合特定要求。例如,如果您想將數字四捨五入到最接近的 5 倍數,則標準 round() 函數不合適。 要解決此問題,可以建立自訂函數,將數值四捨...
    程式設計 發佈於2024-11-08
  • 項目 注意字串連接效能
    項目 注意字串連接效能
    1。使用運算子 ( ) 連接字串: 使用運算子連接字串對於少量連接來說很方便,但由於字串的不變性,在大規模操作時會出現效能問題。 每次建立新字串時,都會複製所有先前字串的內容,從而導致大型連接的時間成二次方。 不正確的例子(與 重複連接): public String criaFatura(Li...
    程式設計 發佈於2024-11-08
  • 如何解決 Wamp 伺服器中的橘色圖示問題:識別服務故障並對其進行故障排除
    如何解決 Wamp 伺服器中的橘色圖示問題:識別服務故障並對其進行故障排除
    解決Wamp Server 中頑固的橙色圖標解決Wamp Server 中頑固的橙色圖標在Web 開發領域,WampServer 圖標旁邊出現橙色圖標可以成為令人沮喪的橙色路障。此持久性圖示通常表示啟動 Apache 或 MySQL 服務失敗,使您陷入開發困境。 識別罪魁禍首:Apache 或 My...
    程式設計 發佈於2024-11-08
  • 網路基礎知識
    網路基礎知識
    In the world of system design, networks are the glue that binds different components together. Whether you're building a web application, a distribute...
    程式設計 發佈於2024-11-08
  • Python 初學者教學:學習基礎知識
    Python 初學者教學:學習基礎知識
    欢迎来到Python编程的奇妙世界!如果您是编码新手,请系好安全带,因为 Python 是最简单但最强大的语言之一。无论您是想自动执行繁琐的任务、构建 Web 应用程序还是深入研究数据科学,Python 都是您成功编码的门户。 在本初学者指南中,我们将引导您完成 Python 的基本构建块,确保您准...
    程式設計 發佈於2024-11-08
  • 如何提取MySQL字串中第三個空格之後的子字串?
    如何提取MySQL字串中第三個空格之後的子字串?
    MySQL:提取字串中的第三個索引要使用MySQL 定位字串中第三個空格的索引,一種方法是利用SUBSTRING_INDEX 函數。此函數可以提取直到指定分隔符號(在本例中為空格字元)的子字串。 要隔離第三個空格,您可以使用兩個巢狀的 SUBSTRING_INDEX 呼叫。內部函數呼叫檢索從字串開頭...
    程式設計 發佈於2024-11-08
  • 如果無法存取已指派的空間,為什麼要為 ArrayList 設定初始大小?
    如果無法存取已指派的空間,為什麼要為 ArrayList 設定初始大小?
    了解 ArrayList 中的初始大小在 Java 中,ArrayList 是動態數組,可以根據需要增長和縮小。可以使用建構子 new ArrayList(10) 指定 ArrayList 的初始大小,其中 10 表示所需的容量。 但是,設定初始大小並未授予立即存取已指派空間的權限。與傳統陣列不同,...
    程式設計 發佈於2024-11-08
  • 如何在不改變系統設定的情況下使Python 2.7成為Linux中的預設版本?
    如何在不改變系統設定的情況下使Python 2.7成為Linux中的預設版本?
    Linux 中的預設 Python 版本:選擇 Python 2.7在 Linux 系統上運行多個 Python 版本是常見的情況。然而,瀏覽預設版本有時可能會很困難。本文討論如何在終端機上鍵入「python」命令時將 Python 2.7 設為預設版本。 預設 Python 更改的評估更改預設 P...
    程式設計 發佈於2024-11-08
  • 如何根據多個條件對 Go 中具有嵌套切片的結構切片進行排序?
    如何根據多個條件對 Go 中具有嵌套切片的結構切片進行排序?
    使用嵌套切片對結構體切片進行排序在Go 中,您可以使用內建的排序包對自訂結構體切片進行排序。考慮以下程式碼,它定義了兩個結構體 Parent 和 Child,表示父子關係:type Parent struct { id string children []Child } ...
    程式設計 發佈於2024-11-08
  • C# | Web Api 的提示和技巧
    C# | Web Api 的提示和技巧
    筆記 您可以查看我個人網站上的其他帖子:https://hbolajraf.net Web Api 的提示和技巧 用 C# 建立 Web API 是創建可擴展且高效的後端服務的強大方法。以下是一些提示和技巧,可協助您充分利用 C# Web API 開發。 1.使...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3