图像与视觉:使用OpenAI API处理图像的完全指南

260 阅读8分钟

图像与视觉:使用OpenAI API处理图像的完全指南

在当今的多模态应用开发中,图像处理与生成已成为核心能力之一。本文将详细介绍如何借助OpenAI API构建涉及图像的应用,包括图像生成、编辑以及视觉分析等功能。无论是生成逼真的图像,还是让模型"看懂"图像内容,你都能在这里找到实用的实现方案。

概述:图像相关功能一览

图像功能概览

近年来,大语言模型已具备处理图像输入并进行分析的能力——即视觉(Vision) 能力。借助gpt-image-1等模型,我们不仅能分析视觉输入,还能创建图像。

OpenAI API提供了多个端点用于处理图像输入或生成图像输出,助力开发者构建强大的多模态应用。

API支持的使用场景
Responses API分析图像并将其作为输入,和/或生成图像作为输出
Images API生成图像作为输出,可选使用图像作为输入
Chat Completions API分析图像并将其作为输入,生成文本或音频

提示:在实际开发中,为了更稳定地调用这些图像相关API,推荐使用可靠的API中转站服务,支持多种模型的统一接入,详情可访问link.ywhttp.com/js4Kcv了解更多。

生成或编辑图像

你可以通过Image API或Responses API生成或编辑图像。

我们最新的图像生成模型gpt-image-1是原生多模态大语言模型,它既能理解文本和图像,又能利用其丰富的世界知识生成图像,具有更强的指令遵循能力和上下文感知能力。

相比之下,DALL·E 2和DALL·E 3等专用图像生成模型则不具备gpt-image-1那样对世界的固有理解。

使用Responses API生成图像

以下是使用不同语言生成图像的示例代码(注意:使用API中转站时,需将基础URL设置为https://api.aaaaapi.com):

JavaScript示例

import OpenAI from "openai";
const openai = new OpenAI({
  baseURL: "https://api.aaaaapi.com" // 使用API中转站的基础URL
});

const response = await openai.responses.create({
    model: "gpt-4.1-mini",
    input: "生成一只灰色虎斑猫抱着戴橙色围巾的水獭的图像",
    tools: [{type: "image_generation"}],
});

// 将图像保存到文件
const imageData = response.output
  .filter((output) => output.type === "image_generation_call")
  .map((output) => output.result);

if (imageData.length > 0) {
  const imageBase64 = imageData[0];
  const fs = await import("fs");
  fs.writeFileSync("cat_and_otter.png", Buffer.from(imageBase64, "base64"));
}

Python示例

from openai import OpenAI
import base64

client = OpenAI(
  base_url="https://api.aaaaapi.com"  # 使用API中转站的基础URL
) 

response = client.responses.create(
    model="gpt-4.1-mini",
    input="生成一只灰色虎斑猫抱着戴橙色围巾的水獭的图像",
    tools=[{"type": "image_generation"}],
)

# 将图像保存到文件
image_data = [
    output.result
    for output in response.output
    if output.type == "image_generation_call"
]

if image_data:
    image_base64 = image_data[0]
    with open("cat_and_otter.png", "wb") as f:
        f.write(base64.b64decode(image_base64))

利用世界知识生成图像

gpt-image-1与DALL·E模型的核心区别在于:这种原生多模态语言模型能利用其对世界的视觉理解,生成包含真实细节的逼真图像,无需参考资料。

例如,当你提示gpt-image-1生成"一个装有最受欢迎半宝石的玻璃柜"时,模型会自动选择紫水晶、粉水晶、玉等宝石,并以真实的方式呈现它们。

分析图像:模型的视觉能力

视觉(Vision) 是模型"看见"并理解图像的能力。如果图像中包含文本,模型也能理解这些文本。它能识别大多数视觉元素,包括物体、形状、颜色和纹理,当然也存在一些限制

向模型提供图像输入

你可以通过多种方式向生成请求提供图像输入:

  • 提供图像文件的完整URL
  • 提供Base64编码的数据URL
  • 提供文件ID(通过Files API创建)

你可以在单个请求中提供多个图像(通过在content数组中包含多个图像),但需注意图像会占用tokens,并按此计费。

方式1:通过URL传递图像

分析图像内容的示例代码

import OpenAI from "openai";

const openai = new OpenAI({
  baseURL: "https://api.aaaaapi.com" // API中转站地址
});

const response = await openai.responses.create({
    model: "gpt-4.1-mini",
    input: [{
        role: "user",
        content: [
            { type: "input_text", text: "这张图片里有什么?" },
            {
                type: "input_image",
                image_url: "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
            },
        ],
    }],
});

console.log(response.output_text);
from openai import OpenAI

client = OpenAI(
  base_url="https://api.aaaaapi.com"  # API中转站地址
)

response = client.responses.create(
    model="gpt-4.1-mini",
    input=[{
        "role": "user",
        "content": [
            {"type": "input_text", "text": "这张图片里有什么?"},
            {
                "type": "input_image",
                "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
            },
        ],
    }],
)

print(response.output_text)
方式2:通过Base64编码传递图像

分析图像内容的示例代码

import fs from "fs";
import OpenAI from "openai";

const openai = new OpenAI({
  baseURL: "https://api.aaaaapi.com"
});

const imagePath = "你的图像路径.jpg";
const base64Image = fs.readFileSync(imagePath, "base64");

const response = await openai.responses.create({
    model: "gpt-4.1-mini",
    input: [
        {
            role: "user",
            content: [
                { type: "input_text", text: "这张图片里有什么?" },
                {
                    type: "input_image",
                    image_url: `data:image/jpeg;base64,${base64Image}`,
                },
            ],
        },
    ],
});

console.log(response.output_text);
import base64
from openai import OpenAI

client = OpenAI(
  base_url="https://api.aaaaapi.com"
)

# 编码图像的函数
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")

# 图像路径
image_path = "你的图像路径.jpg"

# 获取Base64字符串
base64_image = encode_image(image_path)

response = client.responses.create(
    model="gpt-4.1",
    input=[
        {
            "role": "user",
            "content": [
                { "type": "input_text", "text": "这张图片里有什么?" },
                {
                    "type": "input_image",
                    "image_url": f"data:image/jpeg;base64,${base64_image}",
                },
            ],
        }
    ],
)

print(response.output_text)
方式3:通过文件ID传递图像

分析图像内容的示例代码

import OpenAI from "openai";
import fs from "fs";

const openai = new OpenAI({
  baseURL: "https://api.aaaaapi.com"
});

// 使用Files API创建文件的函数
async function createFile(filePath) {
  const fileContent = fs.createReadStream(filePath);
  const result = await openai.files.create({
    file: fileContent,
    purpose: "vision",
  });
  return result.id;
}

// 获取文件ID
const fileId = await createFile("你的图像路径.jpg");

const response = await openai.responses.create({
  model: "gpt-4.1-mini",
  input: [
    {
      role: "user",
      content: [
        { type: "input_text", text: "这张图片里有什么?" },
        {
          type: "input_image",
          file_id: fileId,
        },
      ],
    },
  ],
});

console.log(response.output_text);

图像输入要求

输入图像必须满足以下要求才能在API中使用:

支持的文件类型PNG (.png)、JPEG (.jpeg和.jpg)、WEBP (.webp)、非动画GIF (.gif)
大小限制每个请求总 payload 不超过50 MB;最多500个独立图像输入
其他要求无水印或logo;无NSFW内容;清晰到人类可理解

指定图像输入的细节级别

detail参数用于告诉模型处理图像时使用的细节级别(lowhighauto让模型决定)。如果省略该参数,模型将使用auto

{
    "type": "input_image",
    "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
    "detail": "high"
}

使用"detail": "low"可以节省tokens并加快响应速度。此时模型会以85个tokens的预算处理图像,并接收512px x 512px的低分辨率版本。这适用于不需要高分辨率细节的场景(例如,询问图像中的主导形状或颜色)。

相反,如果你希望模型更深入地理解图像,可以使用"detail": "high"

限制

虽然具备视觉能力的模型很强大,可用于多种场景,但了解其限制也很重要。以下是一些已知限制:

  • 医学图像:模型不适合解读专业医学图像(如CT扫描),也不应用于医疗建议。
  • 非英语文本:处理含非拉丁字母文本(如日语、韩语)的图像时,性能可能不佳。
  • 小文本:需放大图像中的文本以提高可读性,但避免裁剪重要细节。
  • 旋转内容:模型可能误解旋转或倒置的文本和图像。
  • 视觉元素:模型可能难以理解图表或因颜色/样式(如实线、虚线)变化的文本。
  • 空间推理:在需要精确空间定位的任务中表现不佳(如识别棋盘位置)。
  • 准确性:在某些场景下可能生成错误的描述或标题。
  • 图像形状:难以处理全景图和鱼眼图像。
  • 元数据与缩放:模型不处理原始文件名或元数据,图像在分析前会被缩放,影响原始尺寸。
  • 计数:对图像中的物体可能给出近似计数。
  • CAPTCHAS:出于安全原因,系统会阻止提交验证码。

计算成本

图像输入与文本输入一样,按tokens计量和收费。图像转换为文本tokens的方式因模型而异。你可以在定价页面的FAQ部分找到视觉定价计算器。

GPT-4.1-mini、GPT-4.1-nano、o4-mini

图像输入的tokens成本基于其尺寸计算,步骤如下:

A. 计算覆盖图像所需的32px x 32px补丁数量(补丁可能超出图像边界;边界外像素视为黑色)。

raw_patches = ceil(宽度/32)×ceil(高度/32)

B. 如果补丁数量超过1536,需按比例缩小图像,使其不超过1536个补丁。

r = √(32²×1536/(宽度×高度))
r = r × min( floor(宽度×r/32) / (宽度×r/32), floor(高度×r/32) / (高度×r/32) )

C. tokens成本为补丁数量,上限为1536。

image_tokens = ceil(缩放后宽度/32)×ceil(缩放后高度/32)

D. 对于gpt-4.1-mini,需将图像tokens乘以1.62;gpt-4.1-nano乘以2.46;o4-mini乘以1.72,得到的总tokens按正常文本费率计费。

GPT 4o、GPT-4.1、GPT-4o-mini等模型

图像的tokens成本由大小和细节级别决定:

"detail": "low"的图像成本为固定的基础tokens,具体数量因模型而异。"detail": "high"的成本计算如下:

  1. 按比例缩放到2048px x 2048px的正方形内,保持原始宽高比
  2. 将图像最短边缩放到768px
  3. 计算图像中512px正方形的数量,每个正方形按固定tokens计费(见下表)
  4. 总费用 = 基础tokens + 正方形数量×每个正方形的tokens
模型基础tokens每个瓦片tokens
4o、4.1、4.585170
4o-mini28335667
o1、o1-pro、o375150
computer-use-preview65129

总结

通过OpenAI API的图像与视觉能力,开发者可以轻松构建多模态应用,实现图像生成、编辑和分析等功能。在实际开发中,选择合适的模型、输入方式和细节级别,既能保证效果,又能控制成本。如果需要更稳定的API调用体验,可考虑使用API中转站服务(link.ywhttp.com/js4Kcv),简化接入流程,提升服务可用性。