【AI图像生成网站Golang】图床上传与图像生成API搭建

embedded/2024/11/20 4:16:40/

AI图像生成网站

目录

一、项目介绍

二、雪花算法

三、JWT认证与令牌桶算法

四、项目架构

五、图床上传与图像生成API搭建

六、项目测试与调试(等待更新)


五、图床上传与图像生成API搭建

在项目中,我们通过整合 Go 和 FastAPI 实现了图像的上传和生成功能。本文将介绍该功能模块的设计与实现细节,主要包括图床上传 API 和图像生成 API 的开发。

1. 图床上传

        SM.MS 是一个免费的在线图床服务,提供简单快速的图片上传和托管功能。用户可以通过 API 上传图片并获取公开访问的链接,这在构建需要处理图片的应用程序时非常方便。
        本项目的注册、创建分组、图像生成和作品上传等功能中,均使用到了SMMS图床服务提供的API,通过将本地 Base64 编码的图片文件上传到图床,来获取图像的永久链接。

上传流程

  • Base64 解码:将用户上传的图片从 Base64 编码格式转换为二进制流。
  • 多部分表单提交:通过 multipart/form-data 格式上传图片文件,适配 SM.MS API 的接口要求。
  • API Token 授权:使用 Authorization 头携带 API Token 确保安全性。

代码如下:

// UploadImageToSMMS 上传图像到 SM.MS 图床
func UploadImageToSMMS(base64Image string) (string, error) {url := "https://sm.ms/api/v2/upload"if strings.HasPrefix(base64Image, "data:image") {base64Image = strings.Split(base64Image, ",")[1]}// 将 Base64 图片解码为文件字节流decodedImage, err := base64.StdEncoding.DecodeString(base64Image)if err != nil {return "", fmt.Errorf("Base64 解码失败: %v", err)}// 创建一个缓冲区和多部分表单写入器body := &bytes.Buffer{}writer := multipart.NewWriter(body)// 创建文件字段part, err := writer.CreateFormFile("smfile", "image.png")if err != nil {return "", fmt.Errorf("创建文件字段失败: %v", err)}_, err = part.Write(decodedImage)if err != nil {return "", fmt.Errorf("写入文件字段失败: %v", err)}// 关闭多部分表单写入器err = writer.Close()if err != nil {return "", fmt.Errorf("关闭多部分表单写入器失败: %v", err)}// 创建 HTTP 请求req, err := http.NewRequest("POST", url, body)if err != nil {return "", fmt.Errorf("创建请求失败: %v", err)}// 使用 SM.MS 提供的 API Token 进行授权req.Header.Add("Authorization", settings.Conf.SmmsToken)req.Header.Add("Content-Type", writer.FormDataContentType())client := &http.Client{}res, err := client.Do(req)if err != nil {return "", err}defer res.Body.Close()// 读取响应体responseData, err := io.ReadAll(res.Body)if err != nil {return "", fmt.Errorf("读取响应失败: %v", err)}// 解析 JSON 响应var result map[string]interface{}if err := json.Unmarshal(responseData, &result); err != nil {return "", fmt.Errorf("解析响应错误: %v", err)}// 检查上传状态并获取图像 URLsuccess := result["success"].(bool)if !success {return "", fmt.Errorf("图像上传失败: %v", result["message"])}data := result["data"].(map[string]interface{})imageURL := data["url"].(string)return imageURL, nil
}

2. 图像生成API搭建

        InstructPix2Pix 是一种基于 Stable Diffusion 的模型,该模型依赖强大的 Transformer 和扩散模型架构,可以确保生成图像的质量和多样性。
        该模型的工作原理是将用户提供的一张初始图像和文本描述作为输入,通过多个扩散步骤,将噪声逐渐转化为符合指令的图像,最终输出经过编辑后的高质量图像。
        项目使用了 Python 的 FastAPI 和 StableDiffusionInstructPix2PixPipeline 实现搭建了一个图像生成API,这种方式较调用在线的图像生成API来说步骤简单,方便调试。

该API具体的实现如下所示:

  • 图片下载: 通过 URL 获取用户上传的图片,确保输入格式统一。
  • 模型加载: 加载预训练的 InstructPix2Pix 模型,使用 GPU 提升推理速度。
  • 图像编辑: 根据用户指令生成新的图像。
  • 返回结果: 将生成的图像转换为 Base64 格式返回给调用端。
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from io import BytesIO
from PIL import Image, ImageOps
import requests
import base64
import torch
from diffusers import StableDiffusionInstructPix2PixPipeline# 加载模型
model_id = "timbrooks/instruct-pix2pix"
pipe = StableDiffusionInstructPix2PixPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe.to("cuda")class ImageRequest(BaseModel):url: strprompt: strapp = FastAPI()def download_image(url):response = requests.get(url)if response.status_code != 200:raise HTTPException(status_code=400, detail="无法下载图像")return Image.open(BytesIO(response.content)).convert("RGB")@app.post("/generate")
async def generate_image(request: ImageRequest):image = download_image(request.url)generated_image = pipe(prompt=request.prompt, image=image, num_inference_steps=10).images[0]buffered = BytesIO()generated_image.save(buffered, format="PNG")img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")return {"image": img_str}

模型调整细节

  • 可以通过减少扩散步数(如设置 num_inference_steps=10)平衡生成质量与效率。
  • 调整生成参数(如 guidance_scale)可以控制图像编辑强度。

API启动命令行:

uvicorn api文件名称:app --host 0.0.0.0 --port 端口号

Golang调用本地图像生成API代码:

package apiimport ("bytes""encoding/json""fmt""io/ioutil""net/http"
)type ImageRequest struct {URL    string `json:"url"`Prompt string `json:"prompt"`
}type ImageResponse struct {Image string `json:"image"`
}// InstructPix2Pix 发送请求到 Python API 生成图像
func InstructPix2Pix(prompt, url string) (string, error) {// 将请求参数序列化为 JSONrequestBody, err := json.Marshal(ImageRequest{URL:    url,Prompt: prompt,})if err != nil {return "", fmt.Errorf("序列化请求数据失败: %v", err)}// 向 Python API 发送 POST 请求resp, err := http.Post("http://localhost:8001/generate", "application/json", bytes.NewBuffer(requestBody))if err != nil {return "", fmt.Errorf("请求 Python API 失败: %v", err)}defer resp.Body.Close()// 读取响应体body, err := ioutil.ReadAll(resp.Body)if err != nil {return "", fmt.Errorf("读取响应失败: %v", err)}// 检查响应状态码if resp.StatusCode != http.StatusOK {return "", fmt.Errorf("图像生成失败: %s", body)}// 解析响应中的图像数据var imageResponse ImageResponseerr = json.Unmarshal(body, &imageResponse)if err != nil {return "", fmt.Errorf("解析响应数据失败: %v", err)}return imageResponse.Image, nil
}

http://www.ppmy.cn/embedded/138963.html

相关文章

计算机网络之表示层

一、定义与概述 在计算机网络中,OSI(Open Systems Interconnection)模型是一种广泛接受的分层模型,用于描述网络通信的各个方面。这个模型将网络通信划分为七个不同的层次,每一层都负责特定的任务,以确保数…

java中设计模式的使用(持续更新中)

概述 设计模式的目的:编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有…

在vue3中如何优雅的管理loading状态

时隔多日,我又来了。近期工作实在是太忙了,基本处于天天加班的状态,整个人都麻木了,导致最近一直没有更新什么东西,感觉都快荒废了。还好,这两天处于下个项目开发前,当前项目已提测,…

热点更新场景,OceanBase如何实现性能优化

案例背景 这个案例来自一个保险行业的客户:他们的核心系统底层采用了OceanBase数据库作为存储解决方案,然而,在系统上线运行后,出现了一个异常情况,执行简单的主键更新语句时SQL执行时间出现了显著的波动。为了迅速定…

算法编程题-golang语言协程池

算法编程题-golang语言协程池 协程池代码实现 实现线程池或者协程池是面试经常需要手写的题型。本文将介绍协程池如何实现。 协程池 池化技术是很重要的一种思想,将一些频繁使用但是创建开销比较大的对象自定义保存起来,反复使用,典型的有线…

unity小:shaderGraph不规则涟漪、波纹效果

实现概述 在本项目中,我们通过结合 Sine、Polar Coordinates 和 Time 节点,实现了动态波纹效果。以下是实现细节: 核心实现 Sine 波形生成: 使用 Sine 节点生成基本的波形。该节点能够创建周期性变化,为波纹效果提供…

不同规模的企业需要部署哪种组网?

针对不同规模的企业,合理的企业组网方式可以帮助优化网络性能和管理效率。以下是适合各类企业的组网建议。 一、小型企业(少于50用户) 选择经济实用的网络设备 小型企业可选择简单、成本合理的网络设备,如家庭路由器或小型商用路由…

前端学习八股资料CSS(三)

更多详情:爱米的前端小笔记,更多前端内容,等你来看!这些都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们的支持才是我不断更新的动力!找…