Comment lire une image raw à l'aide de PIL?
J'ai un raw image où chaque pixel correspond à un 16 bits entier non signé. Je suis en train de lire à l'aide de l'Image de PIL.fromstring() comme dans le code suivant:
if __name__ == "__main__":
if (len(sys.argv) != 4):
print 'Error: missing input argument'
sys.exit()
file = open(sys.argv[1], 'rb')
rawData = file.read()
file.close()
imgSize = (int(sys.argv[2]), int(sys.argv[3]))
# Use the PIL raw decoder to read the data.
# - the 'F;16' informs the raw decoder that we are reading a little endian, unsigned integer 16 bit data.
img = Image.fromstring('L', imgSize, rawData, 'raw', 'F;16')
im.save('out.png')
Le PIL documentation informe que le premier argument de la fromstring() la fonction est "mode". Cependant, en regardant la documentation et de recherches sur google je n'étais pas capable de trouver des détails sur ce que cet argument signifie vraiment (je crois que c'est lié à l'espace de couleur ou quelque chose comme ça). Est-ce quelqu'un sait où je peux trouver plus détaillée de référence sur la fromstring() et la fonction de ce que l'argument mode de moyens?
Vous devez vous connecter pour publier un commentaire.
La documentation spécifique est à http://effbot.org/imagingbook/concepts.htm:
Je ne suis pas sûr de ce que "L" représente, mais "RGBA" signifie Rouge-Vert-Bleu-Alpha, donc je présume RGBX est équivalent à RGB (edit: après essai, ce n'est pas le cas)? CMJN Cyan-Magenta-Jaune-Kelvin, qui est un autre type de palette. Bien sûr, je suppose que si vous savez à propos de PIL, vous savez aussi sur les espaces de couleurs. Si non, Wikipédia a un excellent article.
Que pour ce qu'il signifie vraiment (si ce n'est pas assez): les valeurs des pixels seront encodés différemment pour chaque couleur. Régulièrement RVB vous avez 3 octets par pixel - 0û254, 0û254, 0û254. Pour l'Alpha, vous ajoutez un autre octet pour chaque pixel. Si vous décoder une image RVB comme RGBA, vous aurez la fin de la lecture de la R pixel vers la droite de la première pixel comme votre alpha, ce qui signifie que vous aurez les G pixel comme votre R valeur. Ce sera agrandie selon la taille de votre image, mais il va vraiment faire de votre couleurs vont bancale. De même, en essayant de lire un CMJN codé de l'image RVB (ou RGB) feront de votre image de beaucoup, non pas comme il est censé le faire. Par exemple, essayez avec une image:
Et vous allez voir ce que les différents modes de faire - essayer avec une variété d'images: png avec alpha, png sans alpha, bmp, gif et jpeg. C'est un peu une expérience amusante, en fait.
Si tout le reste échoue, vous pouvez toujours lire le code source. Pour la LIP, les téléchargements sont ici.
Vous n'avez jamais dit exactement ce que le format des données de pixels en 16 bits entiers non signés était en cours, mais je suppose que c'est quelque chose comme RRRRRGGGGGGBBBBBB, (5 bits de Rouge, de 6 bits Vert, 5-bits Bleu), ou RRRRRGGGGGBBBBBA (5 bits de Rouge, de 5-bits Vert, 5-bits Bleu, 1 bit d'Alpha ou de Transparence). Je n'ai pas vu de support pour ces formats, après un très rapide coup d'oeil à quelques-uns des sources moi-même, mais ne peut pas le dire d'une façon ou de l'autre pour vous.
Sur la même page web où le PIL téléchargements sont, ils mentionnent que l'on peut envoyer des questions à l'Python Image SIG liste de diffusion et de fournir un lien pour cela. Que pourrait être une meilleure source que de demander ici.
Espère que cette aide.
C'est une vieille question, mais cela peut aider quelqu'un dans le futur. L'un des problèmes avec l'original de l'extrait de code, c'est que dans
Image.fromstring('L', imgSize, rawData, 'raw', 'F;16')
, leF;16
partie des œuvres pour'F'
mode.Cela fonctionne pour moi: