{"product_id":"bắt-dầu-với-claude-vision-gửi-hinh-ảnh-qua-api","title":"Bắt đầu với Claude Vision — Gửi hình ảnh qua API","description":"\n\u003cp\u003eClaude không chỉ hiểu văn bản — nó còn có khả năng \u003cstrong\u003enhìn và phân tích hình ảnh\u003c\/strong\u003e. Tính năng này gọi là \u003cem\u003eVision\u003c\/em\u003e hay \u003cem\u003eMultimodal\u003c\/em\u003e, cho phép bạn gửi ảnh kèm theo câu hỏi và Claude sẽ trả lời dựa trên nội dung hình ảnh đó.\u003c\/p\u003e\n\n\u003cp\u003eBài viết này hướng dẫn bạn từ đầu: cách gửi hình ảnh qua API, các định dạng được hỗ trợ, giới hạn kích thước, và những ví dụ thực tế đơn giản nhất.\u003c\/p\u003e\n\n\u003ch2\u003eClaude Vision có thể làm gì?\u003c\/h2\u003e\n\n\u003cp\u003eTrước khi đi vào code, hãy hiểu Claude Vision có thể xử lý những gì:\u003c\/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eMô tả hình ảnh\u003c\/strong\u003e — Cho Claude xem ảnh, nó sẽ kể lại nội dung chi tiết\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTrích xuất text (OCR)\u003c\/strong\u003e — Đọc chữ viết trong ảnh, kể cả chữ viết tay\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePhân tích biểu đồ\u003c\/strong\u003e — Đọc số liệu từ bar chart, line chart, pie chart\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eNhận diện đối tượng\u003c\/strong\u003e — Xác định vật thể, người, địa điểm trong ảnh\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSo sánh hình ảnh\u003c\/strong\u003e — Tìm điểm giống và khác giữa nhiều ảnh\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePhân tích tài liệu\u003c\/strong\u003e — Đọc hóa đơn, hợp đồng, form scan\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eHai cách gửi hình ảnh\u003c\/h2\u003e\n\n\u003cp\u003eAPI của Claude hỗ trợ hai phương thức để gửi hình ảnh:\u003c\/p\u003e\n\n\u003col\u003e\n  \u003cli\u003e\n\u003cstrong\u003eBase64 encoding\u003c\/strong\u003e — Chuyển file ảnh thành chuỗi text, nhúng trực tiếp vào request\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eURL\u003c\/strong\u003e — Cung cấp link ảnh công khai, Claude tự fetch về\u003c\/li\u003e\n\u003c\/ol\u003e\n\n\u003cp\u003eMỗi cách có ưu và nhược điểm riêng — chúng ta sẽ xem cả hai.\u003c\/p\u003e\n\n\u003ch2\u003eCách 1: Gửi ảnh bằng Base64\u003c\/h2\u003e\n\n\u003cp\u003eBase64 là cách phổ biến nhất khi bạn có file ảnh trên máy. Bạn đọc file, chuyển thành base64 string, rồi nhúng vào request.\u003c\/p\u003e\n\n\u003ch3\u003ePython — đọc file và gửi base64\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport anthropic\nimport base64\n\n# Đọc file ảnh và encode thành base64\nwith open(\"image.jpg\", \"rb\") as f:\n    image_data = base64.standard_b64encode(f.read()).decode(\"utf-8\")\n\nclient = anthropic.Anthropic()\n\nmessage = client.messages.create(\n    model=\"claude-opus-4-5\",\n    max_tokens=1024,\n    messages=[\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\n                    \"type\": \"image\",\n                    \"source\": {\n                        \"type\": \"base64\",\n                        \"media_type\": \"image\/jpeg\",\n                        \"data\": image_data,\n                    },\n                },\n                {\n                    \"type\": \"text\",\n                    \"text\": \"Mo ta hinh anh nay cho toi.\"\n                }\n            ],\n        }\n    ],\n)\n\nprint(message.content[0].text)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eLưu ý cấu trúc của \u003ccode\u003econtent\u003c\/code\u003e: đây là một \u003cstrong\u003elist\u003c\/strong\u003e chứa các block, mỗi block có \u003ccode\u003etype\u003c\/code\u003e là \u003ccode\u003e\"image\"\u003c\/code\u003e hoặc \u003ccode\u003e\"text\"\u003c\/code\u003e. Bạn có thể kết hợp nhiều block theo thứ tự bất kỳ.\u003c\/p\u003e\n\n\u003ch3\u003eCác media_type được hỗ trợ\u003c\/h3\u003e\n\n\u003cp\u003eClaude hỗ trợ bốn định dạng ảnh phổ biến nhất:\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n\u003cth\u003eĐịnh dạng\u003c\/th\u003e\n\u003cth\u003emedia_type\u003c\/th\u003e\n\u003cth\u003eGhi chú\u003c\/th\u003e\n\u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n\u003ctd\u003eJPEG\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eimage\/jpeg\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003ePhổ biến nhất, nén tốt\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003ePNG\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eimage\/png\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003eKhông mất dữ liệu, hỗ trợ transparency\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eGIF\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eimage\/gif\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003eChỉ đọc frame đầu tiên nếu là animated\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eWebP\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eimage\/webp\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003eĐịnh dạng hiện đại, nén tốt hơn JPEG\u003c\/td\u003e\n\u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003e\u003cstrong\u003eChú ý:\u003c\/strong\u003e PDF, TIFF, BMP không được hỗ trợ trực tiếp. Nếu bạn có PDF, cần chuyển từng trang thành ảnh PNG hoặc JPEG trước.\u003c\/p\u003e\n\n\u003ch2\u003eCách 2: Gửi ảnh bằng URL\u003c\/h2\u003e\n\n\u003cp\u003eNếu ảnh đã có sẵn trên internet với URL công khai, bạn không cần download về mà có thể gửi URL thẳng:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport anthropic\n\nclient = anthropic.Anthropic()\n\nmessage = client.messages.create(\n    model=\"claude-opus-4-5\",\n    max_tokens=1024,\n    messages=[\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\n                    \"type\": \"image\",\n                    \"source\": {\n                        \"type\": \"url\",\n                        \"url\": \"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/4\/47\/PNG_transparency_demonstration_1.png\/280px-PNG_transparency_demonstration_1.png\",\n                    },\n                },\n                {\n                    \"type\": \"text\",\n                    \"text\": \"Hinh anh nay mo ta gi?\"\n                }\n            ],\n        }\n    ],\n)\n\nprint(message.content[0].text)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eURL phải là \u003cstrong\u003elink trực tiếp đến file ảnh\u003c\/strong\u003e (kết thúc bằng .jpg, .png, v.v.), không phải trang web chứa ảnh. Ảnh phải publicly accessible — URL yêu cầu đăng nhập hoặc signed URL sẽ không hoạt động.\u003c\/p\u003e\n\n\u003ch2\u003eGiới hạn kích thước và số lượng\u003c\/h2\u003e\n\n\u003cp\u003eClaude có một số giới hạn quan trọng bạn cần biết:\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n\u003cth\u003eGiới hạn\u003c\/th\u003e\n\u003cth\u003eGiá trị\u003c\/th\u003e\n\u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n\u003ctd\u003eKích thước ảnh tối đa\u003c\/td\u003e\n\u003ctd\u003e5 MB mỗi ảnh (sau khi base64 encode)\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eSố ảnh tối đa mỗi request\u003c\/td\u003e\n\u003ctd\u003e20 ảnh\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eTổng context window\u003c\/td\u003e\n\u003ctd\u003e200,000 tokens (bao gồm cả ảnh)\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eĐộ phân giải tối đa\u003c\/td\u003e\n\u003ctd\u003e8000 x 8000 pixels\u003c\/td\u003e\n\u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003e\u003cstrong\u003eẢnh tính token như thế nào?\u003c\/strong\u003e Claude chuyển ảnh thành \"tiles\" 512x512 pixel trước khi xử lý. Một ảnh 1000x1000 tốn khoảng \u003cstrong\u003e1334 tokens\u003c\/strong\u003e. Ảnh lớn hơn tốn nhiều tokens hơn nhưng cũng cung cấp nhiều chi tiết hơn.\u003c\/p\u003e\n\n\u003ch2\u003eVí dụ thực tế: Mô tả hình ảnh\u003c\/h2\u003e\n\n\u003cp\u003eĐây là script hoàn chỉnh để mô tả một ảnh từ file local:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport anthropic\nimport base64\nimport sys\n\ndef describe_image(image_path: str) -\u0026gt; str:\n    \"\"\"Mo ta noi dung cua mot file anh.\"\"\"\n\n    # Xac dinh media type tu extension\n    ext = image_path.lower().split(\".\")[-1]\n    media_types = {\n        \"jpg\": \"image\/jpeg\",\n        \"jpeg\": \"image\/jpeg\",\n        \"png\": \"image\/png\",\n        \"gif\": \"image\/gif\",\n        \"webp\": \"image\/webp\",\n    }\n    media_type = media_types.get(ext, \"image\/jpeg\")\n\n    # Doc va encode anh\n    with open(image_path, \"rb\") as f:\n        image_data = base64.standard_b64encode(f.read()).decode(\"utf-8\")\n\n    # Goi API\n    client = anthropic.Anthropic()\n    message = client.messages.create(\n        model=\"claude-haiku-4-5\",\n        max_tokens=512,\n        messages=[\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"image\",\n                        \"source\": {\n                            \"type\": \"base64\",\n                            \"media_type\": media_type,\n                            \"data\": image_data,\n                        },\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"Hay mo ta chi tiet noi dung cua hinh anh nay bang tieng Viet.\"\n                    }\n                ],\n            }\n        ],\n    )\n    return message.content[0].text\n\n# Chay thu\nif __name__ == \"__main__\":\n    path = sys.argv[1] if len(sys.argv) \u0026gt; 1 else \"test.jpg\"\n    print(describe_image(path))\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVí dụ: Trích xuất text từ ảnh (OCR đơn giản)\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003edef extract_text_from_image(image_path: str) -\u0026gt; str:\n    \"\"\"Trich xuat van ban tu hinh anh.\"\"\"\n    with open(image_path, \"rb\") as f:\n        image_data = base64.standard_b64encode(f.read()).decode(\"utf-8\")\n\n    client = anthropic.Anthropic()\n    message = client.messages.create(\n        model=\"claude-haiku-4-5\",\n        max_tokens=2048,\n        messages=[\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"image\",\n                        \"source\": {\n                            \"type\": \"base64\",\n                            \"media_type\": \"image\/jpeg\",\n                            \"data\": image_data,\n                        },\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"Hay trich xuat toan bo van ban trong hinh anh nay. Chi tra ve text, khong co nhan xet them.\"\n                    }\n                ],\n            }\n        ],\n    )\n    return message.content[0].text\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVí dụ: Phân tích biểu đồ\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003edef analyze_chart(chart_image_path: str) -\u0026gt; dict:\n    \"\"\"Phan tich bieu do va trich xuat so lieu.\"\"\"\n    with open(chart_image_path, \"rb\") as f:\n        image_data = base64.standard_b64encode(f.read()).decode(\"utf-8\")\n\n    client = anthropic.Anthropic()\n    message = client.messages.create(\n        model=\"claude-opus-4-5\",\n        max_tokens=1024,\n        messages=[\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\n                        \"type\": \"image\",\n                        \"source\": {\n                            \"type\": \"base64\",\n                            \"media_type\": \"image\/png\",\n                            \"data\": image_data,\n                        },\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"Phan tich bieu do nay:\n1. Loai bieu do la gi?\n2. Cac muc du lieu chinh?\n3. Xu huong hoac insight quan trong nhat?\"\n                    }\n                ],\n            }\n        ],\n    )\n    return message.content[0].text\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eLỗi thường gặp khi mới bắt đầu\u003c\/h2\u003e\n\n\u003ch3\u003eLỗi 1: Sai media_type\u003c\/h3\u003e\n\u003cp\u003eNếu bạn khai báo \u003ccode\u003emedia_type: \"image\/jpeg\"\u003c\/code\u003e nhưng gửi file PNG, Claude sẽ báo lỗi hoặc phân tích sai. Luôn đảm bảo media_type khớp với định dạng thực tế của file.\u003c\/p\u003e\n\n\u003ch3\u003eLỗi 2: Ảnh quá lớn\u003c\/h3\u003e\n\u003cp\u003eFile ảnh 10MB sẽ bị reject. Trước khi gửi, resize ảnh xuống còn khoảng 1920x1080 hoặc nhỏ hơn — chất lượng phân tích không giảm đáng kể nhưng giảm được chi phí và tốc độ.\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom PIL import Image\nimport io\n\ndef resize_image(image_path: str, max_size: int = 1920) -\u0026gt; bytes:\n    \"\"\"Thu nho anh neu qua lon.\"\"\"\n    with Image.open(image_path) as img:\n        # Giu ty le aspect ratio\n        img.thumbnail((max_size, max_size))\n        buffer = io.BytesIO()\n        img.save(buffer, format=\"JPEG\", quality=85)\n        return buffer.getvalue()\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eLỗi 3: URL ảnh không public\u003c\/h3\u003e\n\u003cp\u003eURL từ Google Drive, Dropbox shared links thường không phải direct link. Dùng các hosting service như Imgur, Cloudinary, hoặc S3 public bucket.\u003c\/p\u003e\n\n\u003ch2\u003eTổng kết\u003c\/h2\u003e\n\n\u003cp\u003eBạn đã học được những điều cơ bản nhất về Claude Vision:\u003c\/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eBase64\u003c\/strong\u003e — Dùng khi có file ảnh local, nhúng trực tiếp vào request\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eURL\u003c\/strong\u003e — Dùng khi ảnh đã có sẵn trên internet với link public\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eĐịnh dạng hỗ trợ\u003c\/strong\u003e — JPEG, PNG, GIF, WebP\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eGiới hạn\u003c\/strong\u003e — 5MB mỗi ảnh, tối đa 20 ảnh mỗi request\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003cp\u003eBước tiếp theo: Đọc \u003ca href=\"\/collections\/nang-cao\"\u003eBest Practices cho Vision\u003c\/a\u003e để biết cách đặt ảnh và viết prompt hiệu quả hơn, và xem \u003ca href=\"\/collections\/ung-dung\"\u003eOCR với Claude\u003c\/a\u003e để ứng dụng vào bài toán thực tế.\u003c\/p\u003e\n\n\u003chr\u003e\n\u003ch3\u003eBài viết liên quan\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"\/products\/multi-modal-rag-v%E1%BB%9Bi-llamaindex-claude-vision\"\u003eMulti-Modal RAG với LlamaIndex + Claude Vision\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/crop-tool-cho-claude-kh%E1%BA%A3-nang-zoom-vao-chi-ti%E1%BA%BFt-hinh-%E1%BA%A3nh\"\u003eCrop Tool — Cho Claude khả năng zoom vào chi tiết hình ảnh\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/best-practices-cho-vision-t%E1%BB%91i-%C6%B0u-hinh-%E1%BA%A3nh-g%E1%BB%ADi-claude\"\u003eBest Practices cho Vision — Tối ưu hình ảnh gửi Claude\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/claude-api-authentication-rate-limits-va-error-handling\"\u003eClaude API — Authentication, Rate Limits và Error Handling\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/claude-phan-tich-d%E1%BB%AF-li%E1%BB%87u-h%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-k%E1%BA%BFt-n%E1%BB%91i-cong-c%E1%BB%A5\"\u003eClaude Phân tích Dữ liệu: Hướng dẫn Kết nối Công cụ\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721833267412,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/b_t-d_u-v_i-claude-vision-g_i-hinh-_nh-qua-api.jpg?v=1774513308","url":"https:\/\/claude.vn\/products\/b%e1%ba%aft-d%e1%ba%a7u-v%e1%bb%9bi-claude-vision-g%e1%bb%adi-hinh-%e1%ba%a3nh-qua-api","provider":"CLAUDE.VN","version":"1.0","type":"link"}