特定图像 returns 使用 struct.unpack_from 解析时的奇怪值
Specific image returns strange value when parsed with struct.unpack_from
我正在使用以下代码查找给定图像的位深度:
def parseImage(self):
with open(self.imageAddress, "rb") as image:
data = bytearray(image.read())
bitDepth = struct.unpack_from("<L", data, 0x0000001c)
print("the image's colour depth is " + str(bitDepth[0]))
当我输入其他测试图像时,它可以正常工作,但是当我专门输入来自 this page 的小样本图像时,它输出 196640。我已经在 Hex Editor Neo 中查看了该文件,并且所选字节的值为 32。有谁知道为什么程序没有 return 这个值?
从偏移量 0x1c
开始的 4 个字节是 20 00 03 00
,它确实是小端字节格式的十进制 196640。问题是你想要的只是 20 00
,它也是小端字节格式, 是 十进制的 32。
维基百科关于 BMP file format 的文章(在 Windows BITMAPINFOHEADER 部分)说它只是一个两字节的值——所以问题出在你身上正在解析太多字节。
修复很简单,为 struct
格式字符串中的无符号整数指定正确的字节数("<H"
而不是 "<L"
)。请注意,我还添加了一些脚手架,使发布的代码可以运行。
import struct
class Test:
def __init__(self, filename):
self.imageAddress = filename
def parseImage(self):
with open(self.imageAddress, "rb") as image:
data = bytearray(image.read())
bitDepth = struct.unpack_from("<H", data, 0x1c)
print("the image's colour depth is " + str(bitDepth[0]))
t = Test('Small Sample BMP Image File Download.bmp')
t.parseImage() # -> the image's colour depth is 32
我正在使用以下代码查找给定图像的位深度:
def parseImage(self):
with open(self.imageAddress, "rb") as image:
data = bytearray(image.read())
bitDepth = struct.unpack_from("<L", data, 0x0000001c)
print("the image's colour depth is " + str(bitDepth[0]))
当我输入其他测试图像时,它可以正常工作,但是当我专门输入来自 this page 的小样本图像时,它输出 196640。我已经在 Hex Editor Neo 中查看了该文件,并且所选字节的值为 32。有谁知道为什么程序没有 return 这个值?
从偏移量 0x1c
开始的 4 个字节是 20 00 03 00
,它确实是小端字节格式的十进制 196640。问题是你想要的只是 20 00
,它也是小端字节格式, 是 十进制的 32。
维基百科关于 BMP file format 的文章(在 Windows BITMAPINFOHEADER 部分)说它只是一个两字节的值——所以问题出在你身上正在解析太多字节。
修复很简单,为 struct
格式字符串中的无符号整数指定正确的字节数("<H"
而不是 "<L"
)。请注意,我还添加了一些脚手架,使发布的代码可以运行。
import struct
class Test:
def __init__(self, filename):
self.imageAddress = filename
def parseImage(self):
with open(self.imageAddress, "rb") as image:
data = bytearray(image.read())
bitDepth = struct.unpack_from("<H", data, 0x1c)
print("the image's colour depth is " + str(bitDepth[0]))
t = Test('Small Sample BMP Image File Download.bmp')
t.parseImage() # -> the image's colour depth is 32