在不使用库的情况下在python中编写图像

时间:2018-05-17 06:48:12

标签: python image-processing

我试图在不使用python图像处理库的情况下读取bmp图像,并将图像数据写入文件。

这是我的代码:

f = open('test7.bmp', 'rb')
data = f.read()
f.close()

f = open('Image_details.txt', 'wb')
f.write(data)
f.close()

但是我得到的图像数据是这样的:

BMÞ6(¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

你能帮助我以任何其他格式(十六进制/二进制/十进制)获取图像数据吗?

提前感谢。

1 个答案:

答案 0 :(得分:2)

如果您只想“复制”图像,那么您唯一错误的做法是将文件保存为.txt扩展名 - 您的系统可能会尝试将其作为文本文件打开,因此您'文本编辑器正在显示这样的二进制数据。如果您将扩展名更改为.bmp,则会像普通图片一样打开。

但是,如果您想要将图像的文本十六进制表示转储到文本文件中,则可以使用binascii模块(标准库的一部分):

import binascii

with open('img.bmp', 'rb') as fd:
    data = fd.read()

with open('img_data.txt', 'w') as fd:
    fd.write(binascii.hexlify(data))

这将为您提供单行文本文件,其中包含十六进制表示,例如:

424d7ab80b0000000000...

如果你想要一个整齐格式的十六进制表示(例如,每2个字符为空格,每10对换行一次),你可以这样做:

import binascii

with open('img.bmp', 'rb') as fd:
    data = fd.read()

with open('img_data.txt', 'w') as fd:
    hex_str = binascii.hexlify(data)
    chunk_size = 10
    hex_list = [hex_str[i:i+2] for i in range(0, len(hex_str), 2)]
    hex_chunks = [hex_list[i:i + chunk_size] for i in range(0, len(hex_list), chunk_size)]
    data = '\n'.join([' '.join(chunk) for chunk in hex_chunks])
    fd.write(data)

这将使您获得格式良好(更易于阅读但尺寸更大)的文本表示:

42 4d 7a b8 0b 00 00 00 00 00
7a 00 00 00 6c 00 00 00 80 02
00 00 90 01 00 00 01 00 18...