Проблема чтения шестнадцатеричных данных из изображения - python автоматически конвертируется в строку - PullRequest
1 голос
/ 23 ноября 2010

Я читаю в изображении по одному байту за один раз с помощью read (1) и добавляю его в список. Данные изображения - это все шестнадцатеричные данные. Когда я распечатываю список с помощью функции print, он отображается в формате '\xd7'

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

Проблема в том, что теперь мне нужно выполнить некоторые вычисления для этих шестнадцатеричных данных, однако, они в строковом формате, и этот строковый формат '\ xd' не поддерживается ни одной из функций преобразования int или hex в python , Они требуют '0xd7' или просто 'd7'.

Спасибо за помощь

Ответы [ 5 ]

4 голосов
/ 23 ноября 2010

Он интерпретирует их как символы, поэтому используйте ord, чтобы превратить их в числа.Т.е. ord('\xd7') дает 215.

Также, если вы используете Windows или, возможно, программа должна работать в Windows, убедитесь, что файл открыт в двоичном режиме: open("imagefile.png","rb").Не имеет значения в других операционных системах.

2 голосов
/ 23 ноября 2010

Вы можете сделать что-то вроде этого, чтобы поместить их в числовой массив:

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])
1 голос
/ 23 ноября 2010

Если вам требуется '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 или что-то в этом роде, на определенных последовательностях байтов.

1 голос
/ 23 ноября 2010

read() может принимать значение размера больше 1: read(1024) будет считывать байты объемом 1 КБ из потока. Это будет намного быстрее, чем чтение байта за раз и добавление его к предыдущим байтам.

Что вы пытаетесь сделать при печати данных? Видите значения байтов или отображаете изображение?

Данные не в «строковом формате», это просто байты, но когда вы печатаете их, подпрограмма печати скрывает непечатные значения во что-то, что будет значить больше для человеческого глаза и мозга. Если вы хотите видеть значения без экранирования, вы можете перебирать байты и преобразовывать их в шестнадцатеричные, десятичные или двоичные значения - все, что работает для вас и вашего приложения. мини-язык для форматирования строк будет хорошей отправной точкой.

0 голосов
/ 23 ноября 2010

Если вы занимаетесь обработкой изображений, вы, вероятно, захотите взглянуть на 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...