【问题标题】:Image to Hexidecimal Data Conversion in PythonPython中的图像到十六进制数据转换
【发布时间】:2019-04-13 04:45:39
【问题描述】:

我正在尝试使用 Python 将黑白图像的每个像素转换为十六进制并将其存储在“.txt”文件中。我必须在我的应用程序中使用 C,以便更容易从文本文件中读取,然后在 C 代码中进行整个转换。我已经从网上调整了一些示例代码,但我对 Python 的使用仍然不是很熟练。

当我运行我的 python 脚本时,它只产生两个十六进制值而不是八个。起初我以为这是来自黑白图像,但 RGB 图像应该包含黑色的 0x000000 和白色的 0xFFFFFF

Python 脚本

from binascii import hexlify
import re

hexValNew = ''
placeHolder ='0'

file = open('Frame2.txt', 'w') #Create txt file for data

with open('Frame2.png', 'rb') as f:
    binVal = f.read(1)
    while len(binVal) != 0:
        hexVal = hex(ord(binVal))
        hexValNew = hexVal[2:4] #Remove "0x" from hex() process
        hexValString = str(hexValNew)

        if len(hexValString) == 1:
            hexValString = placeHolder + hexValString
        print hexVal

        #print(hexValString) #Test Line
        file.write(hexValString) #Write adjusted hex value to txt file
        binVal = f.read(1)

file.close() #Close txt file

./a.out 部分

ff 00 62 26 e0 c4 a2 d7 c2 90 00 00 49 45 4e 44 ae 42 60 82

据我了解,该值应返回八位数字,而不仅仅是两位。

【问题讨论】:

  • 你按字节读取,一个字节的十六进制值有一位或两位。
  • 例如,如果我采用 a.out 的第一部分,那么像素的实际值将是:0xff0062?但这仍然没有意义,图像是灰度的,所以应该有三个重复值,如 0x4b4b4b 否则它不会遵循灰度正确?
  • PNG 格式被压缩。要检索原始数据,您可以使用 Pillow 之类的库。

标签: python python-3.x image image-processing hex


【解决方案1】:

我建议您根本不要编写任何 Python,而只需在终端中使用 ImageMagick 将任何 PNG、JPEG 或其他格式文件转换为 NetPBM 格式,请参阅Wikipedia description. p>

特别注意以 P2(ASCII)或 P5(二进制)格式开头的 PGM 格式。使用 C 阅读非常简单。因此,在终端使用中将 PNG 图像转换为 PGM P2 (ASCII) 格式:

magick input.png -depth 8 -colorspace gray -compress none result.pgm

并使用任何文本编辑器查看您的文件。

要将 JPEG 文件转换为 PGM P5(二进制)格式,请使用:

magick input.jpg -depth 8 -colorspace gray result.pgm

【讨论】:

    【解决方案2】:

    在 Unix 上的 ImageMagick 中,您可以执行以下操作:

    convert rose.png:[5x5] txt: | tail -n +2 | sed 's/[ ][ ]*/ /g' | awk '{print $1,$3}'
    0,0: #414042
    1,0: #634040
    2,0: #B53D30
    3,0: #A54845
    4,0: #998886
    0,1: #6A6674
    1,1: #C0494A
    2,1: #E4312B
    3,1: #DB403F
    4,1: #98936E
    0,2: #77796F
    1,2: #CA948B
    2,2: #A94D43
    3,2: #603D31
    4,2: #405937
    


    格式为列,行:十六进制。

    如果需要,您可以将其重定向到文件。我不是 Windows 用户。但可能有 Unix 命令的 Windows 等价物。如果没有,那么您可以解析 txt: 的输出。见https://imagemagick.org/Usage/files/#txt

    【讨论】:

    • 这个 ImageMagick 工具非常有用!谢谢!
    【解决方案3】:

    您不能打开 PNG 并将数据视为原始图像数据。例如,PNG 的前 8 个字节称为 PNG 签名,每个 PNG 的签名始终相同。

    您应该使用诸如PillowOpenCV 之类的库来打开图像,获取图像数据,并将其以原始格式写入文件。制作原始文件比制作十六进制字符串文件更容易,因为您必须在 C 程序中再次解析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-23
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 2018-12-24
      • 2016-02-15
      相关资源
      最近更新 更多