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

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.mzph.cn/pingmian/61369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 Docker Compose 安装 WireGuard UI

简介 wireguard是什么?维基百科是这样描述的: WireGuard是一种实现加密虚拟专用网络(VPN) 的通信协议和免费开源软件,其设计目标是易于使用,高速性能和低攻击面。它旨在比IPsec和OpenVPN这两种常见的隧道协议具有更好的性能和更…

IM项目-----客户端网络通讯流程

文章目录 前言数据中心类数据持久化网络通信类http客户端websocket客户端 前言 对即时通信系统客户端部分的网络通讯流程的总结。 数据中心类 通过model/datacenter.h 中的DataCenter 类来管理所有客⼾端需要的数据.这是⼀个单例类. 这里管理一份数据有两个作用,1…

软件测试—— Selenium 常用函数(一)

前一篇文章:软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中,我们介绍了自动化的一些基础知识&a…

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议: webSocket协议: 1.2WebSocket协议: 1.3客户端(浏览器)实现 1.3.2 WebSocket对象的相关事宜: 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…

【图像分割】SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers

SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers 论文链接:http://arxiv.org/abs/2105.15203 代码链接:https://github.com/NVlabs/SegFormer 一、摘要 文中提出了SegFormer,一个简单、高效且强大的…

Linux修改/etc/hosts不起作用(ping: xxx: Name or service not known)的解决方法——开启NSCD

​ 问题描述 起因是我在实验室云资源池的一台虚拟机(CentOS 8.5)上的/etc/hosts文件中为Fabric网络节点的域名指定了IP: IP可以ping通,但是ping域名时提示ping: xxx: Name or service not known。 问题本身应该是Linux通用的&a…

OpenTelemetry 赋能DevOps流程的可观测性革命

原作者:天颇 原出处:微信公众号 乘云数字DATABUFF 原文地址:https://mp.weixin.qq.com/s/D_f31EBtLu7Rr0gahuF-bw 引言 在当今快节奏的软件开发和运维环境中,DevOps 已经成为主流,它通过整合开发和运维流程&#xff0…

windows 和 linux检查操作系统基本信息

windows检查操作系统基本信息 systeminfolinux检查操作系统基本信息 获取系统位数 getconf LONG_BIT查询操作系统release信息 lsb_release -a查询系统信息 cat /etc/issue查询系统名称 uname -a

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手 简介: Aurora是一个带UI且免费的GPT私人聊天助手,可切换GPT-3.5,4,4o等常用版本。用户可通过部署Aurora,快速打造自己专属的AI助手。阿里云计算巢已将Aurora打包为SaaS…

ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解

ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解 目录 ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解效果分析基本介绍程序设计参考资料效果分析 基本介绍 (创新独家)ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模 态分解ASFSSA-VMD:优化VMD分解层数K和惩罚因子a…

Unity脚本基础规则

Unity脚本基础规则 如何在Unity中创建一个脚本文件? 在Project窗口中的Assets目录下,选择合适的文件夹,右键,选择第一个Create,在新出现的一栏中选择C# Script,此时文件夹内会出现C#脚本图标,…

【新华妙笔-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

使用vscode+expo+Android夜神模拟器运行react-native项目

1.进入夜神模拟器安装路径下的bin目录 2.输入命令,连接Android Studio 启动夜神模拟器后, 打开安装目录的bin文件夹执行下面的命令,只需执行一次) nox_adb.exe connect 127.0.0.1:62001adb connect 127.0.0.1:62001 3.运行项目…

Linux进阶:软件安装、网络操作、端口、进程等

软件安装 yum 和 apt 均需要root权限 CentOS系统使用: yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y,自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…

linux先创建文件夹后指定创建文件夹用户

1、创建文件夹,然后创建用户并指定用户目录,然后修改目录所有权给该目录 # 创建 /home/test 目录 mkdir /home/test # 设置权限(确保有适当的读写权限) chown root:root /home/test chmod 700 /home/test # 创建 xl 用户并指定家…

记录下,用油猴Tampermonkey监听所有请求,绕过seesion

油猴Tampermonkey监听所有请求,绕过seesion 前因后果脚本编写 前因后果 原因是要白嫖一个网站的接口,这个接口的页面入口被隐藏掉了,不能通过页面调用,幸好之前有想过逆向破解通过账号密码模拟登录后拿到token,请求该…

【LINUX相关】

一、Linux怎么进行查看日志? 首先得问问开发项目日志存放在哪里,可以使用多种命令来查看日志。常用的命令包括tail、cat、less和grep等。例如:1、使用tail命令可以实时查看日志文件的最新内容:tail -f log_file, 2、使用cat命令可…

LiveGBS流媒体平台GB/T28181常见问题-作为下级级联到海康大华宇视等第三方国标平台若需要提供国标编号、地址、端口号怎么办?

LiveGBS国标GB/T28181流媒体平台作为下级级联到海康大华宇视等第三方国标平台若需要提供国标编号、地址、端口号怎么办? 1、背景2、提供国标编号、地址、端口号3、搭建GB28181视频直播平台 1、背景 有篇博文曾经介绍过,LiveGBS国标视频平台支持GB/T2818…

【ArcGIS微课1000例】0132:从多个GIS视角认识与攀登珠穆朗玛峰

文章目录 1. Map Viewer中打开2. 场景查看器中打开3. ArcGIS中打开4. QGIS中打开5. Globalmapper中打开6. ArcGIS Earth中打开官网地址:https://www.arcgis.com/home/item.html?id=504a23373ab84536b7760c0add1e0c1c 1. Map Viewer中打开 以下展示不同底图样式的珠穆朗玛峰壮…

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代,小程序租赁系统应运而生,成为企业管理租赁业务的一种新选择。随着移动互联网的普及,越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…