如何通过Python原生请求向Azure分析图像API传递原始二进制图像
解决Azure图像分析API传递二进制图像的JSON格式错误问题
你当前的写法有两个核心问题:
- 语法错误:
payload = {{'url': contents}}这种嵌套大括号的写法是无效的Python字典定义,本身就会导致JSON序列化失败。 - 逻辑错误:Azure的图像分析API接收二进制图像时,不需要把数据放到JSON的
url字段里——这个字段是专门用来传图像URL的。传递原始二进制数据时,应该直接把二进制内容作为请求体发送,同时修改请求头的Content-Type。
修正后的代码示例
获取图像二进制数据的部分可以保留,重点修改请求发送逻辑:
import requests import io from PIL import Image # 假设你用PIL处理图像,tmp_imp是PIL图像对象 # 1. 获取内存中的图像二进制数据(这部分保留你的写法) with io.BytesIO() as output: tmp_imp.save(output, format="JPEG") image_data = output.getvalue() # 2. 设置请求头:替换成你的订阅密钥,修改Content-Type为二进制流格式 headers = { 'Ocp-Apim-Subscription-Key': '你的Azure订阅密钥', 'Content-Type': 'application/octet-stream' # 也可以用更具体的image/jpeg } # 3. 设置API分析参数,按需调整视觉特征 params = { 'visualFeatures': 'Categories,Description,Color' } # 4. 发送请求:直接把二进制数据传给data参数,无需JSON序列化 analyze_url = 'https://westcentralus.api.cognitive.microsoft.com/vision/v3.2/analyze' # 替换成你的API端点 response = requests.post(analyze_url, headers=headers, params=params, data=image_data) # 处理响应 response.raise_for_status() analysis_results = response.json() print(analysis_results)
补充说明
- 如果是读取本地文件的二进制数据,可直接用
open('本地图像路径.jpg', 'rb').read()获取,无需经过io.BytesIO(除非你是在内存中处理图像)。 - 确保
analyze_url的区域和你的Azure订阅区域一致,比如换成你实际使用的区域端点。
内容的提问来源于stack exchange,提问作者Nik Ska
相关产品推荐
相关产品推荐

