¿Cómo convertir una matriz de colores HTML en una imagen? [cerrado]

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:

ingrese la descripción de la imagen aquí

Acerca de lo que esto significa, ver aquí .

¿Qué has probado? ¿Qué no funciona al respecto? ¿Cuál es el objetivo final? Esta pregunta debe ser más específica de lo que es actualmente en mi opinión.
@ZachSaucier: mira la última foto aquí

Respuestas (2)

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:

  • convertes una función que convierte una cadena de color HTML (como '#00ff00') en una lista de valores de color (p. ej., [0,256,0]).
  • Bes una matriz donde cada píxel se convierte con convert.
  • Image.fromarrayes para convertir precisamente tales matrices en imágenes.
El lenguaje Python es interesante para mi uso, porque calculo la matriz con Sage (modo Cython). ¿Sabes cómo calcular esta imagen directamente con Sage?
No sé sobre el modo Cython de Sage, pero en Sage normal, el código anterior funciona, si elimino Imagede la primera línea y agrego from PIL import Image.
Esto funciona, pero la imagen no es lo que esperaba. De hecho quiero una imagen así aquí . ¿Sabes cómo hacer eso con Sage?
Aparentemente, PIL necesita que las matrices Numpy sean de un tipo de datos específico. Espero haberlo arreglado ahora (ver edición).
Sí, esto es exactamente eso. ¡Muchas gracias!

Puedes hacer esto fácilmente usando el <canvas>elemento y algo de JavaScript... ¡ Aya 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 rowy colen la fillRectlínea de esta manera :

ctx.fillRect(col * scale, row * scale, scale, scale);

¡ Mira la demostración aquí !

Mi matriz de 1000x1000 es bastante grande para un "copiar y pegar". ¿Cómo puedo transportarlo?
@SébastienPalcoux Copiar y pegar debería poder manejarlo ... Pero puede abrirlo en un editor de texto, cambiar el formato para que coincida con el que tengo aquí, luego Guardar como un archivo .js (o .html si lo formatea de esa manera)
De hecho, me gustaría algo como: ¿ var A = read(/home/palcoux/array.txt);Conoces el buen código para eso?
@SébastienPalcoux Sí, pero esa es una pregunta diferente a la que se hace aquí :)