如何解释二进制位图图片,以便我知道在更改代码中的某些内容时会更改哪个像素的颜色?

时间:2018-11-13 16:59:32

标签: image bitmap binary

我只是使用此代码将图片转换为二进制:

import io
tme = input("Name: ")
with io.open(tme, "rb") as se:
  print(se.read())
  se.close()

现在看起来像这样:

5MEMMMMMMMMMMMMM777777777777777777777777777777777\x95\x95\x95\x95\x95\x95\x95\x95\x95\x95\x95\x95\x95MEEMMMMEEMM\x96\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97

现在,我希望能够准确地解释此二进制代码告诉我的内容...我几乎不知道它,但不足以能够有目的地执行任何操作。我在网上搜索,但没有找到任何可以帮助我解决这一问题的内容。您能告诉我它是如何工作的,或者给我发送链接以供我阅读它的工作方式吗?

2 个答案:

答案 0 :(得分:0)

输出应以十六进制格式打印。位图文件中的第一个字节为'B''M'

您正在尝试以ASCII打印内容。此外,它不显示前几个字节,因为内容已向下滚动。添加print("start\n")以确保您看到输出的开始。

import io
import binascii
tme = 'path.bmp'
print("start") # make sure this line appears in console output
with io.open(tme, "rb") as se:
  content = se.read()

print(binascii.hexlify(content))

现在您应该看到类似的东西

start
b'424d26040100000000003...

42B的十六进制值
4dM的十六进制值...
文件中的前14个字节为BITMAPFILEHEADER
接下来的40个字节是BITMAPINFOHEADER

其后的字节是颜色表(如果有),最后是实际像素。

请参见BITMAPFILEHEADERBITMAPINFOHEADER

答案 1 :(得分:0)

您不能只更改图像中的随机字节。开头有一个标题,其中包括高度和宽度,日期和调色板以及有关每个像素的通道数和位数的信息。然后是经常被填充和/或压缩的图像数据。

因此,您需要一个像PIL / Pillow这样的映像库,并编写如下代码:

from PIL import Image

im = Image.open('image.bmp').convert('RGB')
px = im.load()

# Look at pixel[4,4]
print (px[4,4])

# Make it red
px[4,4] = (255,0,0)

# Save to disk
im.save('result.bmp')

可用的文档和示例here