这样做的简单方法是使用像
PIL/Pillow这样的第三方图像处理库.代码非常简单,您可以在几分钟内从
Image模块文档中的示例中找到它…
但是,如果您不允许这样做,那么让我们看一下如何手动执行此操作.
首先,BMP不是文本文件格式,它是二进制格式.这意味着你必须以二进制模式阅读它.并且你不能“逐行”地阅读它,因为它没有要读取的文本行.由于bytes对象不可变,因此您可能希望将其复制到bytearray中以便使用.所以:
with open('spam.bmp', 'rb') as f:
data = bytearray(f.read())
接下来,您需要解析BMP文件格式.我假设练习的要点是弄清楚如何自己做,所以我会给你一个链接到Wikipedia’s article,它比Microsoft文档更好地描述它,你可以从那里开始.
标准库中的struct模块对于解释标题非常有用;使用struct.unpack_from(‘< L',数据,偏移)读取32位小端数比读取数据[offset],数据[offset 1]等更容易并重新组合它们要容易得多成32位数. 我猜你可以忽略BMP压缩的所有选项 – 否则,这将是一个太难的任务.实际上,您可能只是假设所有标头都将指定最常见的变体,并且仅指定代码.但是你可能想问你的老师对此的反馈. 现在,一旦你找到了BMP的“像素阵列”部分,并且你已经想出如何从DIB标题解释它,你可以通过设置所需的位置将像素设置为白色. bytearray的适当索引.例如,它可能会变得如此简单:
pos = pixel_array_offset + row_size * y + pixel_size * x
data[pos:pos+3] = 255, 255, 255
最后,将红色像素更改为白色后,可以使用以下方法保存:
with open('eggs.bmp', 'wb') as f:
f.write(data)