【问题标题】:Problem reading hex data from image - python automatically converts to a string从图像读取十六进制数据时出现问题 - python 自动转换为字符串
【发布时间】:2010-11-22 22:11:31
【问题描述】:

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

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

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

感谢您的帮助

【问题讨论】:

  • 我不知道你想做什么,但你知道 Python 图像库吗?这可能比自己操作图像数据更容易。 pythonware.com/products/pil

标签: python string image hex


【解决方案1】:

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

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

【讨论】:

  • b 适用于 Windows,但不适用于 Linux 或 Mac。
  • 谢谢,我不知道。尽管如此,编写在任何地方都能正常工作的代码是一个好习惯。
  • @Greg: b 在 *x 框上不是必需的。但是,您应该始终使用b,以便您的代码是可移植的,并且任何阅读您的代码的人的意图都很明确。
【解决方案2】:

如果您需要'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 或类似的东西,在某些字节序列上。

【讨论】:

    【解决方案3】:

    您可以执行以下操作将它们放入数字数组中:

    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])
    

    【讨论】:

    • 虽然对于 Python 2.6+ 使用 array 字节数据过于复杂 - 只需使用字节数组:b = bytearray(input.read(100)),无需导入任何内容,您可以在没有 ord 的情况下使用普通索引。 (也最好避免隐藏内置的bytes 类型)。
    • @Scott Griffiths:我最初是使用bytearray 编写的,但注意到它们打印起来像字符串——并认为“复杂性”是值得的,加上array 模块已经存在了一段时间很长很长的时间,所以这将适用于更多旧版本的 Python [仍然]。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      如果你在做图像处理,那么你可能想看看 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

      【讨论】:

        猜你喜欢
        • 2015-01-15
        • 2017-04-25
        • 2023-03-04
        • 2012-09-17
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多