如何从非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
相关产品推荐
相关产品推荐

