我只是使用此代码将图片转换为二进制:
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
现在,我希望能够准确地解释此二进制代码告诉我的内容...我几乎不知道它,但不足以能够有目的地执行任何操作。我在网上搜索,但没有找到任何可以帮助我解决这一问题的内容。您能告诉我它是如何工作的,或者给我发送链接以供我阅读它的工作方式吗?
答案 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...
42
是B
的十六进制值
4d
是M
的十六进制值...
文件中的前14个字节为BITMAPFILEHEADER
接下来的40个字节是BITMAPINFOHEADER
其后的字节是颜色表(如果有),最后是实际像素。
答案 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。