You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:01:10