ami*_*min 10 python image bmp python-3.x
我有一个bmp文件.这只是一个红色的广场.我必须编写一个带有函数的程序,使其具有白色条纹.我需要做的事情:
我是新手,无法阅读或显示原始的bmp文件,更不用说编辑里面的内容了.它与打开txt文件和"readline()"不相似.另外,当我将bmp文件复制粘贴到eclipse中的pydev projects src文件夹中时,它不会显示在eclipse上,所以我不知道计算机是否会识别该文件存在.我想在发布之前阅读它,但我似乎没有得到很多结果谷歌搜索,因为我不确定我应该搜索到什么.
aba*_*ert 21
这样做的简单方法是使用像PIL/Pillow这样的第三方图像处理库.代码非常简单,您可以在几分钟内从Image模块文档中的示例中找到它...
但是,如果您不允许这样做,那么让我们看看如何手动执行此操作.
首先,BMP不是文本文件格式,它是二进制格式.这意味着你必须以二进制模式阅读它.并且你不能"逐行"地阅读它,因为它没有要读取的文本行.由于bytes对象不可变,您可能希望将其复制到一个bytearray可以使用的对象中.所以:
with open('spam.bmp', 'rb') as f:
data = bytearray(f.read())
Run Code Online (Sandbox Code Playgroud)
接下来,您需要解析BMP文件格式.我假设这个练习的要点是弄清楚如何自己做,所以我会给你一个维基百科文章的链接,这篇文章比微软的文档描述得更好,你可以从那里开始.
struct标准库中的模块对于解释标题非常有用; 它更容易阅读与32位小尾数号码struct.unpack_from('<L', data, offset)通过阅读比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
Run Code Online (Sandbox Code Playgroud)
最后,一旦您将红色像素更改为白色,您可以使用以下方法保存:
with open('eggs.bmp', 'wb') as f:
f.write(data)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24136 次 |
| 最近记录: |