2010-11-22 13 views
1

Je lis dans une image un octet à la fois avec with read (1), et je l'ajoute à une liste. Les données d'image sont toutes des données hexadécimales. Lorsque j'imprime la liste avec la fonction print il est dans le format '\xd7'Problème lors de la lecture des données hexadécimales de l'image - python se convertit automatiquement en une chaîne

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

Le problème est que maintenant je dois effectuer des calculs sur ces données hexagonaux, cependant, il est sous forme de chaîne, et ce ' Le format de chaîne \ xd 'n'est pris en charge par aucune des fonctions de conversion int ou hexadécimal dans python. Ils nécessitent un '0xd7' ou juste un 'd7'.

Merci pour l'aide

+2

Je ne sais pas ce que vous essayez de faire, mais connaissez-vous la bibliothèque d'imagerie Python? Cela peut être plus facile que de manipuler vous-même des données d'image. http://www.pythonware.com/products/pil/ –

Répondre

1

Si vous avez besoin 'd7' ou '0xd7', plutôt que de simplement 0xd7 (à savoir, 215), ou hex()'%x' sont vos amis.

>>> ord('\xd7') 
215 
>>> ord('\xd7') == 215 == 0xd7 
True 
>>> hex(ord('\xd7')) 
'0xd7' 
>>> '%x' % ord('\xd7') 
'd7' 

également observée dans d'autres réponses, ne faites que vous ouvrez avec le « b » en mode, sinon il peut se foiré, pensant qu'il est UTF-8 ou quelque chose comme ça, sur certaines séquences d'octets .

4

Il est de les interpréter comme des caractères, afin d'utiliser ord pour les transformer en chiffres. C'est à dire. ord('\xd7') donne 215.

De même si vous utilisez Windows ou si le programme doit être exécuté sous Windows, assurez-vous que le fichier est ouvert en mode binaire: open("imagefile.png","rb"). Ne fait aucune différence sur les autres systèmes d'exploitation.

+1

'b' s'applique sur Windows, mais pas sur Linux ou Mac. –

+2

Merci, je ne le savais pas. Tout de même, c'est une bonne pratique d'écrire du code qui fonctionnera de la même manière n'importe où. –

+0

(J'ai mis à jour la réponse) –

1

read() peut prendre une valeur de taille supérieure à 1: read(1024) lira 1K valeur d'octets du flux. Ce sera beaucoup plus rapide que de lire un octet à la fois et de l'ajouter aux octets précédents.

Qu'essayez-vous de faire lorsque vous imprimez les données? Voir les valeurs d'octets ou afficher l'image? Les données ne sont pas en "format de chaîne", elles ne sont que des octets, mais lorsque vous les imprimez, la routine d'impression échappe aux valeurs non imprimables et devient plus importante pour les yeux et les cerveaux humains. Si vous voulez voir les valeurs sans l'échappement, vous pouvez parcourir les octets et les convertir en leurs valeurs hexadécimales, décimales ou binaires - tout ce qui fonctionne pour vous et votre application. Le string formatting mini-language sera un bon point de départ.

2

Vous pourriez faire quelque chose comme ça pour les amener dans un tableau numérique:

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

Bien que pour Python 2.6+ l'utilisation d'un 'array' pour les données d'octets est compliquée - il suffit d'utiliser un bytearray:' b = bytearray (input.read (100)) ', rien à importer et vous pouvez utiliser l'index simple sans' ord' . (Aussi préférable d'éviter de cacher le type construit dans 'bytes'). –

+0

@Scott Griffiths: J'ai d'abord écrit ceci en utilisant 'bytearray', mais j'ai remarqué qu'ils s'impriment comme des chaînes - et j'ai décidé que les" complications "en valaient la peine, plus le module' array' existe depuis longtemps, donc ça va Travailler avec beaucoup plus des anciennes versions de Python [encore] là-bas. – martineau

0

Si vous faites le traitement d'image, alors vous voudrez probablement regarder numpy.

Il y a quelques paquets qui vous aideront à lire votre image dans la mémoire aussi (PIL est mentionné ci-dessus, un autre est le mien mahotas ou scikits.image).

Si les données sont dans un fichier en tant que données brutes une que vous connaissez les dimensions, vous pouvez effectuer les opérations suivantes

import numpy as np 
img = np.empty((n_rows, n_cols), dtype=np.uint8) # create an empty image 
img.data[:] = input_file.read() 

pour obtenir vos données dans img.

Un site Web d'introduction pour le traitement d'image en python est http://pythonvision.org.