ToB企服应用市场:ToB评测及商务社交产业平台

标题: 利用Unity 接入 Stable-Diffusion-WebUI的 文生图api 并生成图像 [打印本页]

作者: 乌市泽哥    时间: 2024-6-11 11:05
标题: 利用Unity 接入 Stable-Diffusion-WebUI的 文生图api 并生成图像
利用Unity 接入 Stable-Diffusion-WebUI 文生图生成图像


  
一、前言

在无聊的时间,想瞅一下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了
2、unity 创建生图脚本

新建C#脚本,imgsd
注意:

其他的保持不动即可
  1. using UnityEngine;
  2. using UnityEngine.Networking;
  3. using UnityEngine.UI;
  4. using System.Text;
  5. using System;
  6. using System.Collections;
  7. public class imgsd : MonoBehaviour
  8. {
  9.     public InputField promptInputField; // 在Inspector中设置
  10.     public InputField negativePromptInputField; // 在Inspector中设置
  11.     public RawImage outputImage; // 在Inspector中设置
  12.     private string txt2imgUrl = "http://127.0.0.1:7860/sdapi/v1/txt2img";
  13.     // 调用这个方法来开始生成图像的过程
  14.     public void GenerateImage()
  15.     {
  16.         string prompt = promptInputField.text;
  17.         string negativePrompt = negativePromptInputField.text;
  18.         StartCoroutine(PostRequest(txt2imgUrl, prompt, negativePrompt));
  19.     }
  20.     [Serializable]
  21.     public class YourResponseType
  22.     {
  23.         public string[] images;
  24.         // 添加其他需要的字段
  25.     }
  26.     IEnumerator PostRequest(string url, string prompt, string negativePrompt)
  27.     {
  28.         var data = new
  29.         {
  30.             prompt = prompt,
  31.             negative_prompt = negativePrompt,
  32.             sd_model_name = "animePastelDream_softBakedVae"
  33.         };
  34.         string jsonData = JsonUtility.ToJson(data);
  35.         using (UnityWebRequest www = UnityWebRequest.Post(url, UnityWebRequest.kHttpVerbPOST))
  36.         {
  37.             byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData);
  38.             www.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
  39.             www.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
  40.             www.SetRequestHeader("Content-Type", "application/json");
  41.             yield return www.SendWebRequest();
  42.             if (www.result != UnityWebRequest.Result.Success)
  43.             {
  44.                 Debug.LogError($"请求失败: {www.error}");
  45.             }
  46.             else
  47.             {
  48.                 Debug.Log("请求成功");
  49.                 // 解析响应
  50.                 string jsonResponse = www.downloadHandler.text;
  51.                 YourResponseType response = JsonUtility.FromJson<YourResponseType>(jsonResponse);
  52.                 // 假设YourResponseType是你定义的类,用来匹配JSON响应的结构
  53.                 // 显示图像
  54.                 DisplayImage(response.images[0]); // 假设images[0]包含了Base64编码的图像
  55.             }
  56.         }
  57.     }
  58.     private void DisplayImage(string base64String)
  59.     {
  60.         byte[] bytes = Convert.FromBase64String(base64String);
  61.         Texture2D texture = new Texture2D(2, 2);
  62.         if (texture.LoadImage(bytes))
  63.         {
  64.             outputImage.texture = texture;
  65.         }
  66.         else
  67.         {
  68.             Debug.LogError("图像加载失败");
  69.         }
  70.     }
  71. }
复制代码
3、Unity 生图交互设置

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

步骤2:生成后图片画布

步骤3:创建两个输入框

步骤4:sdcontrol赋值


步骤 5: 创建按钮并绑定点击事件

三、测试


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4