Skip to main content

Gemini 图片生成

Gemini API 提供强大的原生图像生成能力,采用对话式方法。您可以使用文本提示、图像或两者结合来生成、修改和迭代视觉内容,实现前所未有的控制。

核心功能

  • 文本生成图像: 从文本描述生成高质量图像
  • 图像+文本编辑: 使用文本提示修改现有图像
  • 多图合成: 组合多个图像的元素或转换风格
  • 迭代优化: 通过对话式交互逐步改进图像
  • 高保真文本渲染: 在图像中生成清晰可读的文本
提示: nano-banana-pro 的参数基本与 nano-banana 一致,可以参考本文档的使用方法和示例。

nano-banana-pro 特性

nano-banana-pro 是一款先进的图片生成和编辑模型,针对专业资源制作进行了优化:
  • 高分辨率输出:内置 1K、2K 和 4K 视觉效果生成功能
  • 高级文字渲染:能够为信息图表、菜单、图表和营销素材资源生成清晰易读的风格化文字
  • 使用 Google 搜索进行接地:模型可以使用 Google 搜索作为工具来验证事实,并根据实时数据(例如当前天气地图、股票图表、近期活动)生成图像
  • 思考模式:模型会利用”思考”过程来推理复杂的提示,生成临时”思维图像”以在生成最终的高质量输出之前优化构图
  • 最多 14 张参考图片:您现在最多可以混合使用 14 张参考图片来生成最终图片

基础用法

文本生成图像

curl -X POST "https://model-api.skyengine.com.cn/v1beta/models/nano-banana-pro:generateContent" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <API-KEY>" \
  -d '{
    "contents": [
      {
        "parts": [
          {
            "text": "在高档餐厅中展示一道纳米香蕉菜肴,带有 TokenOPS 主题"
          }
        ]
      }
    ]
  }' \
  | jq . \
  | grep -o '"data": "[^"]*"' \
  | cut -d'"' -f4 \
  | base64 --decode > gemini-native-image.png
gemini-native-image

图像编辑(图像+文本)

您也可以提供现有图像和文本提示来编辑图像:
IMG_PATH=/path/to/cat_image.jpeg

if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
  B64FLAGS="--input"
else
  B64FLAGS="-w0"
fi

IMG_BASE64=$(base64 "$B64FLAGS" "$IMG_PATH" 2>&1)

curl -X POST \
  "https://generativelanguage.googleapis.com/v1beta/models/nano-banana-pro:generateContent" \
    -H "x-goog-api-key: <API-KEY> \
    -H 'Content-Type: application/json' \
    -d "{
      \"contents\": [{
        \"parts\":[
            {\"text\": \"'Create a picture of my cat eating a nano-banana in a fancy restaurant under the Gemini constellation\"},
            {
              \"inlineData\": {
                \"mimeType\":\"image/jpeg\",
                \"data\": \"$IMG_BASE64\"
              }
            }
        ]
      }]
    }"  \
  | jq . \
  | grep -o '"data": "[^"]*"' \
  | cut -d'"' -f4 \
  | base64 --decode > gemini-edited-image.png

配置选项

仅返回图像

默认情况下,Gemini 会返回图像和文本响应。要仅获取图像:
Python
data = {
    "contents": [
        {
            "parts": [
                {
                    "text": "在高档餐厅中展示一道纳米香蕉菜肴"
                }
            ]
        }
    ],
    "generationConfig": {
        "responseModalities": ["Image"]  # 仅返回图像
    }
}

控制宽高比

指定输出图像的宽高比:
Python
data = {
    "contents": [
        {
            "parts": [
                {
                    "text": "在高档餐厅中展示一道纳米香蕉菜肴"
                }
            ]
        }
    ],
    "generationConfig": {
        "imageConfig": {
            "aspectRatio": "16:9"
        }
    }
}

可用的宽高比

1:116:99:163:22:34:33:45:44:521:9

分辨率对照表

nano-banana

宽高比分辨率令牌
1:11024x10241290
2:3832x12481290
3:21248x8321290
3:4864x11841290
4:31184x8641290
4:5896x11521290
5:41152x8961290
9:16768x13441290
16:91344x7681290
21:91536x6721290

nano-banana-pro

宽高比1K 分辨率1K 令牌2K 分辨率2K 令牌4K 分辨率4K 令牌
1:11024x102411202048x204811204096x40962000
2:3848x126411201696x252811203392x50562000
3:21264x84811202528x169611205056x33922000
3:4896x120011201792x240011203584x48002000
4:31200x89611202400x179211204800x35842000
4:5928x115211201856x230411203712x46082000
5:41152x92811202304x185611204608x37122000
9:16768x137611201536x275211203072x55042000
16:91376x76811202752x153611205504x30722000
21:91584x67211203168x134411206336x26882000

分辨率控制

指定输出图像的分辨率,可选值:1K2K4K
Python
data = {
    "contents": [
        {
            "parts": [
                {
                    "text": "一只可爱的小猫在花园里玩耍,阳光明媚,油画风格"
                }
            ]
        }
    ],
    "generationConfig": {
        "imageConfig": {
            "aspectRatio": "1:1",
            "imageSize": "4K"
        }
    }
}

多轮图片修改

Gemini 的对话式特性允许您通过多轮交互逐步完善图像。以下示例展示了一个完整的多轮对话流程:先生成初始图像,然后基于该图像进行修改。
Python
import requests
import base64
from PIL import Image
from io import BytesIO

API_KEY = "<API-KEY>"
BASE_URL = "https://model-api.skyengine.com.cn/v1beta"

def generate_content(prompt, inline_data=None):
    """生成内容,支持纯文本或图像+文本输入

    Args:
        prompt: 文本提示
        inline_data: 上一轮返回的 inlineData 对象(包含 mimeType 和 data)
    """
    url = f"{BASE_URL}/models/nano-banana-pro:generateContent"

    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {API_KEY}"
    }

    # 构建请求内容
    parts = [{"text": prompt}]

    # 如果提供了图像数据,添加到请求中
    if inline_data:
        parts.append({"inlineData": inline_data})

    data = {
        "contents": [
            {
                "role": "user",
                "parts": parts
            }
        ],
        "generationConfig": {
            "responseModalities": ["TEXT", "IMAGE"]
        }
    }

    response = requests.post(url, headers=headers, json=data)

    if response.status_code == 200:
        result = response.json()
        text_response = None
        image = None
        output_inline_data = None

        for candidate in result.get('candidates', []):
            for part in candidate.get('content', {}).get('parts', []):
                if 'text' in part:
                    text_response = part['text']
                    print(f"文本响应: {text_response}")
                if 'inlineData' in part:
                    output_inline_data = part['inlineData']
                    img_data = base64.b64decode(output_inline_data['data'])
                    image = Image.open(BytesIO(img_data))

        return text_response, image, output_inline_data
    return None, None, None

# ===== 第一轮:生成初始图像 =====
prompt_turn1 = """创建一个生动的信息图,将光合作用解释为植物最喜欢的食物配方。
展示"原料"(阳光、水、二氧化碳)和"成品"(糖/能量)。
风格应该像一本色彩丰富的儿童烹饪书的一页,适合四年级学生阅读。
图片中的文字使用英文。"""

text1, image1, inline_data1 = generate_content(prompt_turn1)
if image1:
    image1.save("turn1_image.png")
    print("第一轮图像已保存为 turn1_image.png")

# ===== 第二轮:基于第一轮图像进行迭代编辑 =====
prompt_turn2 = "生成一张新图片,将图片中的所有英文文字翻译成中文"

text2, image2, inline_data2 = generate_content(prompt_turn2, inline_data1)
if image2:
    image2.save("turn2_image.png")
    print("第二轮图像已保存为 turn2_image.png")

多图合成

您可以提供多个图像作为输入(建议最多 3 张):
Python
# 读取多张图片
with open('image1.jpg', 'rb') as f1:
    img1_data = base64.b64encode(f1.read()).decode('utf-8')

with open('image2.jpg', 'rb') as f2:
    img2_data = base64.b64encode(f2.read()).decode('utf-8')

data = {
    "contents": [
        {
            "parts": [
                {
                    "text": "将这些图像组合成一个拼贴画,创意布局"
                },
                {
                    "inlineData": {
                        "mimeType": "image/jpeg",
                        "data": img1_data
                    }
                },
                {
                    "inlineData": {
                        "mimeType": "image/jpeg",
                        "data": img2_data
                    }
                }
            ]
        }
    ]
}