从图像读取十六进制数据的问题 - python自动转换为字符串

时间:2010-11-22 22:11:31

标签: python string image hex

我正在使用read(1)一次读取一个字节的图像,并将其附加到列表中。图像数据都是十六进制数据。当我使用print函数打印出列表时,其格式为'\xd7'

['\xd7', '\xd7', '\xd7', '\xd7', '\xd7', '\xd7', '\xd7',...]

问题是现在我需要对这个十六进制数据执行一些计算,但是,它是字符串格式,并且python中的任何int或hex转换函数都不支持这个'\ xd'字符串格式。它们需要'0xd7''d7'

感谢您的帮助

5 个答案:

答案 0 :(得分:4)

它将它们解释为字符,因此请使用ord将它们转换为数字。即ord('\xd7')给出了215。

此外,如果您使用Windows,或者程序可能必须在Windows上运行,请确保您以二进制模式打开文件:open("imagefile.png","rb")。在其他操作系统上没有任何区别。

答案 1 :(得分:2)

你可以做这样的事情来把它们变成数字数组:

import array

data = array.array('B') # array of unsigned bytes

with open("test.dat", 'rb') as input:
    data = input.read(100)
    data.fromstring(data)

print data
# array('B', [215, 215, 215, 215, 215, 215, 215])

答案 2 :(得分:1)

read()可以采用大于1的大小值:read(1024)将从流中读取1K的字节值。这比一次读取一个字节并将其附加到前一个字节要快得多。

打印数据时您打算做什么?查看字节值,还是显示图像?

数据不是“字符串格式”,只是字节,但是当你打印它们时,打印例程会将非打印值转换为对人眼和大脑更有意义的东西。如果你想在没有转义的情况下看到这些值,你可以遍历字节并将它们转换为十六进制值,十进制或二进制 - 这些都适用于您和您的应用程序。 string formatting mini-language将是一个很好的起点。

答案 3 :(得分:1)

如果您需要'd7''0xd7',而不仅仅是0xd7(即215),hex()'%x'是您的朋友。

>>> ord('\xd7')
215
>>> ord('\xd7') == 215 == 0xd7
True
>>> hex(ord('\xd7'))
'0xd7'
>>> '%x' % ord('\xd7')
'd7'

同样如在其他答案中所观察到的那样,请确保在模式中使用'b'打开,否则它会在某些字节序列上被弄乱,认为它是UTF-8或类似的东西。

答案 4 :(得分:0)

如果你正在进行图像处理,那么你可能想看看numpy。

有一些软件包可以帮助您将图像读入内存(上面提到了PIL,另一个是我自己的mahotasscikits.image)。

如果数据作为原始数据存在于文件中,您知道尺寸,则可以执行以下操作

import numpy as np
img = np.empty( (n_rows, n_cols), dtype=np.uint8) # create an empty image
img.data[:] = input_file.read()

将您的数据导入img

python中图像处理的介绍性网站是http://pythonvision.org