Files
skills_repo/event-publisher/scripts/generate_image.sh
jeremygan2021 f5117a90d1 first commit
2026-03-04 19:24:05 +08:00

273 lines
8.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 图片生成脚本 - 活动发布 skill
# 使用豆包大模型根据活动内容生成提示词,然后生成海报
# 包含自动添加Logo、保存规范提示词
# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(dirname "$SCRIPT_DIR")"
ASSETS_DIR="$SKILL_DIR/assets"
# 确保 assets 目录存在
mkdir -p "$ASSETS_DIR"
# 加载环境变量
if [ -f "$SCRIPT_DIR/.env" ]; then
source "$SCRIPT_DIR/.env"
elif [ -f "$SKILL_DIR/.env" ]; then
source "$SKILL_DIR/.env"
fi
# 脚本路径
PROMPT_SCRIPT="$SCRIPT_DIR/generate_prompt.sh"
LOGO_SCRIPT="$SCRIPT_DIR/add_logo.py"
LOGO_FILE="$ASSETS_DIR/quant-speed.svg"
# 默认值
DOUBAO_API_KEY="${DOUBAO_API_KEY:-db1f8b60-0ffc-473c-98da-40daa3a95df8}"
NANOBANANA_API_KEY="${NANOBANANA_API_KEY:-sk-Cx883TlPrrn0nUvQFmU5wSt99OFv7tiIhg4Re5yHttNtN1Am}"
NANOBANANA_BASE_URL="${NANOBANANA_BASE_URL:-http://zx2.52youxi.cc:3000}"
# 辅助函数添加Logo
add_logo_to_image() {
local image_path="$1"
if [ -f "$LOGO_SCRIPT" ] && [ -f "$LOGO_FILE" ]; then
echo " 🔄 正在添加Logo..."
python3 "$LOGO_SCRIPT" "$image_path" "$LOGO_FILE"
else
echo " ⚠️ Logo脚本或文件不存在跳过添加Logo"
fi
}
# 辅助函数:保存提示词
save_prompt_info() {
local image_path="$1"
local prompt="$2"
local model="$3"
local timestamp=$(date +%Y-%m-%dT%H:%M:%S%z)
local txt_file="${image_path}.txt"
echo "Image: $(basename "$image_path")
Prompt: $prompt
Model: $model
Timestamp: $timestamp" > "$txt_file"
echo " 💾 提示词已保存: $(basename "$txt_file")"
}
# 使用AI生成提示词
generate_ai_prompts() {
local event_content="$1"
echo "======================================"
echo "🤖 步骤1: 使用豆包AI生成海报提示词"
echo "======================================"
echo ""
# 调用AI生成提示词
local result=$(bash "$PROMPT_SCRIPT" ai "$event_content")
# 提取提示词
local doubao_prompt=$(echo "$result" | grep "DOUBAO_PROMPT=" | sed 's/DOUBAO_PROMPT=//')
local nano_prompt=$(echo "$result" | grep "NANO_PROMPT=" | sed 's/NANO_PROMPT=//')
if [ -z "$doubao_prompt" ] || [ -z "$nano_prompt" ]; then
echo "❌ AI提示词生成失败使用默认提示词"
doubao_prompt="春节游园会,新春庆典,红灯笼,中国结,舞狮,烟花,喜庆氛围,节日活动"
nano_prompt="春节,新年,现代简约设计,扁平化风格,渐变色,孟菲斯风格"
fi
echo "✅ AI提示词生成成功"
echo ""
echo "📝 豆包提示词: ${doubao_prompt:0:80}..."
echo "📝 创意提示词: ${nano_prompt:0:80}..."
echo ""
# 返回提示词
echo "DOUBAO_PROMPT=$doubao_prompt"
echo "NANO_PROMPT=$nano_prompt"
}
# 生成豆包图片3张变体
generate_doubao_images() {
local base_prompt="$1"
local event_name="$2"
echo "======================================"
echo "🎨 步骤2: 生成豆包海报3张变体"
echo "======================================"
echo ""
# 生成3个不同的提示词变体
local prompts=$(bash "$PROMPT_SCRIPT" variations "$base_prompt")
local prompt1=$(echo "$prompts" | sed -n '1p')
local prompt2=$(echo "$prompts" | sed -n '2p')
local prompt3=$(echo "$prompts" | sed -n '3p')
echo " 提示词变体1: ${prompt1:0:60}..."
echo " 提示词变体2: ${prompt2:0:60}..."
echo " 提示词变体3: ${prompt3:0:60}..."
echo ""
local timestamp=$(date +%Y%m%d_%H%M%S)
local success_count=0
# 生成3张图片
for i in 1 2 3; do
local prompt_var=$(eval echo \$prompt$i)
local output_file="$ASSETS_DIR/${event_name}_豆包版${i}_${timestamp}.jpg"
echo ">>> 生成第 $i 张..."
response=$(curl -s -X POST "https://ark.cn-beijing.volces.com/api/v3/images/generations" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DOUBAO_API_KEY" \
-d "{
\"model\": \"doubao-seedream-5-0-260128\",
\"prompt\": \"$prompt_var\",
\"sequential_image_generation\": \"disabled\",
\"response_format\": \"url\",
\"size\": \"2K\",
\"stream\": false,
\"watermark\": true
}")
image_url=$(echo "$response" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data'][0]['url'] if d.get('data') else '')" 2>/dev/null)
if [ -n "$image_url" ]; then
curl -s -o "$output_file" "$image_url"
echo " ✅ 第 $i 张已保存: ${output_file}"
# 添加Logo
add_logo_to_image "$output_file"
# 保存提示词
save_prompt_info "$output_file" "$prompt_var" "doubao-seedream-5-0-260128"
success_count=$((success_count + 1))
else
echo " ❌ 第 $i 张生成失败"
fi
done
echo ""
echo "✅ 豆包图片生成完成!成功 $success_count/3 张"
}
# 生成 Nanobanana 图片
generate_nanobanana_image() {
local prompt="$1"
local event_name="$2"
echo "======================================"
echo "🎨 步骤3: 生成 Nanobanana 海报(创意版)"
echo "======================================"
echo ""
echo " 提示词: ${prompt:0:60}..."
echo ""
local timestamp=$(date +%Y%m%d_%H%M%S)
local output_file="$ASSETS_DIR/${event_name}_创意版_${timestamp}.png"
response=$(curl -s -X POST "${NANOBANANA_BASE_URL}/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $NANOBANANA_API_KEY" \
-d "{
\"model\": \"gemini-3-pro-image-preview\",
\"messages\": [{\"role\": \"user\", \"content\": \"生成一张图片:$prompt\"}],
\"max_tokens\": 4000
}")
# 提取base64图片数据
img_data=$(echo "$response" | python3 -c "
import sys, json, re
import base64
try:
d = json.load(sys.stdin)
content = d['choices'][0]['message']['content']
match = re.search(r'data:image/(\w+);base64,(.+)', content, re.DOTALL)
if match:
img_type = match.group(1)
img_b64 = match.group(2).strip()
img_bytes = base64.b64decode(img_b64)
import base64 as b64mod
print(b64mod.b64encode(img_bytes).decode('utf-8'))
except Exception as e:
print('')
" 2>/dev/null)
if [ -n "$img_data" ]; then
echo "$img_data" | base64 -d > "$output_file" 2>/dev/null
echo "✅ Nanobanana 图片已保存: $output_file"
# 添加Logo
add_logo_to_image "$output_file"
# 保存提示词
save_prompt_info "$output_file" "$prompt" "gemini-3-pro-image-preview"
else
echo "❌ Nanobanana 图片生成失败"
fi
}
# 根据活动内容生成所有海报
generate_posters_from_content() {
local event_content="$1"
local event_name="$2"
echo "======================================"
echo "🎉 开始生成活动海报"
echo "======================================"
echo ""
# 步骤1: AI生成提示词
local prompts=$(generate_ai_prompts "$event_content")
local doubao_prompt=$(echo "$prompts" | grep "DOUBAO_PROMPT=" | sed 's/DOUBAO_PROMPT=//')
local nano_prompt=$(echo "$prompts" | grep "NANO_PROMPT=" | sed 's/NANO_PROMPT=//')
# 步骤2: 生成豆包图片
generate_doubao_images "$doubao_prompt" "$event_name"
echo ""
# 步骤3: 生成Nanobanana图片
generate_nanobanana_image "$nano_prompt" "$event_name"
echo ""
echo "======================================"
echo "✅ 全部海报生成完成!"
echo "======================================"
echo ""
echo "📁 所有图片保存位置: $ASSETS_DIR"
echo ""
echo "请选择您喜欢的海报版本:"
echo " 1 - 豆包版1"
echo " 2 - 豆包版2"
echo " 3 - 豆包版3"
echo " 4 - 创意版"
}
# 根据参数调用对应函数
case "$1" in
ai)
generate_ai_prompts "$2"
;;
doubao)
generate_doubao_images "$2" "$3"
;;
nanobanana)
generate_nanobanana_image "$2" "$3"
;;
all)
generate_posters_from_content "$2" "$3"
;;
*)
echo "======================================"
echo "🖼️ 活动海报生成工具"
echo "======================================"
echo "用法: $0 all <活动文案> <活动名称>"
echo ""
echo "示例: "
echo ' $0 all "活动名称:春节游园会..." "春节游园会"'
;;
esac