本指南說明如何在 Claude 中使用圖片,包括最佳實踐、程式碼範例以及需要注意的限制。
您可以透過以下方式使用 Claude 的視覺能力:
單一請求中可以包含多張圖片,Claude 在制定回應時會一併分析這些圖片。這對於比較或對照圖片很有幫助。
每則訊息或請求的最大圖片數量為:
每張圖片的最大尺寸為 8000x8000 像素。
如果單一 API 請求包含超過 20 張圖片,則會套用更嚴格的單張圖片尺寸限制。在 Amazon Bedrock 和 Vertex AI 上,PDF 等文件區塊也會計入此門檻。超過此更嚴格限制的圖片會被拒絕,並回傳 invalid_request_error,其訊息會提及「many-image requests」並說明目前的像素限制。若要在所有平台上保持在限制範圍內,請將每張圖片調整大小,使任一邊都不超過 2000 像素,或將請求中的圖片和文件區塊總數控制在 20 個以內。
每張圖片的最大大小為:
Claude 以區塊(patch)而非像素的方式檢視圖片。每個區塊是圖片中 28×28 像素的方塊,稱為視覺 token。因此,一張圖片的成本為 ⌈width / 28⌉ × ⌈height / 28⌉ 個視覺 token。
如果 Claude 收到過大的圖片,會將其調整大小。最大原生圖片解析度為:
如果您的輸入圖片大於此原生解析度,它會先被調整為保持長寬比的最大可能尺寸。所有圖片(無論是否經過調整大小)接著都會在底部和右側邊緣填充至 28 像素的倍數。確切規則請參閱 Claude 如何調整圖片大小和填充。
當要求 Claude 輸出座標(點、邊界框等)時,使用相對於其所見的調整後圖片的絕對像素座標效果最佳。處理方式請參閱使用座標和邊界框。
為了最小化「latency」(延遲)並簡化基於座標的工作流程,您應優先在上傳前調整圖片大小。
您在請求中包含的每張圖片都會計入您的 token 使用量。若要計算大約成本,請將圖片的視覺 token 數量(請參閱評估圖片大小)乘以您所使用模型的每 token 價格。
以下是在 API 大小限制範圍內,基於 Claude Sonnet 4.6 每百萬輸入 token 3 美元的價格,不同圖片大小的 token 化和大約成本範例:
| 圖片大小 | Token 數量 | 每張圖片成本 | 每 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),這限制了它們的 token 成本。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 倍的圖片 token(每張圖片 4784 個 token 對比 1568 個 token)。如果您不需要額外的精細度,請在傳送前對圖片進行降採樣以控制 token 成本。
以下是相同圖片大小在 Claude Opus 4.7 和 Claude Opus 4.8 上的 token 化結果,基於其每百萬輸入 token 5 美元的價格:
| 圖片大小 | Token 數量 | 每張圖片成本 | 每 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 個視覺 token)的圖片仍會被縮小。
向 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⌉ 不超過模型的視覺 token 預算(大多數模型為 1568 個 token,Claude Opus 4.7 及後續模型為 4784 個)。對於大多數照片和螢幕截圖,觸發調整大小的是邊長限制。對於直向文件,通常是視覺 token 限制先觸發,而忽略這一點是座標錯位最常見的原因。例如,以 130 DPI 掃描的 A4 頁面為 1075×1520 像素:兩邊都低於 1568 像素,但其成本為 39 × 55 = 2145 個視覺 token,因此 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)