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)
不知道你这个问题是否已经解决, 如果还没有解决的话: