如何通过Python从URL请求响应中提取图片宽高尺寸
从Requests响应中直接获取图片尺寸
方法1:手动解析图片头部字节(以JPG/PNG为例)
图片的尺寸信息存储在文件头部的元数据中,无需下载完整图片,只需获取前几百字节即可解析。
步骤1:请求图片的头部数据
使用Range请求头仅获取文件前512字节,减少带宽消耗:
import requests url = "https://c4.wallpaperflare.com/wallpaper/296/372/981/wall-e-pixar-disney-movies-wallpaper-preview.jpg" headers = {"Range": "bytes=0-511"} # 仅请求前512字节 response = requests.get(url, headers=headers) image_header = response.content
步骤2:解析JPG尺寸
JPG的宽高信息存储在SOF(帧开始)段中,遍历字节找到对应标记即可提取:
def get_jpg_dimensions(data): offset = 2 # 跳过JPG起始标记(FF D8) while offset < len(data): if data[offset] != 0xFF: break marker = data[offset+1] # 筛选有效帧开始标记(排除非帧相关的标记) if 0xC0 <= marker <= 0xCF and marker not in (0xC4, 0xCC): # 大端字节序解析宽高:高度在前,宽度在后 height = (data[offset+5] << 8) | data[offset+6] width = (data[offset+7] << 8) | data[offset+8] return width, height # 跳过当前标记段:长度字段包含自身2字节,需累加偏移量 segment_length = (data[offset+2] << 8) | data[offset+3] offset += segment_length return None
步骤3:解析PNG尺寸
PNG的宽高在文件开头的IHDR块中,位置固定:
def get_png_dimensions(data): # 校验PNG文件头 if data[:8] != b'\x89PNG\r\n\x1a\n': return None # 大端字节序解析宽高:宽度在16-19字节,高度在20-23字节 width = (data[16] << 24) | (data[17] << 16) | (data[18] << 8) | data[19] height = (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23] return width, height
整合使用
# 根据文件头判断图片类型并解析尺寸 if image_header.startswith(b'\xff\xd8'): dimensions = get_jpg_dimensions(image_header) elif image_header.startswith(b'\x89PNG'): dimensions = get_png_dimensions(image_header) else: dimensions = "不支持的图片格式" if dimensions: print(f"图片尺寸:{dimensions[0]} x {dimensions[1]}") else: print("无法解析图片尺寸")
方法2:使用轻量库imagesize(推荐)
如果不想手动处理字节解析,可以用专门的imagesize库,它能从部分字节数据中快速提取多种格式图片的尺寸,无需加载完整图片:
安装库
pip install imagesize
使用代码
import requests import imagesize url = "https://c4.wallpaperflare.com/wallpaper/296/372/981/wall-e-pixar-disney-movies-wallpaper-preview.jpg" headers = {"Range": "bytes=0-511"} response = requests.get(url, headers=headers) # 直接从响应字节中获取尺寸 width, height = imagesize.get(response.content) print(f"图片尺寸:{width} x {height}")
该库支持JPG、PNG、GIF、WebP等多种常见图片格式,解析逻辑稳定且无需手动维护。
内容的提问来源于stack exchange,提问作者user8234870
相关产品推荐
相关产品推荐

