我正在使用read(1)一次读取一个字节的图像,并将其附加到列表中。图像数据都是十六进制数据。当我使用print
函数打印出列表时,其格式为'\xd7'
['\xd7', '\xd7', '\xd7', '\xd7', '\xd7', '\xd7', '\xd7',...]
问题是现在我需要对这个十六进制数据执行一些计算,但是,它是字符串格式,并且python中的任何int或hex转换函数都不支持这个'\ xd'字符串格式。它们需要'0xd7'
或'd7'
。
感谢您的帮助
答案 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,另一个是我自己的mahotas或scikits.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。