在python 3中使用.bmp文件

时间:2013-11-29 00:01:04

标签: python image python-3.x bmp

我有一个bmp文件。这只是一个红色的广场。我必须编写一个带有函数的程序,使其具有白色条纹。我需要做的事情:

  • 加载bmp文件。
  • 阅读并评估bmp文件。
  • 将要着色的文件的某些区域坐标编码为白色。
  • 关闭文件
  • 将最终产品文件显示为输出

我是新手,无法阅读或显示原始bmp文件,更不用说编辑内部内容了。它与打开txt文件和“readline()”不相似。另外,当我将bmp文件复制粘贴到eclipse中的pydev projects src文件夹中时,它不会显示在eclipse上,所以我不知道计算机是否会识别该文件存在。我想在发布之前阅读它,但我似乎没有得到很多结果谷歌搜索,因为我不确定我应该搜索到什么。

1 个答案:

答案 0 :(得分:19)

执行此操作的简便方法是使用第三方图像处理库,例如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', data, offset)读取32位小端数字要比阅读data[offset]data[offset+1]等更容易,并将它们重新组合成32位数字。< / p>

我猜你可以忽略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)