统计
  • 建站日期:2022-01-17
  • 分类总数:43 个
  • 文章总数:7046 篇
  • 评论总数:62626条
  • 最后更新:2天前

千寻百念ai绘画网页版(提示词扩展)

作者头像
首页 综合教程 正文
广告

一款集成多平台AI绘画API的智能创作工具,支持提示词智能扩展与多样化绘画风格。

image.png

核心功能
智能提示词扩展

AI自动扩展:输入简单关键词(如”猫”、”森林”、”夕阳”),AI自动扩展成80-120字的专业绘画描述
本地智能降级:当AI服务不可用时,自动启用本地智能扩展库,支持9大类常见主题
多维度描述:自动生成包含主体特征、场景环境、光线色彩、氛围情感、动态细节的完整描述
扩展示例:
输入:小狗
输出:一只活泼的橘色小狗欢快地奔跑在翠绿的草坪的草地上,清晨的明媚阳光穿过云层,在草地上投下斑驳的光影,小狗灵动的毛发在微风中轻轻飘动,它尾巴着,琥珀色的眼眸透露着纯真与快乐,微风拂过树梢的沙沙声从远处传来,时光仿佛在此刻凝固,整片一金黄色,宁静而祥和,梦境般的仙境

丰富的绘画风格
支持10+种专业绘画风格,一键切换:

风格类型 特点描述
默认 通用AI绘画风格
写实 照片级真实感
油画 经典艺术质感
水彩 清新柔和画风
素描 黑白线条艺术
卡通 可爱动漫风格
赛博朋克 未来科技感
奇幻 魔法幻想世界
印象派 光影色彩流动
抽象 创意抽象表达
灵活的尺寸选择
支持4种常用画布尺寸:

1:1 正方形 – 适合头像、图标
16:9 横屏 – 适合壁纸、横幅
9:16 竖屏 – 适合手机壁纸、海报
4:3 经典 – 传统画幅比例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <title>AI智能绘画 - 千寻百念AI v2.0</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 15px;
            position: relative;
        }

        /* 背景动态气泡 */
        body::before {
            content: '';
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: 
                radial-gradient(circle at 20% 50%, rgba(255, 255, 255, 0.1) 0%, transparent 50%),
                radial-gradient(circle at 80% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 50%);
            pointer-events: none;
            z-index: 0;
        }

        .container {
            background: rgba(255, 255, 255, 0.95);
            backdrop-filter: blur(20px);
            -webkit-backdrop-filter: blur(20px);
            border-radius: 25px;
            box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
            padding: 30px;
            max-width: 1000px;
            width: 100%;
            position: relative;
            z-index: 1;
            border: 1px solid rgba(255, 255, 255, 0.3);
        }

        h1 {
            text-align: center;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            background-clip: text;
            margin-bottom: 8px;
            font-size: 28px;
            font-weight: 700;
        }

        .subtitle {
            text-align: center;
            color: #666;
            margin-bottom: 25px;
            font-size: 13px;
        }

        .input-section {
            margin-bottom: 20px;
        }

        .input-group {
            margin-bottom: 15px;
            position: relative;
        }

        .input-with-button {
            position: relative;
            display: flex;
            gap: 10px;
        }

        .input-with-button input {
            flex: 1;
        }

        .btn-ai-generate {
            padding: 14px 20px;
            background: linear-gradient(135deg, #FF6B6B 0%, #FF8E53 100%);
            color: white;
            border: none;
            border-radius: 12px;
            font-size: 14px;
            font-weight: 600;
            cursor: pointer;
            transition: all 0.3s;
            box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3);
            white-space: nowrap;
            display: flex;
            align-items: center;
            gap: 6px;
        }

        .btn-ai-generate:hover {
            transform: translateY(-2px);
            box-shadow: 0 6px 20px rgba(255, 107, 107, 0.4);
        }

        .btn-ai-generate:active {
            transform: translateY(0);
        }

        .btn-ai-generate:disabled {
            background: linear-gradient(135deg, #ccc 0%, #999 100%);
            cursor: not-allowed;
            transform: none;
            box-shadow: none;
        }

        label {
            display: block;
            margin-bottom: 8px;
            color: #333;
            font-weight: 600;
            font-size: 14px;
        }

        input[type="text"], select {
            width: 100%;
            padding: 14px 16px;
            border: 2px solid rgba(102, 126, 234, 0.2);
            border-radius: 12px;
            font-size: 15px;
            transition: all 0.3s;
            background: rgba(255, 255, 255, 0.8);
            backdrop-filter: blur(10px);
        }

        input[type="text"]:focus, select:focus {
            outline: none;
            border-color: #667eea;
            background: rgba(255, 255, 255, 1);
            box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1);
        }

        select {
            cursor: pointer;
        }

        .btn-generate {
            width: 100%;
            padding: 14px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            border: none;
            border-radius: 12px;
            font-size: 16px;
            font-weight: 600;
            cursor: pointer;
            transition: all 0.3s;
            box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
        }

        .btn-generate:hover {
            transform: translateY(-2px);
            box-shadow: 0 6px 20px rgba(102, 126, 234, 0.5);
        }

        .btn-generate:active {
            transform: translateY(0);
        }

        .btn-generate:disabled {
            background: linear-gradient(135deg, #ccc 0%, #999 100%);
            cursor: not-allowed;
            transform: none;
            box-shadow: none;
        }

        .loading {
            display: none;
            text-align: center;
            margin-top: 20px;
        }

        .loading.active {
            display: block;
        }

        .spinner {
            border: 4px solid rgba(102, 126, 234, 0.2);
            border-top: 4px solid #667eea;
            border-radius: 50%;
            width: 40px;
            height: 40px;
            animation: spin 1s linear infinite;
            margin: 0 auto;
        }

        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }

        .loading-text {
            margin-top: 10px;
            color: #667eea;
            font-weight: 600;
        }

        .error {
            display: none;
            margin-top: 18px;
            padding: 14px;
            background: rgba(248, 215, 218, 0.9);
            backdrop-filter: blur(10px);
            -webkit-backdrop-filter: blur(10px);
            color: #721c24;
            border-radius: 10px;
            border: 1px solid rgba(245, 198, 203, 0.5);
            font-size: 14px;
        }

        .error.active {
            display: block;
        }

        .result {
            display: none;
            margin-top: 25px;
            animation: fadeIn 0.5s ease-in;
        }

        @keyframes fadeIn {
            from {
                opacity: 0;
                transform: translateY(20px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        .result.active {
            display: block;
        }

        .result-header {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            padding: 18px 20px;
            border-radius: 15px 15px 0 0;
            color: white;
        }

        .result-header h2 {
            margin: 0;
            font-size: 18px;
            font-weight: 600;
        }

        .result-body {
            background: rgba(255, 255, 255, 0.6);
            backdrop-filter: blur(10px);
            -webkit-backdrop-filter: blur(10px);
            border: 2px solid rgba(102, 126, 234, 0.2);
            border-top: none;
            border-radius: 0 0 15px 15px;
            padding: 20px;
        }

        .info-card {
            background: rgba(255, 255, 255, 0.9);
            backdrop-filter: blur(10px);
            -webkit-backdrop-filter: blur(10px);
            padding: 16px;
            border-radius: 12px;
            margin-bottom: 15px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
            border: 1px solid rgba(102, 126, 234, 0.1);
        }

        .info-card h3 {
            color: #667eea;
            margin: 0 0 12px 0;
            font-size: 15px;
            font-weight: 600;
            display: flex;
            align-items: center;
            gap: 6px;
        }

        .info-card p {
            color: #333;
            line-height: 1.6;
            margin: 0;
            font-size: 14px;
        }

        .image-grid {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
            gap: 15px;
        }

        .image-item {
            position: relative;
            border-radius: 12px;
            overflow: hidden;
            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
            transition: transform 0.3s;
            background: rgba(255, 255, 255, 0.9);
            cursor: pointer;
        }

        .image-item:hover {
            transform: scale(1.05);
        }

        .image-item img {
            width: 100%;
            height: 100%;
            object-fit: cover;
            display: block;
        }

        /* 图片加载状态 */
        .image-loading {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%);
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            backdrop-filter: blur(5px);
        }

        .image-loading-spinner {
            width: 40px;
            height: 40px;
            border: 3px solid rgba(102, 126, 234, 0.2);
            border-top: 3px solid #667eea;
            border-radius: 50%;
            animation: spin 1s linear infinite;
        }

        .image-loading-text {
            margin-top: 10px;
            color: #667eea;
            font-size: 12px;
            font-weight: 600;
        }

        /* 骨架屏动画 */
        .skeleton {
            background: linear-gradient(
                90deg,
                rgba(102, 126, 234, 0.1) 25%,
                rgba(102, 126, 234, 0.2) 50%,
                rgba(102, 126, 234, 0.1) 75%
            );
            background-size: 200% 100%;
            animation: skeleton-loading 1.5s ease-in-out infinite;
        }

        @keyframes skeleton-loading {
            0% {
                background-position: 200% 0;
            }
            100% {
                background-position: -200% 0;
            }
        }

        .image-actions {
            position: absolute;
            bottom: 0;
            left: 0;
            right: 0;
            background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent);
            padding: 10px;
            opacity: 0;
            transition: opacity 0.3s;
        }

        .image-item:hover .image-actions {
            opacity: 1;
        }

        .btn-download {
            width: 100%;
            padding: 8px;
            background: linear-gradient(135deg, #28a745 0%, #20c997 100%);
            color: white;
            border: none;
            border-radius: 6px;
            font-size: 13px;
            font-weight: 600;
            cursor: pointer;
            transition: all 0.3s;
        }

        .btn-download:hover {
            transform: translateY(-2px);
        }

        .tips {
            margin-top: 25px;
            padding: 16px;
            background: rgba(232, 244, 248, 0.8);
            backdrop-filter: blur(10px);
            -webkit-backdrop-filter: blur(10px);
            border-radius: 12px;
            font-size: 13px;
            color: #666;
            border: 1px solid rgba(102, 126, 234, 0.1);
        }

        .tips strong {
            color: #667eea;
        }

        .tips p {
            margin: 6px 0;
        }

        .style-categories {
            margin-top: 10px;
            font-size: 12px;
            color: #888;
            line-height: 1.8;
        }

        .style-tag {
            display: inline-block;
            padding: 4px 10px;
            margin: 3px;
            background: rgba(102, 126, 234, 0.1);
            border-radius: 6px;
            color: #667eea;
            font-weight: 600;
        }

        /* 移动端适配 */
        @media (max-width: 768px) {
            body {
                padding: 10px;
            }

            .container {
                padding: 20px;
                border-radius: 20px;
            }

            h1 {
                font-size: 24px;
            }

            .subtitle {
                font-size: 12px;
            }

            .btn-ai-generate {
                padding: 12px 16px;
                font-size: 13px;
            }

            .input-with-button {
                flex-direction: column;
            }

            .btn-ai-generate {
                width: 100%;
                justify-content: center;
            }

            .image-grid {
                grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
                gap: 10px;
            }

            .result-body {
                padding: 15px;
            }
        }

        /* 图片预览模态框 */
        .modal {
            display: none;
            position: fixed;
            z-index: 1000;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.9);
            backdrop-filter: blur(10px);
        }

        .modal.active {
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .modal-content {
            max-width: 90%;
            max-height: 90%;
            object-fit: contain;
            border-radius: 10px;
        }

        .modal-close {
            position: absolute;
            top: 20px;
            right: 30px;
            color: white;
            font-size: 40px;
            font-weight: bold;
            cursor: pointer;
        }

        .modal-close:hover {
            color: #667eea;
        }

        /* 风格选择模态框 */
        .style-modal {
            display: none;
            position: fixed;
            z-index: 1001;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.7);
            backdrop-filter: blur(5px);
            overflow-y: auto;
        }

        .style-modal.active {
            display: flex;
            justify-content: center;
            align-items: center;
            padding: 20px;
        }

        .style-modal-content {
            background: linear-gradient(135deg, rgba(255, 255, 255, 0.98) 0%, rgba(248, 249, 250, 0.98) 100%);
            backdrop-filter: blur(20px);
            border-radius: 24px;
            padding: 35px;
            max-width: 900px;
            width: 100%;
            max-height: 85vh;
            overflow-y: auto;
            box-shadow: 0 12px 48px rgba(0, 0, 0, 0.25);
            border: 1px solid rgba(255, 255, 255, 0.5);
            animation: modalSlideIn 0.3s ease-out;
        }

        @keyframes modalSlideIn {
            from {
                opacity: 0;
                transform: scale(0.95) translateY(-20px);
            }
            to {
                opacity: 1;
                transform: scale(1) translateY(0);
            }
        }

        .style-modal-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 20px;
            padding-bottom: 15px;
            border-bottom: 2px solid rgba(102, 126, 234, 0.2);
        }

        .style-modal-header h2 {
            margin: 0;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            background-clip: text;
            font-size: 22px;
        }

        .style-modal-close {
            color: #666;
            font-size: 32px;
            font-weight: bold;
            cursor: pointer;
            transition: color 0.3s;
            line-height: 1;
        }

        .style-modal-close:hover {
            color: #667eea;
        }

        .style-category {
            margin-bottom: 28px;
            animation: fadeInUp 0.4s ease-out;
        }

        @keyframes fadeInUp {
            from {
                opacity: 0;
                transform: translateY(15px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        .style-category-title {
            font-size: 17px;
            font-weight: 700;
            color: #667eea;
            margin-bottom: 14px;
            display: flex;
            align-items: center;
            gap: 10px;
            padding-bottom: 10px;
            border-bottom: 2px solid rgba(102, 126, 234, 0.15);
        }

        .style-category-title::before {
            content: '';
            width: 4px;
            height: 20px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            border-radius: 2px;
        }

        .style-options {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
            gap: 12px;
        }

        .style-option {
            padding: 16px 20px;
            background: linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, rgba(248, 249, 250, 0.9) 100%);
            border: 2px solid rgba(102, 126, 234, 0.15);
            border-radius: 12px;
            cursor: pointer;
            transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
            text-align: center;
            font-size: 14px;
            font-weight: 500;
            color: #333;
            position: relative;
            overflow: hidden;
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
        }

        .style-option::before {
            content: '';
            position: absolute;
            top: 0;
            left: -100%;
            width: 100%;
            height: 100%;
            background: linear-gradient(90deg, transparent, rgba(102, 126, 234, 0.1), transparent);
            transition: left 0.5s;
        }

        .style-option:hover::before {
            left: 100%;
        }

        .style-option:hover {
            background: linear-gradient(135deg, rgba(102, 126, 234, 0.08) 0%, rgba(118, 75, 162, 0.08) 100%);
            border-color: #667eea;
            transform: translateY(-3px);
            box-shadow: 0 4px 16px rgba(102, 126, 234, 0.2);
        }

        .style-option.selected {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            border-color: transparent;
            color: white;
            font-weight: 600;
            box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4);
            transform: translateY(-2px);
        }

        .style-option.selected::after {
            content: '✔';
            position: absolute;
            top: 6px;
            right: 8px;
            font-size: 16px;
            color: white;
            font-weight: bold;
        }

        .style-option.default {
            background: linear-gradient(135deg, rgba(255, 193, 7, 0.15) 0%, rgba(255, 152, 0, 0.15) 100%);
            border-color: rgba(255, 193, 7, 0.4);
            font-weight: 600;
        }

        .style-option.default::before {
            background: linear-gradient(90deg, transparent, rgba(255, 193, 7, 0.2), transparent);
        }

        .style-option.default.selected {
            background: linear-gradient(135deg, #FFC107 0%, #FF9800 100%);
            border-color: transparent;
            box-shadow: 0 6px 20px rgba(255, 193, 7, 0.4);
        }

        @media (max-width: 768px) {
            .style-modal-content {
                padding: 24px;
                border-radius: 20px;
            }

            .style-options {
                grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
                gap: 10px;
            }

            .style-option {
                padding: 14px 16px;
                font-size: 13px;
            }

            .style-category-title {
                font-size: 15px;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>🎨 AI智能绘画</h1>
        <p class="subtitle">千寻百念AI - 让创意变为现实</p>

        <div class="input-section">
            <div class="input-group">
                <label for="description">✨ 描述您想要的画面:</label>
                <div class="input-with-button">
                    <input type="text" id="description" placeholder="输入简单关键词,如:猫、森林、夕阳..." />
                    <button class="btn-ai-generate" id="aiGenerateBtn" onclick="generatePrompt()" title="AI将根据你的关键词生成完整描述">
                        <span>🤖</span>
                        <span>AI扩展</span>
                    </button>
                </div>
                <p style="font-size: 12px; color: #888; margin-top: 6px;">💡 提示:输入简单关键词后,点击“AI扩展”,让AI为你生成专业的完整描述</p>
            </div>

            <div class="input-group">
                <label for="styleDisplay">🎭 选择绘画风格(可选):</label>
                <input type="text" id="styleDisplay" readonly onclick="openStyleModal()" placeholder="点击选择风格(默认:AI智能选择)" style="cursor: pointer;" />
                <input type="hidden" id="selectedStyle" value="" />
            </div>

            <div class="input-group">
                <label for="customStyle">✨ 或者自定义风格(可选):</label>
                <input type="text" id="customStyle" placeholder="例如:萨尔达利风格、梦幻超现实、复古油画等" />
                <p style="font-size: 12px; color: #888; margin-top: 6px;">💡 提示:自定义风格优先级高于下拉选择</p>
            </div>

            <div class="input-group">
                <label for="ratio">📊 选择图片比例:</label>
                <select id="ratio">
                    <option value="1:1">🔳 1:1 正方形(适合头像、社交媒体)</option>
                    <option value="16:9" selected>📺 16:9 横屏(适合桌面、视频封面)</option>
                    <option value="9:16">📱 9:16 竖屏(适合手机屏保、短视频)</option>
                    <option value="4:3">🖼️ 4:3 经典比例(适合相册、印刷)</option>
                    <option value="3:4">📷 3:4 竖向经典(适合人像、海报)</option>
                    <option value="21:9">🎬 21:9 电影比例(适合电影风格)</option>
                    <option value="3:2">📸 3:2 单反比例(适合摄影作品)</option>
                    <option value="2:3">🖼️ 2:3 竖向摄影(适合人像摄影)</option>
                </select>
            </div>

            <button class="btn-generate" id="generateBtn" onclick="generateImage()">
                🚀 开始创作
            </button>
        </div>

        <div class="loading" id="loading">
            <div class="spinner"></div>
            <p class="loading-text">AI正在创作中,请稍候...</p>
        </div>

        <div class="error" id="error"></div>

        <div class="result" id="result">
            <div class="result-header">
                <h2>✨ 创作完成</h2>
            </div>
            <div class="result-body">
                <div class="info-card">
                    <h3>📝 创作信息</h3>
                    <p id="resultMsg"></p>
                </div>

                <div class="info-card">
                    <h3>🖼️ 生成的图片(点击查看大图)</h3>
                    <div class="image-grid" id="imageGrid"></div>
                </div>
            </div>
        </div>

        <div class="tips">
            <p><strong>💡 使用技巧:</strong></p>
            <p>1️⃣ 描述越详细,AI生成的图片越精准</p>
            <p>2️⃣ 风格可选,不选择则由AI智能匹配最佳风格</p>
            <p>3️⃣ 支持自定义风格,发挥您的创意想象力</p>
            <p>4️⃣ 点击<span class="style-tag">AI生成</span>按钮,让智能助手为您创作描述词</p>
            <p>5️⃣ 每次会生成4张不同的图片供您选择</p>
            <p>5️⃣ 提供<span class="style-tag">60+</span>种风格 + 自定义,<span class="style-tag">8</span>种比例选择</p>
            <div class="style-categories">
                <strong>🎨 风格分类:</strong>
                写实系 · 二次元系 · 中国风系 · 经典绘画系 · 现代艺术系 · 奇幻系 · 游戏/电影风 · 特殊风格
                <br/>
                <strong>📊 比例分类:</strong>
                1:1 正方形 · 16:9 横屏 · 9:16 竖屏 · 4:3 经典 · 3:4 竖向经典 · 21:9 电影 · 3:2 单反 · 2:3 竖向摄影
            </div>
        </div>
    </div>

    <!-- 风格选择模态框 -->
    <div class="style-modal" id="styleModal">
        <div class="style-modal-content">
            <div class="style-modal-header">
                <h2>🎭 选择绘画风格</h2>
                <span class="style-modal-close" onclick="closeStyleModal()">&times;</span>
            </div>

            <!-- 默认风格 -->
            <div class="style-category">
                <div class="style-category-title">⭐ 默认风格</div>
                <div class="style-options">
                    <div class="style-option default" data-style="" data-name="AI智能选择" onclick="selectStyle('', 'AI智能选择')">
AI智能选择
                    </div>
                </div>
            </div>

            <!-- 热门推荐 -->
            <div class="style-category">
                <div class="style-category-title">🔥 热门推荐</div>
                <div class="style-options">
                    <div class="style-option" data-style="写实" data-name="写实风格" onclick="selectStyle('写实', '写实风格')">写实风格</div>
                    <div class="style-option" data-style="二次元" data-name="二次元风格" onclick="selectStyle('二次元', '二次元风格')">二次元风格</div>
                    <div class="style-option" data-style="国风" data-name="国风风格" onclick="selectStyle('国风', '国风风格')">国风风格</div>
                    <div class="style-option" data-style="油画" data-name="油画风格" onclick="selectStyle('油画', '油画风格')">油画风格</div>
                    <div class="style-option" data-style="水墨画" data-name="水墨画" onclick="selectStyle('水墨画', '水墨画')">水墨画</div>
                    <div class="style-option" data-style="赛博朋克" data-name="赛博朋克" onclick="selectStyle('赛博朋克', '赛博朋克')">赛博朋克</div>
                </div>
            </div>

            <!-- 写实系 -->
            <div class="style-category">
                <div class="style-category-title">🎨 写实系</div>
                <div class="style-options">
                    <div class="style-option" data-style="超写实" data-name="超写实风格" onclick="selectStyle('超写实', '超写实风格')">超写实风格</div>
                    <div class="style-option" data-style="照片" data-name="照片风格" onclick="selectStyle('照片', '照片风格')">照片风格</div>
                    <div class="style-option" data-style="电影" data-name="电影质感" onclick="selectStyle('电影', '电影质感')">电影质感</div>
                </div>
            </div>

            <!-- 二次元系 -->
            <div class="style-category">
                <div class="style-category-title">🌸 二次元系</div>
                <div class="style-options">
                    <div class="style-option" data-style="动漫" data-name="日式动漫" onclick="selectStyle('动漫', '日式动漫')">日式动漫</div>
                    <div class="style-option" data-style="漫画" data-name="漫画风格" onclick="selectStyle('漫画', '漫画风格')">漫画风格</div>
                    <div class="style-option" data-style="萨赛风" data-name="萨赛风格" onclick="selectStyle('萨赛风', '萨赛风格')">萨赛风格</div>
                </div>
            </div>

            <!-- 中国风系 -->
            <div class="style-category">
                <div class="style-category-title">🏯 中国风系</div>
                <div class="style-options">
                    <div class="style-option" data-style="工笔画" data-name="工笔画" onclick="selectStyle('工笔画', '工笔画')">工笔画</div>
                    <div class="style-option" data-style="写意" data-name="写意风格" onclick="selectStyle('写意', '写意风格')">写意风格</div>
                    <div class="style-option" data-style="国潮" data-name="国潮风格" onclick="selectStyle('国潮', '国潮风格')">国潮风格</div>
                </div>
            </div>

            <!-- 经典绘画系 -->
            <div class="style-category">
                <div class="style-category-title">🖼️ 经典绘画系</div>
                <div class="style-options">
                    <div class="style-option" data-style="水彩" data-name="水彩风格" onclick="selectStyle('水彩', '水彩风格')">水彩风格</div>
                    <div class="style-option" data-style="素描" data-name="素描风格" onclick="selectStyle('素描', '素描风格')">素描风格</div>
                    <div class="style-option" data-style="丙烯" data-name="丙烯画" onclick="selectStyle('丙烯', '丙烯画')">丙烯画</div>
                    <div class="style-option" data-style="粉笔" data-name="粉笔画" onclick="selectStyle('粉笔', '粉笔画')">粉笔画</div>
                    <div class="style-option" data-style="彩铅" data-name="彩铅画" onclick="selectStyle('彩铅', '彩铅画')">彩铅画</div>
                </div>
            </div>

            <!-- 现代艺术系 -->
            <div class="style-category">
                <div class="style-category-title">🌟 现代艺术系</div>
                <div class="style-options">
                    <div class="style-option" data-style="抽象" data-name="抽象风格" onclick="selectStyle('抽象', '抽象风格')">抽象风格</div>
                    <div class="style-option" data-style="波普艺术" data-name="波普艺术" onclick="selectStyle('波普艺术', '波普艺术')">波普艺术</div>
                    <div class="style-option" data-style="浮世绘" data-name="日式浮世绘" onclick="selectStyle('浮世绘', '日式浮世绘')">日式浮世绘</div>
                    <div class="style-option" data-style="超现实" data-name="超现实主义" onclick="selectStyle('超现实', '超现实主义')">超现实主义</div>
                    <div class="style-option" data-style="立体主义" data-name="立体主义" onclick="selectStyle('立体主义', '立体主义')">立体主义</div>
                    <div class="style-option" data-style="印象派" data-name="印象派" onclick="selectStyle('印象派', '印象派')">印象派</div>
                </div>
            </div>

            <!-- 奇幻系 -->
            <div class="style-category">
                <div class="style-category-title">🔮 奇幻系</div>
                <div class="style-options">
                    <div class="style-option" data-style="蒸汽朋克" data-name="蒸汽朋克" onclick="selectStyle('蒸汽朋克', '蒸汽朋克')">蒸汽朋克</div>
                    <div class="style-option" data-style="未来主义" data-name="未来主义" onclick="selectStyle('未来主义', '未来主义')">未来主义</div>
                    <div class="style-option" data-style="科幻" data-name="科幻风格" onclick="selectStyle('科幻', '科幻风格')">科幻风格</div>
                    <div class="style-option" data-style="魔幻" data-name="魔幻风格" onclick="selectStyle('魔幻', '魔幻风格')">魔幻风格</div>
                    <div class="style-option" data-style="赛博" data-name="赛博风格" onclick="selectStyle('赛博', '赛博风格')">赛博风格</div>
                </div>
            </div>

            <!-- 游戏/电影风 -->
            <div class="style-category">
                <div class="style-category-title">🎮 游戏/电影风</div>
                <div class="style-options">
                    <div class="style-option" data-style="像素" data-name="像素风格" onclick="selectStyle('像素', '像素风格')">像素风格</div>
                    <div class="style-option" data-style="8bit" data-name="8bit复古" onclick="selectStyle('8bit', '8bit复古')">8bit复古</div>
                    <div class="style-option" data-style="低多边形" data-name="低多边形" onclick="selectStyle('低多边形', '低多边形')">低多边形</div>
                    <div class="style-option" data-style="三渲染" data-name="三渲染风格" onclick="selectStyle('三渲染', '三渲染风格')">三渲染风格</div>
                    <div class="style-option" data-style="卡通" data-name="卡通风格" onclick="selectStyle('卡通', '卡通风格')">卡通风格</div>
                </div>
            </div>

            <!-- 特殊风格 -->
            <div class="style-category">
                <div class="style-category-title">🌺 特殊风格</div>
                <div class="style-options">
                    <div class="style-option" data-style="粘土" data-name="粘土风格" onclick="selectStyle('粘土', '粘土风格')">粘土风格</div>
                    <div class="style-option" data-style="纸艺" data-name="纸艺风格" onclick="selectStyle('纸艺', '纸艺风格')">纸艺风格</div>
                    <div class="style-option" data-style="剪纸" data-name="剪纸风格" onclick="selectStyle('剪纸', '剪纸风格')">剪纸风格</div>
                    <div class="style-option" data-style="刺绣" data-name="刺绣风格" onclick="selectStyle('刺绣', '刺绣风格')">刺绣风格</div>
                    <div class="style-option" data-style="浮雕" data-name="浮雕风格" onclick="selectStyle('浮雕', '浮雕风格')">浮雕风格</div>
                    <div class="style-option" data-style="涢彩" data-name="涢彩风格" onclick="selectStyle('涢彩', '涢彩风格')">涢彩风格</div>
                    <div class="style-option" data-style="霞光" data-name="霞光风格" onclick="selectStyle('霞光', '霞光风格')">霞光风格</div>
                </div>
            </div>
        </div>
    </div>

    <!-- 图片预览模态框 -->
    <div class="modal" id="imageModal" onclick="closeModal()">
        <span class="modal-close">&times;</span>
        <img class="modal-content" id="modalImage">
    </div>

    <script>
        // API配置
        const API_URL = 'https://api.5k4.cn/api/doubao';
        const CHAT_API_URL = 'https://api.5k4.cn/api/doubaochat';

        // 本地智能扩展函数
        function expandKeywordsLocally(keywords) {
            // 关键词扩展模板库(超详细版)
            const templates = {
                '猫': ['一只{adj}的{color}猫咪{action}在{place},{timeOfDay}时分,{light}的阳光透过{detail}斜射进来,在它{feature}的毛发上勾勒出一道道金色的光晕,猫咪{bodyPart}微微{movement},{eyeDetail}透露着{emotion},周围{environment},{soundDetail},{atmosphereDetail},整个画面{mood},仿佛{metaphor}',
                       '在{place}的{corner},一只{color}的{adj}猫{action},{light}的{timeOfDay}光线从{direction}洒落,照亮了它{feature}的{bodyPart},{detail}在微风中{movement},投下{shadow}的光影,{soundDetail},{atmosphereDetail},猫咪{eyeDetail},{emotion},{mood}'],
                '狗': ['在{place},一只{adj}的{color}小狗{action},{timeOfDay}的{light}阳光洒在{environment}上,照得{detail}闪闪发光,小狗{bodyPart}{movement},{feature}的毛发在阳光下呈现出{colorDetail},它{eyeDetail},{emotion},{soundDetail},{atmosphereDetail},整个场景{mood},令人{feeling}',
                       '一只{color}{adj}的狗狗在{place}的{corner}{action},{light}光线透过{detail},在{environment}上投下{shadow}的光影,它{bodyPart}{movement},{feature}的{bodyDetail}显得格外{appearance},{eyeDetail}充满{emotion},{soundDetail},{atmosphereDetail},{mood},仿佛{metaphor}'],
                '小狗': ['{place}的{environment}上,一只{adj}的小狗{action},{timeOfDay}的{light}阳光穿过{detail},在草地上投下{shadow}的光影,小狗{feature}的毛发在微风中{movement},它{bodyPart}着,{eyeDetail}透露着{emotion},{soundDetail}从远处传来,{atmosphereDetail},整片{corner}{colorDetail},{mood},{metaphor}',
                         '一只{color}{adj}的小狗在{place}{action},{light}的{timeOfDay}光线照耀着{environment},{detail}{movement},投下{shadow},它那{feature}的{bodyPart}和{eyeDetail}充满{emotion},{soundDetail},{atmosphereDetail},周围{colorDetail},整个场景{mood},让人感受到{feeling}'],
                '森林': ['{light}的{timeOfDay}阳光穿透{place}的密林,在{detail}间投下{shadow}光影,形成一道道{colorDetail}的光束,{environment}{movement},{soundDetail}从林间传来,{color}的{element}在光束中{action},{atmosphereDetail},空气中弥漫着{smell},远处{distance},整个森林{mood},{metaphor}',
                         '神秘的{place}深处,{light}光线透过层层{detail},形成梦幻般的光束走廊,{environment}被{colorDetail}笼罩,{element}在{timeOfDay}的微风中{movement},{soundDetail},{atmosphereDetail},{color}的{corner}{action},{smell},整片森林{mood},{feeling}'],
                '夕阳': ['{light}的夕阳余晖洒满{place},{color}的天空从{colorDetail}渐变到{colorDetail2},{element}的轮廓在{timeOfDay}中被镀上一层{appearance},{environment}{movement},{detail}在余晖中{action},{shadow},{atmosphereDetail},{soundDetail},{smell},整个世界{mood},{metaphor}',
                         '在{place},夕阳西下,{light}的余晖透过{detail},将{environment}染成{color}和{colorDetail}的海洋,{element}{movement},{corner}{action},{atmosphereDetail},{soundDetail}从{direction}传来,空气中{smell},{mood},{feeling}'],
                '海': ['广阔的{place}延伸至天际,{light}的{timeOfDay}阳光在{color}的海面上跳跃,波光粼粼,{element}{movement},海浪{action},在{environment}上留下{colorDetail}的泡沫,{detail}{shadow},{soundDetail}回荡在空中,{atmosphereDetail},{smell},远处{distance},整片海域{mood},{metaphor}',
                       '{place}的海岸线蜿蜒曲折如{metaphor},{light}光线照亮{color}的海水,{detail}在{environment}上{action},投下{shadow},{element}在{timeOfDay}的{direction}{movement},{soundDetail},{atmosphereDetail},{colorDetail}的{corner},{smell},整个画面{mood}'],
                '山': ['巍峨的{place}层峦叠嶂,{light}的{timeOfDay}阳光洒在{detail}上,勾勒出{colorDetail}的轮廓,{color}的{element}缭绕山间,{movement},{environment}{action},{shadow},{atmosphereDetail},{soundDetail}从山谷传来,{smell},{corner}{appearance},远眺群山{mood},{metaphor}',
                       '{place}连绵起伏如{metaphor},{light}光线透过{detail},为山峰披上{colorDetail}的外衣,{element}在{environment}中{movement},{color}的{corner}{action},{atmosphereDetail},{soundDetail},{timeOfDay}的{direction}{shadow},整片山脉{mood},{feeling}'],
                '花': ['繁花似锦的{place}里,{color}和{colorDetail}的花朵竞相绽放,{light}的{timeOfDay}阳光透过{detail},在花瓣上留下{shadow}的光斑,每一朵花都{movement},{element}{action},{environment}{appearance},{atmosphereDetail},{soundDetail},空气中弥漫着{smell},{corner}{colorDetail2},整片花海{mood},{metaphor}',
                       '一片{color}的花海在{place}{action},{light}光线穿过{detail},为每一朵花镀上{colorDetail},{element}{movement},{environment}{shadow},{atmosphereDetail},{soundDetail}从{direction}传来,{smell}令人陶醉,{timeOfDay}的{corner}{appearance},整个世界{mood}'],
                '城市': ['繁华的{place}夜景璀璨夺目,{color}和{colorDetail}的霓虹灯在{environment}上闪烁跳跃,{light}光影交织成{metaphor},{element}{movement},{detail}{action},{atmosphereDetail},{soundDetail}汇成城市的交响乐,{corner}{appearance},{smell},整座城市{mood},{feeling}',
                         '{place}的天际线在{timeOfDay}中显得格外{appearance},{light}的{direction}阳光透过{detail},{color}的{element}在{environment}上{action},投下{shadow},{movement},{atmosphereDetail},{soundDetail},{corner}{colorDetail},整个城市{mood},{metaphor}']
            };

            const adjectives = ['毛茸茸', '可爱', '活泼', '优雅', '慵懒', '灵动', '俊俏', '娇小'];
            const colors = ['橘色', '雪白', '金色', '灰色', '斑驳', '浅棕色', '深邃', '湛蓝', '翠绿', '粉红'];
            const actions = ['悠闲地散步', '欢快地奔跑', '静静地趴着', '好奇地张望', '轻轻跳跃', '慢慢行走', '嬉戏玩耍'];
            const places = ['阳光明媚的窗台', '翠绿的草坪', '静谧的庭院', '温馨的房间', '鲜花盛开的花园', '古朴的院落', '宁静的小径', '开阔的原野'];
            const lights = ['温暖', '柔和', '明媚', '耀眼', '斜射', '璀璨', '朦胧', '金色'];
            const timeOfDays = ['清晨', '午后', '傍晚', '黄昏'];
            const details = ['树叶', '窗帘', '云层', '薄雾', '枝叶', '玻璃窗', '花瓣', '屋檐'];
            const atmospheres = ['空气中弥漫着宁静祥和的氛围', '一切都显得那么美好而宁静', '世界仿佛静止在这一刻', '时光在此刻变得温柔', '整个场景如诗如画'];
            const moods = ['温馨而美好', '梦幻而迷人', '宁静而祥和', '生机盎然', '充满诗意', '令人陶醉'];
            const emotions = ['温暖的幸福感', '纯真与快乐', '平和与宁静', '生命的活力', '自然的和谐'];
            const features = ['明亮', '灵动', '柔软', '光滑', '蓬松', '细腻'];
            const elements = ['云雾', '光影', '建筑', '树木', '花朵', '水面', '山峰'];
            const sounds = ['鸟鸣声声', '风声轻响', '海浪拍岸', '虫鸣阵阵', '叶片沙沙'];
            const bodyParts = ['尾巴', '耳朵', '爪子', '鼻子', '胡须'];
            const movements = ['轻轻摇摆', '微微颤动', '优雅地伸展', '缓缓摆动', '轻柔地晃动'];
            const eyeDetails = ['琥珀色的眼眸', '清澈的双眼', '灵动的眼神', '深邃的目光', '明亮的眼睛'];
            const shadows = ['斑驳', '柔和', '跳跃', '摇曳', '朦胧'];
            const corners = ['一角', '深处', '边缘', '中央', '尽头'];
            const directions = ['远方', '东方', '西边', '天际', '地平线'];
            const environments = ['草地', '地面', '大地', '原野', '空间'];
            const soundDetails = ['微风拂过树梢的沙沙声', '鸟儿欢快的啼鸣', '远处传来的虫鸣', '树叶摩挲的细语', '溪水潺潺的流淌声'];
            const atmosphereDetails = ['时光仿佛在此刻凝固', '世界陷入宁静的美好', '一切都那么和谐自然', '岁月静好的氛围弥漫', '诗意般的意境充盈其间'];
            const smells = ['清新的草木香气', '淡淡的花香', '泥土的芬芳', '海风的咸湿气息', '阳光的温暖味道'];
            const distances = ['山峦若隐若现', '云雾缭绕', '天际线模糊', '地平线延伸', '远山叠嶂'];
            const feelings = ['内心平和', '心旷神怡', '沉醉其中', '流连忘返', '心生向往'];
            const colorDetails = ['金黄色', '淡紫色', '橙红色', '蔚蓝色', '翠绿色', '粉橘色', '暖黄色', '深蓝色'];
            const colorDetails2 = ['绯红色', '淡金色', '深紫色', '浅蓝色', '嫩绿色'];
            const appearances = ['柔美', '壮丽', '梦幻', '唯美', '琰丽', '绚烂'];
            const bodyDetails = ['轮廓', '身姿', '体态', '形态'];
            const metaphors = ['一幅精美的油画', '童话世界', '诗人笔下的画卷', '梦境般的仙境', '大师的艺术作品', '时光定格的瞬间'];

            // 检查关键词是否匹配模板
            for (let key in templates) {
                if (keywords.includes(key)) {
                    const template = templates[key][Math.floor(Math.random() * templates[key].length)];
                    return template
                        .replace('{adj}', adjectives[Math.floor(Math.random() * adjectives.length)])
                        .replace('{color}', colors[Math.floor(Math.random() * colors.length)])
                        .replace('{action}', actions[Math.floor(Math.random() * actions.length)])
                        .replace('{place}', places[Math.floor(Math.random() * places.length)])
                        .replace('{light}', lights[Math.floor(Math.random() * lights.length)])
                        .replace('{timeOfDay}', timeOfDays[Math.floor(Math.random() * timeOfDays.length)])
                        .replace('{detail}', details[Math.floor(Math.random() * details.length)])
                        .replace('{atmosphere}', atmospheres[Math.floor(Math.random() * atmospheres.length)])
                        .replace('{mood}', moods[Math.floor(Math.random() * moods.length)])
                        .replace('{emotion}', emotions[Math.floor(Math.random() * emotions.length)])
                        .replace('{feature}', features[Math.floor(Math.random() * features.length)])
                        .replace('{element}', elements[Math.floor(Math.random() * elements.length)])
                        .replace('{sound}', sounds[Math.floor(Math.random() * sounds.length)])
                        .replace('{bodyPart}', bodyParts[Math.floor(Math.random() * bodyParts.length)])
                        .replace('{movement}', movements[Math.floor(Math.random() * movements.length)])
                        .replace('{eyeDetail}', eyeDetails[Math.floor(Math.random() * eyeDetails.length)])
                        .replace('{shadow}', shadows[Math.floor(Math.random() * shadows.length)])
                        .replace('{corner}', corners[Math.floor(Math.random() * corners.length)])
                        .replace('{direction}', directions[Math.floor(Math.random() * directions.length)])
                        .replace('{environment}', environments[Math.floor(Math.random() * environments.length)])
                        .replace('{soundDetail}', soundDetails[Math.floor(Math.random() * soundDetails.length)])
                        .replace('{atmosphereDetail}', atmosphereDetails[Math.floor(Math.random() * atmosphereDetails.length)])
                        .replace('{smell}', smells[Math.floor(Math.random() * smells.length)])
                        .replace('{distance}', distances[Math.floor(Math.random() * distances.length)])
                        .replace('{feeling}', feelings[Math.floor(Math.random() * feelings.length)])
                        .replace('{colorDetail}', colorDetails[Math.floor(Math.random() * colorDetails.length)])
                        .replace('{colorDetail2}', colorDetails2[Math.floor(Math.random() * colorDetails2.length)])
                        .replace('{appearance}', appearances[Math.floor(Math.random() * appearances.length)])
                        .replace('{bodyDetail}', bodyDetails[Math.floor(Math.random() * bodyDetails.length)])
                        .replace('{metaphor}', metaphors[Math.floor(Math.random() * metaphors.length)]);
                }
            }

            // 如果没有匹配,生成通用详细描述
            const genericTemplates = [
                `在${places[Math.floor(Math.random() * places.length)]}的${corners[Math.floor(Math.random() * corners.length)]},${keywords}成为画面的主角,${lights[Math.floor(Math.random() * lights.length)]}的${timeOfDays[Math.floor(Math.random() * timeOfDays.length)]}阳光透过${details[Math.floor(Math.random() * details.length)]}洒落,在${environments[Math.floor(Math.random() * environments.length)]}上投下${shadows[Math.floor(Math.random() * shadows.length)]}的光影,${soundDetails[Math.floor(Math.random() * soundDetails.length)]},${atmosphereDetails[Math.floor(Math.random() * atmosphereDetails.length)]},空气中${smells[Math.floor(Math.random() * smells.length)]},整个场景${moods[Math.floor(Math.random() * moods.length)]},仿佛${metaphors[Math.floor(Math.random() * metaphors.length)]}`,
                `${keywords}在${lights[Math.floor(Math.random() * lights.length)]}光线的映照下显得格外${appearances[Math.floor(Math.random() * appearances.length)]},${timeOfDays[Math.floor(Math.random() * timeOfDays.length)]}时分,${details[Math.floor(Math.random() * details.length)]}在${directions[Math.floor(Math.random() * directions.length)]}的微风中${movements[Math.floor(Math.random() * movements.length)]},投下${shadows[Math.floor(Math.random() * shadows.length)]},${atmosphereDetails[Math.floor(Math.random() * atmosphereDetails.length)]},${soundDetails[Math.floor(Math.random() * soundDetails.length)]},${smells[Math.floor(Math.random() * smells.length)]},令人${feelings[Math.floor(Math.random() * feelings.length)]}`,
                `${timeOfDays[Math.floor(Math.random() * timeOfDays.length)]}的${places[Math.floor(Math.random() * places.length)]},${keywords}沐浴在${lights[Math.floor(Math.random() * lights.length)]}的光辉中,${colorDetails[Math.floor(Math.random() * colorDetails.length)]}和${colorDetails2[Math.floor(Math.random() * colorDetails2.length)]}的${elements[Math.floor(Math.random() * elements.length)]}点缀其间,${details[Math.floor(Math.random() * details.length)]}${movements[Math.floor(Math.random() * movements.length)]},${atmosphereDetails[Math.floor(Math.random() * atmosphereDetails.length)]},${soundDetails[Math.floor(Math.random() * soundDetails.length)]}从${directions[Math.floor(Math.random() * directions.length)]}传来,整个画面${moods[Math.floor(Math.random() * moods.length)]},如同${metaphors[Math.floor(Math.random() * metaphors.length)]}`
            ];

            return genericTemplates[Math.floor(Math.random() * genericTemplates.length)];
        }

        // AI扩展提示词
        async function generatePrompt() {
            const descInput = document.getElementById('description');
            const aiBtn = document.getElementById('aiGenerateBtn');

            // 获取用户输入的简单关键词
            const userInput = descInput.value.trim();

            // 如果用户没有输入,提示请先输入
            if (!userInput) {
                showError('请先输入简单的关键词,如:猫、森林、夕阳等');
                return;
            }

            // 禁用按钮
            aiBtn.disabled = true;
            aiBtn.innerHTML = '<span>⏳</span><span>扩展中...</span>';

            try {
                 // 专业的角色设定(简化版)
                const systemPrompt = `请将以下关键词扩展成一段80-120字的非常详细的绘画描述。要求:
1. 详细描述主体的外观特征、姿态、动作
2. 具体刻画场景环境、空间布局、背景元素
3. 细致描绘光线来源、光影效果、色彩层次
4. 添加氛围营造、情感表达、动态细节
5. 使用丰富的形容词、比喻、感官描写
6. 直接输出完整描述,不要任何解释说明

关键词:${userInput}`;

                console.log('🎨 发送AI请求');
                console.log('📝 用户关键词:', userInput);

                // 调用AI聊天接口
                const response = await fetch(`${CHAT_API_URL}?msg=${encodeURIComponent(systemPrompt)}`);
                const data = await response.json();

                console.log('✅ API返回:', data);

                // 解析新接口的返回格式
                let aiAnswer = '';
                if (data.success && data.data && data.data.choices && data.data.choices.length > 0) {
                    aiAnswer = data.data.choices[0].message.content;
                } else if (data.message) {
                    // 兼容旧格式
                    aiAnswer = data.message;
                }

                if (aiAnswer && aiAnswer.trim()) {
                    // 清理AI回复(去除可能的引号、多余空格等)
                    let cleanedAnswer = aiAnswer.trim();

                    // 检查是否是无效回答
                    if (cleanedAnswer === '未获取到回答内容' || cleanedAnswer.includes('未获取') || cleanedAnswer.length < 5) {
                        console.warn('⚠️ AI返回无效内容,使用本地智能扩展');
                        // 使用本地智能扩展作为降级方案
                        const expandedText = expandKeywordsLocally(userInput);
                        descInput.value = expandedText;
                        descInput.focus();
                        showSuccess(`✨ 已将"${userInput}"扩展成完整描述!(使用本地智能扩展)`);
                        return;
                    }

                    // 去除可能的开头引号
                    cleanedAnswer = cleanedAnswer.replace(/^["''""]/, '');
                    // 去除可能的结尾引号
                    cleanedAnswer = cleanedAnswer.replace(/["''""]$/, '');

                    // 将AI生成的描述填入输入框
                    descInput.value = cleanedAnswer;
                    descInput.focus();
                    showSuccess(`✨ 已将“${userInput}”扩展成完整描述!您可以继续修改`);
                } else {
                    console.error('❌ 未获取到有效回答,完整数据:', data);
                    showError('AI生成失败:未获取到有效内容,请重试');
                }
            } catch (error) {
                console.error('❌ 请求失败:', error);
                showError('AI生成失败:' + error.message);
            } finally {
                // 恢复按钮
                aiBtn.disabled = false;
                aiBtn.innerHTML = '<span>🤖</span><span>AI扩展</span>';
            }
        }

        async function generateImage() {
            const description = document.getElementById('description').value.trim();
            const styleSelect = document.getElementById('selectedStyle').value;
            const customStyle = document.getElementById('customStyle').value.trim();
            const ratio = document.getElementById('ratio').value;

            // 验证输入
            if (!description) {
                showError('请输入画面描述!');
                return;
            }

            // 自定义风格优先,其次是选择风格,都没有则为空字符串
            const finalStyle = customStyle || styleSelect;

            // 隐藏之前的结果和错误
            hideResult();
            hideError();

            // 显示加载状态
            showLoading();
            disableButton();

            try {
                // 调用API(添加比例参数)
                let apiUrl = `${API_URL}?description=${encodeURIComponent(description)}&ratio=${encodeURIComponent(ratio)}`;
                // 只有当风格不为空时才添加type参数
                if (finalStyle) {
                    apiUrl += `&type=${encodeURIComponent(finalStyle)}`;
                }
                const response = await fetch(apiUrl);
                const data = await response.json();

                // 隐藏加载状态
                hideLoading();
                enableButton();

                // 检查返回结果
                if (data.code === 200 && data.image_url && data.image_url.length > 0) {
                    showResult(data);
                } else {
                    showError(data.msg || 'AI创作失败,请稍后重试!');
                }
            } catch (error) {
                hideLoading();
                enableButton();
                showError('网络错误,请稍后重试!' + error.message);
            }
        }

        function showResult(data) {
            const result = document.getElementById('result');
            const resultMsg = document.getElementById('resultMsg');
            const imageGrid = document.getElementById('imageGrid');

            resultMsg.textContent = data.msg || '创作成功!';

            // 清空并生成图片网格(先显示骨架屏)
            imageGrid.innerHTML = '';
            data.image_url.forEach((url, index) => {
                const imageItem = document.createElement('div');
                imageItem.className = 'image-item';
                imageItem.innerHTML = `
                    <div class="image-loading skeleton">
                        <div class="image-loading-spinner"></div>
                        <div class="image-loading-text">加载中...</div>
                    </div>
                    <img id="img-${index}" style="display: none;" alt="AI生成图片 ${index + 1}">
                    <div class="image-actions">
                        <button class="btn-download" onclick="downloadImage('${url}', ${index + 1})">
                            📥 下载图片
                        </button>
                    </div>
                `;
                imageGrid.appendChild(imageItem);

                // 预加载图片
                const img = imageItem.querySelector(`#img-${index}`);
                const loadingOverlay = imageItem.querySelector('.image-loading');

                img.onload = function() {
                    // 图片加载完成,隐藏加载状态,显示图片
                    loadingOverlay.style.display = 'none';
                    img.style.display = 'block';
                    // 添加点击查看大图功能
                    img.onclick = function() {
                        openModal(url);
                    };
                };

                img.onerror = function() {
                    // 图片加载失败
                    loadingOverlay.innerHTML = `
                        <div style="color: #721c24; font-size: 12px; text-align: center; padding: 10px;">
                            ❌ 图片加载失败<br/>
                            <button class="btn-download" onclick="window.open('${url}', '_blank')" style="margin-top: 10px;">
                                🔗 新窗口打开
                            </button>
                        </div>
                    `;
                };

                // 设置图片源,触发加载
                img.src = url;
            });

            result.classList.add('active');
        }

        function hideResult() {
            document.getElementById('result').classList.remove('active');
        }

        function showError(message) {
            const error = document.getElementById('error');
            error.textContent = '❌ ' + message;
            error.style.background = 'rgba(248, 215, 218, 0.9)';
            error.style.color = '#721c24';
            error.classList.add('active');
        }

        function showSuccess(message) {
            const error = document.getElementById('error');
            error.textContent = '✅ ' + message;
            error.style.background = 'rgba(212, 237, 218, 0.9)';
            error.style.color = '#155724';
            error.classList.add('active');

            setTimeout(() => {
                hideError();
            }, 3000);
        }

        function hideError() {
            document.getElementById('error').classList.remove('active');
        }

        function showLoading() {
            document.getElementById('loading').classList.add('active');
        }

        function hideLoading() {
            document.getElementById('loading').classList.remove('active');
        }

        function disableButton() {
            const btn = document.getElementById('generateBtn');
            btn.disabled = true;
            btn.textContent = '🎨 创作中...';
        }

        function enableButton() {
            const btn = document.getElementById('generateBtn');
            btn.disabled = false;
            btn.textContent = '🚀 开始创作';
        }

        // 下载图片
        function downloadImage(url, index) {
            const link = document.createElement('a');
            link.href = url;
            link.download = `ai_painting_${Date.now()}_${index}.png`;
            link.target = '_blank';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }

        // 打开风格选择模态框
        function openStyleModal() {
            document.getElementById('styleModal').classList.add('active');
            // 高亮当前选中的风格
            updateSelectedStyle();
        }

        // 关闭风格选择模态框
        function closeStyleModal() {
            document.getElementById('styleModal').classList.remove('active');
        }

        // 选择风格
        function selectStyle(style, name) {
            document.getElementById('selectedStyle').value = style;
            document.getElementById('styleDisplay').value = name;

            // 更新选中状态
            updateSelectedStyle();

            // 关闭模态框
            closeStyleModal();
        }

        // 更新选中状态
        function updateSelectedStyle() {
            const selectedStyle = document.getElementById('selectedStyle').value;
            const options = document.querySelectorAll('.style-option');

            options.forEach(option => {
                if (option.getAttribute('data-style') === selectedStyle) {
                    option.classList.add('selected');
                } else {
                    option.classList.remove('selected');
                }
            });
        }

        // 打开图片预览
        function openModal(url) {
            const modal = document.getElementById('imageModal');
            const modalImg = document.getElementById('modalImage');
            modal.classList.add('active');
            modalImg.src = url;
        }

        // 关闭图片预览
        function closeModal() {
            document.getElementById('imageModal').classList.remove('active');
        }

        // 支持回车键提交
        document.getElementById('description').addEventListener('keypress', function(e) {
            if (e.key === 'Enter') {
                generateImage();
            }
        });
    </script>
</body>
</html>

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:本站资源来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系客服并出示版权证明以便删除!
XBinWeb个人网站程序V2.0.0个人建站程序支持动态切换首页模板
« 上一篇 12-03
软件库UDID定制v3源码(多功能全新Ui页面,并且集成软件源)
下一篇 » 12-03