【问题标题】:working with .bmp files in python 3在 python 3 中使用 .bmp 文件
【发布时间】:2013-11-29 00:01:03
【问题描述】:

我有一个 bmp 文件。它只是一个红色方块。我必须编写一个具有使其具有白色条纹的功能的程序。我需要做的事情:

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

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

【问题讨论】:

  • 您是否应该在不使用第三方模块(例如 PIL/Pillow)的情况下执行此操作?
  • 显然不是。仅使用基本编码。这是第一年的 cp 课程作业。我尝试使用导入图像,但这是不允许的

标签: python image python-3.x bmp


【解决方案1】:

最简单的方法是使用第三方图像处理库,如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 位 little-endian 数字比使用 data[offset]data[offset+1] 等读取并将它们重新组合成一个 32 位数字要容易得多。

我猜你可以忽略 BMP 压缩的所有选项——否则,这将是一个太难的任务。事实上,您可能只是假设所有标题都将指定最常见的变体和唯一的代码。但您可能想向您的老师征求意见。

现在,一旦您找到了 BMP 的“像素阵列”部分,并且您已经知道如何从 DIB 标头解释它,您可以通过设置字节数组的适当索引处的值。例如,结果可能很简单:

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 文件。我会查找更多关于二进制文件类型的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 2018-04-10
  • 2019-10-17
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多