Преобразование данных в шестнадцатеричные данные в Python - PullRequest
0 голосов
/ 13 апреля 2019

Используя Python, я пытаюсь преобразовать каждый пиксель черно-белого изображения в шестнадцатеричный формат и сохранить его в файле «.txt». Я должен использовать C для своего приложения, чтобы его было легче прочитать из текстового файла, а затем выполнить все преобразования в C-коде. Я настроил пример кода из сети, но я все еще не очень опытен в использовании Python.

Когда я запускаю свой скрипт на python, он выдает только два шестнадцатеричных значения вместо восьми. Сначала я подумал, что это изображение ч / б, но RGB-изображение должно содержать 0x000000 для черного и 0xFFFFFF для белого.

Python Script

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

Ф.Ф. 00 62 26 e0 c4 a2 d7 c2 90 00 00 49 45 4e 44 ае 42 60 82

Насколько я понимаю, значение должно иметь восемь возвращаемых цифр, а не только две.

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Я бы посоветовал вам вообще не писать Python, а вместо этого просто использовать ImageMagick в терминале для преобразования любого PNG, JPEG или другого файла формата в формат NetPBM, см. Википедия.

Обратите особое внимание на формат PGM, начиная с формата P2 (ASCII) или P5 (двоичный). Это очень просто читать с помощью 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
0 голосов
/ 17 апреля 2019

В ImageMagick в Unix вы можете сделать следующее:

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.Но есть вероятные эквиваленты Windows команд Unix.Если нет, то вы можете проанализировать вывод из txt :.Смотри https://imagemagick.org/Usage/files/#txt

0 голосов
/ 15 апреля 2019

Вы не можете открыть PNG и обрабатывать данные как необработанные данные изображения. Например, первые 8 байтов PNG известны как подпись PNG, которые всегда одинаковы для каждого PNG.

Вы должны использовать библиотеку, такую ​​как Подушка или OpenCV , чтобы открыть изображение, получить данные изображения и записать его в формате raw в файл. Было бы проще создать необработанный файл, а не файл с шестнадцатеричными строками, который вам придется снова анализировать в вашей программе на Си.

...