2017-03-16 3 views
1

Le code ci-dessous python/oreiller crée un tableau 150x150 et le remplit avec 255/FF avant de l'enregistrer en tant que bmp. Mais l'image enregistrée n'est pas un fichier bmp blanc comme prévu. Au lieu de cela, il ressemble à une image noire parsemée de blancs. Pourquoi donc?Pourquoi python/pil ne sauvegarde-t-il pas un tableau 2d rempli de FF en tant qu'image bmp complètement blanche?

c = [[(255, 255, 255)]*150 for i in range(150)] 
ci = 0 
cj = 0 
for ci in range(150): 
    for cj in range(150): 
     c[ci][cj] = (255, 255, 255) #Also tried with 0/255 transparency and in hex etc. 
c_array = np.asarray(c) 
im2 = Image.fromarray(c_array, mode="RGB") 
im2.save("test.bmp") 

image créée (points blancs sur fond noir au lieu d'être complètement blanc) -

enter image description here

et sa version hexagonale montre que en quelque sorte pas tous les FFS a fait dans le bmp - enter image description here

Pourquoi ce comportement étrange?

Répondre

0

Étant donné que votre type d'entrée est int, c_array va stocker vos données sous int32 (ou int64, voir numpy default behavior for int).

>>> c = [[(255, 255, 255)]*150 for i in range(150)] 
>>> c_array = np.asarray(c) 
>>> c_array.dtype 
dtype('int32') 


importés en Image.fromarray, c_array est considéré comme un bytestring de int8 depuis que vous avez spécifié mode="RGB"(3x8-bit pixels). Puisque chaque élément est un int32, l'octetstring pour chaque valeur est \xff\x00\x00\x00, créant ainsi l'image que vous voyez.


La correction plus simple serait de préciser le type de tableau numpy:

c_array = np.asarray(c, dtype=np.uint8)