1

我正在使用以下代码来查找给定图像的位深度:

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]))

当我输入我的其他测试图像时,它应该可以正常工作,但是当我专门从这个页面输入小样本图像时,它会输出 196640。我在 Hex Editor Neo 中查看了该文件,所选字节的值为 32 . 有谁知道为什么程序不返回这个值?

4

1 回答 1

1

从偏移量开始的 4 个字节0x1c20 00 03 00little-endian 字节格式中确实是十进制的 196640。问题是你想要的只是20 00小端字节格式,十进制32。

关于BMP 文件格式的 Wikipedia 文章(在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

于 2021-07-26T21:30:06.827 回答