AI 生成: 一个基于Flask的AI一句话生成图片、图标、Logo的Web应用,使用Pollinations AI免费图像生成API。

This commit is contained in:
admin
2026-09-29 18:09:39 +08:00
commit 50e35d42c0
6 changed files with 564 additions and 0 deletions
+105
View File
@@ -0,0 +1,105 @@
# -*- coding: utf-8 -*-
"""
AI 图片生成器 - Flask 后端
使用 Pollinations AI 免费接口,一句话生成图片/图标/Logo
"""
import urllib.parse
import requests
from flask import Flask, jsonify, render_template, request
app = Flask(__name__)
# Pollinations AI 免费图像生成接口
POLLINATIONS_URL = "https://image.pollinations.ai/prompt/{prompt}"
# 图片类型对应的提示词前缀
TYPE_PREFIX = {
"image": "a high quality image of",
"icon": "a clean flat icon of",
"logo": "a minimalist logo design of",
}
# 风格对应的提示词后缀
STYLE_SUFFIX = {
"realistic": "realistic, detailed, 4k, photographic",
"cartoon": "cartoon style, colorful, cute, flat illustration",
"watercolor": "watercolor painting, soft colors, artistic",
"cyberpunk": "cyberpunk style, neon lights, futuristic, sci-fi",
"minimal": "minimalist, clean, simple, flat design, white background",
}
# 尺寸映射(宽 x 高)
SIZE_MAP = {
"square": (1024, 1024),
"landscape": (1280, 768),
"portrait": (768, 1280),
}
@app.route("/")
def index():
"""渲染首页"""
return render_template("index.html")
@app.route("/api/generate", methods=["POST"])
def generate():
"""生成图片接口"""
data = request.get_json(silent=True) or {}
prompt = (data.get("prompt") or "").strip()
img_type = data.get("type", "image")
size = data.get("size", "square")
style = data.get("style", "realistic")
# 参数校验
if not prompt:
return jsonify({"success": False, "error": "请输入图片描述"}), 400
if img_type not in TYPE_PREFIX:
img_type = "image"
if size not in SIZE_MAP:
size = "square"
if style not in STYLE_SUFFIX:
style = "realistic"
# 组装完整提示词
full_prompt = f"{TYPE_PREFIX[img_type]} {prompt}, {STYLE_SUFFIX[style]}"
width, height = SIZE_MAP[size]
encoded_prompt = urllib.parse.quote(full_prompt)
image_url = (
f"{POLLINATIONS_URL.format(prompt=encoded_prompt)}"
f"?width={width}&height={height}&nologo=true&seed={_random_seed()}"
)
# 预检图片是否可访问(Pollinations 有时会延迟生成)
try:
head = requests.head(image_url, timeout=30, allow_redirects=True)
if head.status_code >= 400:
return jsonify({
"success": False,
"error": f"图像服务返回异常状态:{head.status_code},请稍后重试",
}), 502
except requests.RequestException as exc:
return jsonify({
"success": False,
"error": f"无法连接图像服务:{exc}",
}), 502
return jsonify({
"success": True,
"image_url": image_url,
"prompt": full_prompt,
})
def _random_seed() -> int:
"""生成随机种子,避免相同提示词返回相同图片"""
import random
return random.randint(1, 10_000_000)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)