python图像转换——BMP 位图文件的解析

1.编写 Python 程序,读取一个 24 位真彩色 BMP 文件,然后转化为灰色图像,最后存储为 8 位伪彩色 BMP 文件;
2.编写 Python 程序,读取一个 8 位伪彩色 BMP 文件,转化为 24 位真彩色 BMP 文件,最后存储。
注意:以上两个 Python 程序设计任务,要求使用面向对象的式来写(使用 class),不能使用 Python 图像模块/包/库,如 opencv、
PIL 等。在定义 class 里的成员时,可使用 int.to_bytes、int.from_bytes等。

先做第一问吧,另一个思路一样

import struct

class Converter:
    def convert(inputfile, outputfile):
        # 读取BMP文件头信息
        with open(inputfile, 'rb') as f:
            bmp_header = f.read(54)  # BMP 文件头长度为 54 字节

        # 解析BMP文件头信息
        img_width, img_height, _, _, img_depth, _ = struct.unpack('<iiihhii', bmp_header[18:34])

        # 读取24位真彩色BMP像素数据
        with open(inputfile, 'rb') as f:
            pixel_data_offset = struct.unpack('<I', f.read(10)[10:14])[0]  # BMP像素数据的偏移量
            f.seek(pixel_data_offset)
            raw_data = f.read()

        # 将24位真彩色像素数据转换为灰度像素数据
        gray_data = []
        for i in range(0, len(raw_data), 3):
            b, g, r = raw_data[i:i+3]
            gray_data.append(int(0.299 * r + 0.587 * g + 0.114 * b))

        # 将灰度像素数据转换为伪彩色像素数据
        color_data = bytearray()
        for i in gray_data:
            color_data.extend(bytes([i, i, i]))

        # 保存伪彩色图像为8位BMP文件
        with open(outputfile, 'wb') as f:
            f.write(bmp_header)
            f.write(color_data)

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^