在Python 3中处理.bmp文件

10

我有一个bmp文件,它只是一个红色的正方形。我需要编写一个程序来使其具有白色条纹,需要做以下几件事:

  • 加载bmp文件。
  • 读取和评估bmp文件。
  • 将文件的特定区域坐标编码为白色。
  • 关闭文件。
  • 将最终产品文件显示为输出。

我是个新手,对于读取或显示原始bmp文件,甚至编辑其中的内容都感到困难。这与打开txt文件并使用“readline()”不同。另外,当我将bmp文件复制粘贴到Eclipse的pydev项目src文件夹中时,它不会在Eclipse中显示出来,所以我不知道计算机如何识别文件是否存在。我想在发布问题之前先研究一下,但我搜索不到太多结果,因为我不确定应该搜索什么。


1
你是否需要在不使用第三方模块(例如PIL/Pillow)的情况下完成这个任务? - abarnert
显然不能使用基本编码。这是一年级计算机课程的作业。我尝试使用import image,但是不允许这样做。 - amin
1个回答

25

使用第三方图片处理库(例如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)

谢谢,这对我帮助很大。我不确定如何处理BMP文件。我会查找更多有关二进制文件类型的信息。 - amin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接