Tengo una variedad de colores, por ejemplo:
A=[['#ff00ff', '#00ff00', '#ffff00', '#00ff00', '#0000ff', '#00ffff', '#00ffff'],
['#0000ff', '#0000ff', '#00ffff', '#00ff00', '#ffff00', '#00ff00', '#00ff00'],
['#ffff00', '#0000ff', '#0000ff', '#ffff00', '#ffff00', '#ffff00', '#ffff00'],
['#ffff00', '#ffff00', '#ffff00', '#ffff00', '#00ff00', '#00ff00', '#00ff00'],
['#00ff00', '#ffff00', '#ffff00', '#00ff00', '#00ff00', '#00ff00', '#00ff00'],
['#00ff00', '#00ff00', '#00ff00', '#00ff00', '#00ff00', '#0000ff', '#0000ff'],
['#0000ff', '#00ff00', '#00ff00', '#00ff00', '#0000ff', '#0000ff', '#0000ff']]
Quiero convertir esto en una imagen tal que el píxel de coordenadas (i,j)
tenga el color A[i][j]
.
Pregunta: ¿Cómo hago eso en Gimp (o directamente en HTML, o algo más relevante)?
Observación: la matriz real que quiero convertir es de 5000 por 5000 (es decir, 25000000 píxeles), por lo que no puedo hacerlo a mano y necesito un procedimiento automático.
La siguiente imagen es una compresión del resultado:
Acerca de lo que esto significa, ver aquí .
Son unas pocas líneas en Python:
from PIL import Image
import numpy
A = […]
convert = lambda string: [int(string[i:i+2],base=16) for i in (1,3,5)]
B = numpy.array([map(convert,line) for line in A], dtype=numpy.uint8)
image = Image.fromarray(B, mode="RGB")
image.save("image.png")
Una breve explicación:
convert
es una función que convierte una cadena de color HTML (como '#00ff00'
) en una lista de valores de color (p. ej., [0,256,0]
).B
es una matriz donde cada píxel se convierte con convert
.Image.fromarray
es para convertir precisamente tales matrices en imágenes.Image
de la primera línea y agrego from PIL import Image
.Puedes hacer esto fácilmente usando el <canvas>
elemento y algo de JavaScript... ¡ A
ya está en formato JS!
var canvas = document.querySelector("canvas"), // Select our canvas element
ctx = canvas.getContext("2d"), // Save the context we're going to use
width = A[0].length, // Get the width of the array
height = A.length, // Get the height of the array
scale = 10; // Scales the whole image by this amount, set to 1 for default size
// Make sure the canvas is no larger than the size we need
canvas.width = width * scale;
canvas.height = height * scale;
// Loop through each color and draw that section
for(var row = 0; row < height; row++) {
for(var col = 0; col < width; col++) { // Since there are nested arrays we need two for loops
ctx.fillStyle = A[row][col]; // Set the color to the one specified
ctx.fillRect(col * scale, row * scale, scale, scale); // Actually draw the rectangle
}
}
Nota : esta solución colorea los píxeles de izquierda a derecha y luego de arriba a abajo porque así es como interpreté el formato de su matriz. Si necesita que vaya de arriba a abajo y luego de izquierda a derecha, simplemente cambie row
y col
en la fillRect
línea de esta manera :
ctx.fillRect(col * scale, row * scale, scale, scale);
¡ Mira la demostración aquí !
var A = read(/home/palcoux/array.txt);
Conoces el buen código para eso?
Zach Saucier
sebastien palcoux