本指南介绍如何在 Claude 中使用图像,包括最佳实践、代码示例以及需要注意的限制。
您可以通过以下方式使用 Claude 的视觉能力:
单个请求中可以包含多张图像,Claude 在生成响应时会对这些图像进行联合分析。这对于比较或对比图像非常有用。
每条消息或每个请求的最大图像数量为:
每张图像的最大尺寸为 8000x8000 像素。
如果单个 API 请求包含超过 20 张图像,则会应用更严格的单张图像尺寸限制。在 Amazon Bedrock 和 Vertex AI 上,PDF 等文档块也会计入此阈值。超过该更严格限制的图像将被拒绝,并返回 invalid_request_error 错误,其消息中会提及 "many-image requests" 并说明当前的像素限制。要在所有平台上保持在限制范围内,请将每张图像调整为任一维度均不超过 2000 像素,或将请求中的图像和文档块总数控制在 20 个或更少。
每张图像的最大大小为:
Claude 以图块(patch)而非像素的方式查看图像。每个图块是图像中一个 28×28 像素的区块,称为一个视觉令牌(visual token)。因此,一张图像的成本为 ⌈width / 28⌉ × ⌈height / 28⌉ 个视觉令牌。
如果 Claude 接收到过大的图像,会对其进行缩放。最大原生图像分辨率为:
如果您的输入图像大于此原生分辨率,它会首先被缩放到保持宽高比的最大可能尺寸。所有图像(无论是否经过缩放)随后都会在底部和右侧边缘填充至 28 像素的倍数。有关确切规则,请参阅 Claude 如何缩放和填充图像。
当要求 Claude 输出坐标(点、边界框等)时,使用相对于 Claude 所见的缩放后图像的绝对像素坐标效果最佳。有关如何处理此问题,请参阅处理坐标和边界框。
为了最大限度地减少延迟并简化基于坐标的工作流程,建议您在上传图像之前先对其进行缩放。
您在请求中包含的每张图像都会计入您的令牌使用量。要计算大致成本,请将图像的视觉令牌数量(参见评估图像大小)乘以您所使用模型的每令牌价格。
以下是在 API 尺寸限制范围内不同图像大小的令牌化示例和大致成本,基于 Claude Sonnet 4.6 每百万输入令牌 3 美元的价格:
| 图像大小 | 令牌数 | 每张图像成本 | 每 1000 张图像成本 |
|---|---|---|---|
| 200x200 px(0.04 百万像素) | 64 | ~$0.00019 | ~$0.19 |
| 1000x1000 px(1 百万像素) | 1296 | ~$0.0039 | ~$3.89 |
| 1092x1092 px(1.19 百万像素) | 1521 | ~$0.0046 | ~$4.56 |
| 1920x1080 px(2.07 百万像素) | 1560 | ~$0.0047 | ~$4.68 |
| 2000x1500 px(3 百万像素) | 1564 | ~$0.0047 | ~$4.69 |
| 3840x2160 px(8.29 百万像素) | 1560 | ~$0.0047 | ~$4.68 |
请注意,最后三张图像超过了原生分辨率,在处理前会被缩小(分别缩小至 1456x819 px、1270x952 px 和 1456x819 px),这限制了它们的令牌成本上限。4K 图像的成本不会高于 1920x1080 图像,因为两者都会缩小到相同的尺寸;额外的分辨率会被丢弃。
Claude Opus 4.7 是首个支持高分辨率图像的 Claude 模型;Claude Opus 4.8、Claude Fable 5、Claude Mythos 5 及更高版本的模型也支持此功能。最大图像分辨率为长边 2576 像素,高于之前模型的 1568 像素。这为视觉密集型工作负载带来了性能提升,对于计算机使用、屏幕截图理解和文档分析尤为有价值。
Claude Opus 4.7 及更高版本的模型会自动启用高分辨率支持,无需 beta 标头或客户端选择加入。
在 Claude Opus 4.7、Claude Opus 4.8、Claude Fable 5 和 Claude Mythos 5 上,高分辨率图像使用的图像令牌最多可达之前模型的约 3 倍(每张图像 4784 个令牌对比 1568 个令牌)。如果您不需要额外的保真度,请在发送前对图像进行降采样以控制令牌成本。
以下是相同图像大小在 Claude Opus 4.7 和 Claude Opus 4.8 上的令牌化情况,基于其每百万输入令牌 5 美元的价格:
| 图像大小 | 令牌数 | 每张图像成本 | 每 1000 张图像成本 |
|---|---|---|---|
| 200x200 px(0.04 百万像素) | 64 | ~$0.00032 | ~$0.32 |
| 1000x1000 px(1 百万像素) | 1296 | ~$0.0065 | ~$6.48 |
| 1092x1092 px(1.19 百万像素) | 1521 | ~$0.0076 | ~$7.61 |
| 1920x1080 px(2.07 百万像素) | 2691 | ~$0.013 | ~$13.46 |
| 2000x1500 px(3 百万像素) | 3888 | ~$0.019 | ~$19.44 |
| 3840x2160 px(8.29 百万像素) | 4784 | ~$0.024 | ~$23.92 |
只有最后一张图像超过了更高的限制:4K 图像在处理前会被缩小至 2576x1449 px。高分辨率支持提高了分辨率限制,但并未移除限制;长边超过 2576 像素(或 4784 个视觉令牌)的图像仍会被缩小。
向 Claude 提供图像时,请注意以下几点以获得最佳效果:
Claude 可以定位和标注图像中的区域(例如,返回表格、表单字段、图表元素或 UI 组件的边界框)。
Claude 在使用绝对像素坐标时效果最佳。 请在提示中明确要求使用绝对像素坐标。例如:"以像素坐标形式返回每个表格的边界框,格式为 [x1, y1, x2, y2]。" 当您要求使用归一化坐标时,Claude 的表现不佳,例如:"返回 0 到 1000 之间的边界框坐标。" 请始终要求像素坐标,如有需要,在您自己的代码中进行归一化。
坐标遵循标准图像约定:原点 (0, 0) 位于图像的左上角,x 向右递增,y 向下递增。Claude 返回的坐标是 Claude 所见图像中的像素位置:即您的图像经 Claude 缩放以适应模型原生分辨率后的图像(参见 Claude 如何缩放和填充图像)。要获得可直接使用的坐标,您可以预先缩放图像,使坐标与您手中的图像一一对应(参见上传前缩放图像),或者对 Claude 返回的坐标进行重新缩放(参见无法预先缩放时重新缩放坐标)。
Claude 会找到同时满足模型两个图像限制的、保持宽高比的最大尺寸:
⌈width / 28⌉ × ⌈height / 28⌉ 不超过模型的视觉令牌预算(大多数模型为 1568 个令牌,Claude Opus 4.7 及更高版本的模型为 4784 个)。对于大多数照片和屏幕截图,触发缩放的是边长限制。对于纵向文档,通常是视觉令牌限制先触发,而忽略这一点是导致坐标错位的最常见原因。例如,以 130 DPI 扫描的 A4 页面为 1075×1520 像素:两边都小于 1568 px,但其成本为 39 × 55 = 2145 个视觉令牌,因此 Claude 会将其缩放至 924×1307。
然后,Claude 会对每张图像(无论是否经过缩放)在底部和右侧边缘填充至下一个 28 像素的倍数(在上述示例中,924×1307 变为 924×1316)。填充区域不包含任何内容:Claude 感知的是填充后的图像,但页面内容始终只占据未填充的缩放区域。始终按缩放后的尺寸(而非填充后的尺寸)进行归一化或重新缩放;除以填充后的尺寸会使每个坐标产生微小的缩放偏差。
最可靠的方法是在上传前自行缩放图像,这样您手中的图像就是 Claude 所见的图像,Claude 返回的坐标无需转换。
以下参考实现计算 Claude 将图像缩放到的确切尺寸:
import math
def count_image_tokens(width: int, height: int) -> int:
"""Visual tokens consumed by an image: one token per 28x28 pixel patch."""
return math.ceil(width / 28) * math.ceil(height / 28)
def resized_size(
width: int,
height: int,
max_edge: int = 1568,
max_tokens: int = 1568,
) -> tuple[int, int]:
"""The size Claude resizes an image to before padding.
Defaults are for most models. For Claude Opus 4.7 and later models, use
max_edge=2576 and max_tokens=4784. Returns (width, height). Images that
already fit within the limits are returned unchanged.
"""
def fits(w: int, h: int) -> bool:
return (
math.ceil(w / 28) * 28 <= max_edge
and math.ceil(h / 28) * 28 <= max_edge
and count_image_tokens(w, h) <= max_tokens
)
if fits(width, height):
return (width, height)
if height > width:
resized_h, resized_w = resized_size(height, width, max_edge, max_tokens)
return (resized_w, resized_h)
# 沿长边进行二分查找,寻找保持宽高比且能容纳的最大
# 尺寸。
aspect_ratio = width / height
lo, hi = 1, width # lo always fits; hi never fits
while lo + 1 < hi:
mid = (lo + hi) // 2
if fits(mid, max(round(mid / aspect_ratio), 1)):
lo = mid
else:
hi = mid
return (lo, max(round(lo / aspect_ratio), 1))
# 来自“Claude 如何调整图像大小和填充”的 A4 示例:
print(resized_size(1075, 1520)) # (924, 1307)resized_size 返回的尺寸。如果图像已经在模型的限制范围内,resized_size 会原样返回其尺寸,无需缩放。[x1, y1, x2, y2]。"如果您无法预先缩放(例如,图像来自您无法修改的上游系统),请使用上传前缩放图像中的 resized_size 来恢复 Claude 所见的尺寸,然后将 Claude 返回的坐标映射为归一化坐标或映射回您的原始图像。此方法需要知道您上传的图像的像素尺寸,因此不适用于 PDF 上传。
def to_relative_coordinates(
x: float,
y: float,
original_width: int,
original_height: int,
max_edge: int = 1568,
max_tokens: int = 1568,
) -> tuple[float, float]:
"""Map a pixel coordinate returned by Claude to relative coordinates in [0, 1].
Pass the dimensions of the image you uploaded. For Claude Opus 4.7 and
later models, use max_edge=2576 and max_tokens=4784.
"""
resized_w, resized_h = resized_size(
original_width, original_height, max_edge, max_tokens
)
return (x / resized_w, y / resized_h)
# 要将坐标转换到原始图像的像素空间,请将
# 相对坐标乘以原始尺寸:
# (rel_x * original_width, rel_y * original_height)填充仅应用于底部和右侧边缘,因此原点不会移动,按轴进行线性重新缩放即可。
许多适用于与 Claude 进行基于文本交互的提示技巧也可以应用于基于图像的提示。
以下示例演示了涉及图像的最佳实践提示结构。
正如将长文档放在查询之前可以改善文本提示的结果一样,当图像位于文本之前时,Claude 的表现最佳。放置在文本之后或与文本交错的图像仍然表现良好,但如果您的用例允许,请优先采用先图像后文本的结构。
以下示例演示了如何使用各种编程语言和方法来使用 Claude 的视觉能力。您可以通过三种方式向 Claude 提供图像:
image 内容块中作为 base64 编码的图像在 Amazon Bedrock 和 Vertex AI 上,目前仅支持 base64 编码的来源。
base64 示例提示使用以下变量:
以下是如何使用 base64 编码图像和 URL 引用在 Messages API 请求中包含图像的示例:
对于您将重复使用的图像,或者当您希望避免编码开销时,请使用 Files API。上传图像一次,然后在后续消息中引用返回的 file_id,而无需重新发送 base64 数据。
在多轮对话和智能体工作流中,每个请求都会重新发送完整的对话历史记录。如果图像是 base64 编码的,则每轮的负载中都会包含完整的图像字节,随着对话的增长,这会显著增加请求大小和延迟。将图像上传到 Files API 并通过 file_id 引用它们,无论对话历史记录中累积了多少图像,都能保持请求负载较小。
有关更多示例代码和参数详情,请参阅 Messages API 示例。
虽然 Claude 的图像理解能力处于前沿水平,但仍有一些限制需要注意:
请始终仔细审查和验证 Claude 的图像解读,尤其是在高风险用例中。对于需要完美精度或敏感图像分析的任务,请勿在没有人工监督的情况下使用 Claude。
准备好开始使用 Claude 构建图像应用了吗?以下是一些有用的资源:
如果您有任何其他问题,请联系支持团队。您还可以加入开发者社区,与其他创作者交流并获得 Anthropic 专家的帮助。
Was this page helpful?
import base64
import httpx
# 对于 base64 编码的图片
image1_url = "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg"
image1_media_type = "image/jpeg"
image1_data = base64.standard_b64encode(httpx.get(image1_url).content).decode("utf-8")
image2_url = "https://upload.wikimedia.org/wikipedia/commons/b/b5/Iridescent.green.sweat.bee1.jpg"
image2_media_type = "image/jpeg"
image2_data = base64.standard_b64encode(httpx.get(image2_url).content).decode("utf-8")
# 对于基于 URL 的图片,您可以在请求中直接使用 URLimage1_data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR4nGP4z8AAAAMBAQDJ/pLvAAAAAElFTkSuQmCC"
image1_media_type = "image/png"
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": image1_media_type,
"data": image1_data,
},
},
{"type": "text", "text": "Describe this image."},
],
}
],
)
print(message)client = anthropic.Anthropic()
message = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg",
},
},
{"type": "text", "text": "Describe this image."},
],
}
],
)
print(message)client = anthropic.Anthropic()
# 上传图片文件
with open("image.jpg", "rb") as f:
file_upload = client.beta.files.upload(file=("image.jpg", f, "image/jpeg"))
# 在消息中使用已上传的文件
message = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
betas=["files-api-2025-04-14"],
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {"type": "file", "file_id": file_upload.id},
},
{"type": "text", "text": "Describe this image."},
],
}
],
)
print(message.content)