【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,一个简单、高效且强大的…

HarmonyOS知识点

HarmonyOS应用模型Stage&FA 、ArkTS、ArkUI Stage模型: Module - UIAbility - Page - component 装饰器Entry、Component、CustomDialog、State、关键字struct、函数build() 系统组件(Text Column Row Scroll)、自定义组件 、组件复用、…

速盾:CDN是否支持屏蔽IP?

CDN(内容分发网络)是一种用于提高网站性能和可靠性的技术,通过将内容分发到距离终端用户更近的节点,减少了数据传输的延迟并提高了用户体验。在CDN中,屏蔽IP是一项重要的功能,可以帮助网站屏蔽无效或恶意请…

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…

学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着

ArcGIS水文分析实战教程(7)细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程(6)河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程(5)细说流向与流量-CSDN博客 ArcGIS …

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

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

gitHub常用操作

gitHub常用操作 1、把项目拉下来2、添加上游仓库3、进入分支4、从上游仓库拉取更新 1、把项目拉下来 在对应项目的右上角点击fork,fork下来:将远程仓库复制到个人仓库 在创建好的分支文件夹下使用 git clone自己远程仓库下的http地址(fork…

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

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

Android开发实战班 -网络编程 - Retrofit 网络请求 + OkHttp 使用详解

在现代 Android 应用开发中,网络编程是必不可少的一部分。Retrofit 是 Square 公司推出的一款类型安全的 HTTP 客户端库,简化了与 RESTful API 的交互。Retrofit 基于 OkHttp,并提供了简洁的接口定义和强大的功能,如异步请求、请求…

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. 带来经济损失,尤其是后付费客户,风险巨大,造…

Dart:字符串

字符串:单双引号 String c hello \c\; // hello c,单引号中使用单引号,需要转义\ String d "hello c"; // hello c,双引号中使用单引号,不需要转义 String e "hello \“c\”"; // hell…

使用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.运行项目…

从0安装mysql server

安装 MySQL Server 首先,你需要在 Ubuntu 上安装 MySQL 服务器。运行以下命令来安装:sudo apt update sudo apt install mysql-server安装完成后,MySQL 服务会自动启动。你可以通过以下命令检查 MySQL 服务是否正在运行: sudo systemctl status mysql如果 MySQL 正在运行,…