2010-01-21 25 views
8

Estoy leyendo datos binarios de un archivo que especifica valores de intensidad entre coordenadas xey (no un formato de imagen de fuente abierta) y desea convertirlo en una imagen PNG (u otro formato ampliamente compatible). Tengo los datos cargados en una matriz (usando el módulo de matriz) donde cada elemento es un número entero de 0 a 255. Para guardar esto en un PNG puedo crear una tupla de 3 elementos de cada elemento (x) como sigue:crear una imagen en escala de grises

t = (x, x, x) 

agréguela a través de la matriz usando el mapa(), luego guarde la imagen usando putdata(). Sin embargo, la conversión a la matriz de tuplas lleva mucho tiempo (algunos minutos). ¿Hay alguna manera de especificar el valor de rgb utilizando solo un número entero (no una tupla)? Supongo que una alternativa sería usar NumPy, pero no sé por dónde empezar, por lo que cualquier ayuda en este sentido también sería apreciada.

Gracias de antemano por la ayuda.

Respuesta

11

Al crear la nueva imagen, darle el modo L:

im = Image.new('L', size) 
im.putdata([x1, x2, x3, ...]) 

Cuando los datos es una lista de valores no tuplas.

+0

Exactamente lo que estaba buscando. ¡Gracias! – Vince

3

Hay varias maneras de hacer esto, pero si ya tiene los datos de la memoria, mirar en el uso Image.frombufferImage.fromstring o usando el modo 'L' (para datos en escala de grises de 8 bits).

0

¿Sería im.putpixel (xy, color) lo que estás buscando?

+0

putpixel es significativamente más lento que putdata –

+0

Estoy de acuerdo. Estaba usando putpixel() en una versión anterior. Funcionó, pero es ~ 10 veces más lento. (1m30s vs 0m15s para putdata()) – Vince

Cuestiones relacionadas