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

如何从非JPEG/TIFF远程图片URL仅加载26字节获取宽高

从远程URL仅加载26字节解析非JPEG/TIFF图片的宽高

嘿,我来帮你搞定这个问题!你已经迈出了关键的第一步,但之前的代码里f.read()会读取整个文件,得改成读取前26字节才行。接下来我们针对不同的图片格式(PNG、GIF、WebP这些非JPEG/TIFF的类型),从这26字节里解析宽高信息。

第一步:修正读取字节的代码

首先调整你的代码,确保只读取前26字节:

import urllib2

url = "你的图片URL地址"
try:
    f = urllib2.urlopen(url)
    # 仅读取前26字节
    header_data = f.read(26)
finally:
    f.close()

第二步:根据格式解析宽高

不同图片格式的宽高元数据存储位置和字节序(大端/小端)不一样,我们写一个函数来处理常见的非JPEG/TIFF格式:

def parse_image_dimensions(header_data):
    # 解析PNG格式:开头为\x89PNG\r\n\x1a\n
    if header_data.startswith(b'\x89PNG\r\n\x1a\n'):
        # PNG的IHDR块从第8字节开始,宽高各占4字节(大端序)
        width = int.from_bytes(header_data[16:20], byteorder='big')
        height = int.from_bytes(header_data[20:24], byteorder='big')
        return (width, height)
    
    # 解析GIF格式:开头为GIF87a或GIF89a
    elif header_data.startswith(b'GIF87a') or header_data.startswith(b'GIF89a'):
        # GIF的宽高在第6-9字节(小端序)
        width = int.from_bytes(header_data[6:8], byteorder='little')
        height = int.from_bytes(header_data[8:10], byteorder='little')
        return (width, height)
    
    # 解析WebP格式:开头为RIFF且包含WEBP标识
    elif header_data.startswith(b'RIFF') and header_data[8:12] == b'WEBP':
        chunk_type = header_data[12:16]
        # 处理VP8X类型的WebP
        if chunk_type == b'VP8X':
            # VP8X的宽高用3字节存储,需要加1得到实际尺寸
            width = (header_data[17] << 16) | (header_data[18] << 8) | header_data[19]
            width += 1
            height = (header_data[20] << 16) | (header_data[21] << 8) | header_data[22]
            height += 1
            return (width, height)
        # 处理VP8L类型的WebP
        elif chunk_type == b'VP8L':
            # VP8L的宽高是可变长度编码,这里简化处理常见情况
            w = header_data[17] | ((header_data[18] & 0x0F) << 8)
            h = (header_data[18] >> 4) | (header_data[19] << 4)
            width = w + 1
            height = h + 1
            return (width, height)
    
    # 无法解析的格式或数据不足
    return None

第三步:调用解析函数

最后调用函数获取结果:

dimensions = parse_image_dimensions(header_data)
if dimensions:
    print(f"图片宽:{dimensions[0]},高:{dimensions[1]}")
else:
    print("无法解析该图片格式,或者该格式需要加载更多字节(比如JPEG/TIFF)")

注意事项

  • 这个方法只适用于非JPEG/TIFF格式,因为JPEG和TIFF的宽高信息可能存储在文件的不同位置,通常需要加载更多字节才能解析。
  • 部分特殊编码的WebP可能需要更复杂的解析逻辑,但大部分常见场景下上面的代码足够覆盖。

内容的提问来源于stack exchange,提问作者bhavin jalodara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:30:37