Convirtiendo una cadena binaria en una imagen con PIL

Entonces, lo que estoy tratando de hacer es hacer que PIL cree una imagen basada en una cadena de caracteres binarios. Algunos antecedentes:

from PIL import Image value = "0110100001100101011011000110110001101111" vdiv = [value[i:i+8] for i in range(0, len(value), 8)] 

^ Esto crea una lista de bytes de la cadena binaria. ['01101000', '01100101',.....]

 def diff(inp): if inp == '1': return (0,0,0) if inp == '0': return (255,255,255) else: pass 

^ Esto devuelve una tupla de color para cada bit correspondiente, y si llamo:

 for i in vdiv: for i2 in i: print diff(i2) 

Imprimirá cada tupla de color para cada bit en los bytes enumerados. (0,0,0) (0,0,0) (255,255,255)...

Lo que quiero saber es: ¿Cómo puedo obtener PIL para crear una imagen donde los píxeles coincidan con la cadena binaria?

Esto es lo que debería ser. : captura de pantalla

Lo que tengo hasta ahora para PIL:

 img = Image.new( 'RGB', (8,len(vdiv)), "white") pixels = img.load() ## for x in range(img.size[0]): for y in range(img.size[1]): for i in vdiv: for i2 in i: pixels[x,y] = diff(i2) #Creates a black image. What do? ## img.show() 

Es el bit de for x in range que me atrapa. Estoy perdido.

Podrías usar img.putdata :

 import Image value = "0110100001100101011011000110110001101111" cmap = {'0': (255,255,255), '1': (0,0,0)} data = [cmap[letter] for letter in value] img = Image.new('RGB', (8, len(value)//8), "white") img.putdata(data) img.show() 

introduzca la descripción de la imagen aquí


Si tiene NumPy, podría usar Image.fromarray en su lugar:

 import Image import numpy as np value = "0110100001100101011011000110110001101111" carr = np.array([(255,255,255), (0,0,0)], dtype='uint8') data = carr[np.array(map(int, list(value)))].reshape(-1, 8, 3) img = Image.fromarray(data, 'RGB') img.save('/tmp/out.png', 'PNG') 

pero esta prueba de tiempo sugiere que usar putdata es más rápido:

 value = "0110100001100101011011000110110001101111"*10**5 def using_fromarray(): carr = np.array([(255,255,255), (0,0,0)], dtype='uint8') data = carr[np.array(map(int, list(value)))].reshape(-1, 8, 3) img = Image.fromarray(data, 'RGB') return img def using_putdata(): cmap = {'0': (255,255,255), '1': (0,0,0)} data = [cmap[letter] for letter in value] img = Image.new('RGB', (8, len(value)//8), "white") img.putdata(data) return img 

 In [79]: %timeit using_fromarray() 1 loops, best of 3: 1.67 s per loop In [80]: %timeit using_putdata() 1 loops, best of 3: 632 ms per loop