使用第三方图片处理库(例如PIL/Pillow)是最简单的方法。你可以从Image
模块文档中的示例中在几分钟内理解代码。但如果不允许使用此类库,下面将介绍如何手动完成。
首先,BMP不是文本文件格式,它是一种二进制格式。这意味着您必须以二进制模式读取它。而且您不能“逐行”读取它,因为它没有要读取的文本行。由于bytes
对象是不可变的,因此您可能希望将其复制到bytearray
中进行操作。所以:
with open('spam.bmp', 'rb') as f:
data = bytearray(f.read())
接下来,你需要解析BMP文件格式。我假设这个练习的主要目的是让你自己弄清楚如何做到这一点,所以我会给你一个链接维基百科文章,这篇文章比微软文档更好地描述了它,你可以从那里入手。
Python标准库中的struct
模块将非常有助于解释头文件;使用struct.unpack_from('<L', data, offset)
读取32位小端数字比阅读data[offset]
,data[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)