使用Unity 接入 Stable-Diffusion-WebUI的 文生图api 并生成图像

news/2024/10/19 11:36:38/

使用Unity 接入 Stable-Diffusion-WebUI 文生图生成图像

文章目录

  • 使用Unity 接入 Stable-Diffusion-WebUI 文生图生成图像
    • 一、前言
    • 二、具体步骤
      • 1、启动SD的api设置
      • 2、unity 创建生图脚本
      • 3、Unity 生图交互配置
        • 步骤 1: 创建sdControl
        • 步骤2:生成后图片画布
        • 步骤3:创建两个输入框
        • 步骤4:sdcontrol赋值
        • 步骤 5: 创建按钮并绑定点击事件
    • 三、测试

一、前言

在无聊的时候,想瞅一下sd生图遂做了一下
在这里插入图片描述
注意:我采用了异步处理,每点击一次发送一次请求,不需要等待生成完再点击。后面生成的画面会覆盖掉之前的。

二、具体步骤

1、启动SD的api设置

在这里插入图片描述

注意,运行后的api相关功能可以在:http://127.0.0.1:7860/docs 查看
在这里插入图片描述

比如这一次我们要的生图的地址就是/sdapi/v1/txt2img 是POST
所以可以通过requests 向 "http://127.0.0.1:7860/sdapi/v1/txt2img"发送POST请求并拿到数据

注意: “http://127.0.0.1:7860/sdapi/v1/txt2img” ,里面的地址和端口在unity中改成你设置的,如果没有改就不动
到这里sd的前期准备就OK了

unity__20">2、unity 创建生图脚本

新建C#脚本,imgsd
注意:

  • “http://127.0.0.1:7860/sdapi/v1/txt2img” 里面的ip和端口与sd中设置的一致
  • sd_model_name = “animePastelDream_softBakedVae” 模型用你自己的模型,如果删掉则用默认你第一个模型。模型文件如:majicmixRealistic_v7.safetensors 则模型名为majicmixRealistic_v7
  • 要用某个魔,需要在sd的web中能看到这个模型,你才能使用api调用。你需要下载模型后放在models文件夹在,参考地址如:sd-webui-aki-v4\models\Stable-diffusion

其他的保持不动即可

using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using System.Text;
using System;
using System.Collections;public class imgsd : MonoBehaviour
{public InputField promptInputField; // 在Inspector中设置public InputField negativePromptInputField; // 在Inspector中设置public RawImage outputImage; // 在Inspector中设置private string txt2imgUrl = "http://127.0.0.1:7860/sdapi/v1/txt2img";// 调用这个方法来开始生成图像的过程public void GenerateImage(){string prompt = promptInputField.text;string negativePrompt = negativePromptInputField.text;StartCoroutine(PostRequest(txt2imgUrl, prompt, negativePrompt));}[Serializable]public class YourResponseType{public string[] images;// 添加其他需要的字段}IEnumerator PostRequest(string url, string prompt, string negativePrompt){var data = new{prompt = prompt,negative_prompt = negativePrompt,sd_model_name = "animePastelDream_softBakedVae"};string jsonData = JsonUtility.ToJson(data);using (UnityWebRequest www = UnityWebRequest.Post(url, UnityWebRequest.kHttpVerbPOST)){byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData);www.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);www.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();www.SetRequestHeader("Content-Type", "application/json");yield return www.SendWebRequest();if (www.result != UnityWebRequest.Result.Success){Debug.LogError($"请求失败: {www.error}");}else{Debug.Log("请求成功");// 解析响应string jsonResponse = www.downloadHandler.text;YourResponseType response = JsonUtility.FromJson<YourResponseType>(jsonResponse);// 假设YourResponseType是你定义的类,用来匹配JSON响应的结构// 显示图像DisplayImage(response.images[0]); // 假设images[0]包含了Base64编码的图像}}}private void DisplayImage(string base64String){byte[] bytes = Convert.FromBase64String(base64String);Texture2D texture = new Texture2D(2, 2);if (texture.LoadImage(bytes)){outputImage.texture = texture;}else{Debug.LogError("图像加载失败");}}
}

3、Unity 生图交互配置

要通过点击事件触发GenerateImage方法,你可以使用Unity的UI系统中的按钮(Button)组件。这里有一个简单的步骤说明如何做到这一点:

步骤 1: 创建sdControl
  1. 在Unity编辑器中,右键点击Hierarchy面板中的空白区域。
  2. 创建一个空对象Create Empty,并改名为sdcontrol。
  3. 将上一步创建的imgsd脚本拖拽到sdcontrol
步骤2:生成后图片画布
  1. 在Unity编辑器中,右键点击Hierarchy面板中的空白区域。
  2. UI->Raw Image ``
步骤3:创建两个输入框
  1. 在Unity编辑器中,右键点击Hierarchy面板中的空白区域。
  2. UI->Legacy -> input fileld ``
  3. UI->Legacy -> input fileld ``
    执行两次,创建两个输入框
    注:UI ->如果没有Legacy 那就UI -> input fileld
步骤4:sdcontrol赋值

在这里插入图片描述

步骤 5: 创建按钮并绑定点击事件
  1. 在Unity编辑器中,右键点击Hierarchy面板中的空白区域。

  2. 选择UI -> Button。这将自动创建一个Canvas(如果尚未存在),button的text改为生成

  3. 选中你刚刚创建的按钮对象。

  4. 在Inspector面板中找到Button (Script)组件。

  5. 拖拽包含TextToImageRequest脚本的GameObject(即你将该脚本附加到的对象)到Button (Script)组件下方的OnClick()列表中。

  6. 点击OnClick()列表旁边的加号(+)来添加一个新的条目。

  7. 在新条目的None (Object)字段中,确保包含TextToImageRequest脚本的GameObject被选中。

  8. 然后点击旁边的下拉菜单,选择TextToImageRequest -> GenerateImage

三、测试

  • 进入Play模式,输入prompt 点击按钮,这应该会触发GenerateImage方法,从而开始图像生成的过程。
    在这里插入图片描述

注:如果发现生成了画面,但与实际的不符,请尝试输入另外一个框,再试着点击一次。因为两个框依次代表,prompt 和native prompt如果输错了框会导致生成效果不理想。


http://www.ppmy.cn/news/1427572.html

相关文章

【树莓派学习】hello,world!

系统安装及环境配置详见【树莓派学习】系统烧录及VNC连接、文件传输-CSDN博客 树莓派内置python3&#xff0c;可以直接利用python输出。

solidity入门

Solidity 是以太坊智能合约开发的主要编程语言&#xff0c;支持多种数据类型&#xff0c;其中数组是一种非常常用和灵活的数据结构。在本教程中&#xff0c;我们将深入探讨 Solidity 中数组的各种类型、创建规则以及常见操作。 ### 固定长度数组 固定长度数组在声明时指定了数…

[Linux_IMX6ULL驱动开发]-总线设备驱动模型

目录 框架分层 总线驱动模型实现 上层驱动代码(leddrv.c)的实现以及解析 交叉依赖的避免 下层驱动的设备文件(board_A_led.c)的实现 下层驱动的驱动文件(chip_demo_gpio.c)的实现 框架分层 在之前&#xff0c;我们对于驱动的框架有过两种不同的框架。第一种框架&#xf…

python爬虫-----深入了解 requests 库下篇(第二十五天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

拓展网络技能:利用lua-http库下载www.linkedin.com信息的方法

引言 在当今的数字时代&#xff0c;网络技能的重要性日益凸显。本文将介绍如何使用Lua语言和lua-http库来下载和提取LinkedIn网站的信息&#xff0c;这是一种扩展网络技能的有效方法。 背景介绍 在当今科技潮流中&#xff0c;Lua语言以其轻量级和高效的特性&#xff0c;不仅…

JavaScript 作用域链详细解析

JavaScript 作用域链&#xff08;Scope Chain&#xff09;是一种变量和函数查找机制&#xff0c;它决定了在某个执行环境中变量和函数的可访问性。当访问一个变量或函数时&#xff0c;JavaScript 引擎会首先在当前的执行环境中查找&#xff0c;如果找不到则会向上级执行环境中继…

Postman之全局变量与环境变量配置

实际开发中可能需要不停切换环境&#xff0c;接口中来回输入环境地址比较麻烦&#xff0c;故而通过定义变量来节约频繁更换测试地址所耗费的时间。Postman 允许定义自己的全局变量&#xff08;Globals&#xff09;与环境变量&#xff08;Environment&#xff09;&#xff0c;最…

excel多sheet导出工具类——java

excel多sheet导出工具类 1、多个sheet导出工具类&#xff1a; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.user…