Wie konvertiert man ein Array von HTML-Farben in ein Bild? [geschlossen]

Ich habe eine Reihe von Farben, zum Beispiel:

    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']]

Ich möchte dies so in ein Bild umwandeln, dass das Pixel der Koordinate (i,j)die Farbe hat A[i][j].

Frage: Wie mache ich das in Gimp (oder direkt in HTML oder irgendetwas Relevanterem)?

Anmerkung: Das reale Array, das ich konvertieren möchte, ist 5000 mal 5000 (dh 25000000 Pixel), also kann ich das nicht von Hand machen und ich brauche eine automatische Prozedur.


Das folgende Bild ist eine Komprimierung des Ergebnisses:

Geben Sie hier die Bildbeschreibung ein

Was das bedeutet, siehe hier .

Was hast du versucht? Was geht daran nicht? Was ist das Endziel? Diese Frage muss spezifischer sein, als sie derzeit meiner Meinung nach ist
@ZachSaucier: siehe letztes Bild hier

Antworten (2)

Es sind ein paar Zeilen in 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")

Eine kurze Erklärung:

  • convertist eine Funktion, die einen HTML-Farbstring (wie '#00ff00') in eine Liste von Farbwerten (zB [0,256,0]) umwandelt.
  • Bist ein Array, in dem jedes Pixel mit konvertiert wird convert.
  • Image.fromarraydient dazu, genau solche Arrays in Bilder umzuwandeln.
Die Python-Sprache ist für meine Verwendung interessant, da ich das Array mit Sage (Modus Cython) berechne. Wissen Sie, wie Sie dieses Bild direkt mit Sage berechnen?
Ich kenne den Cython-Modus von Sage nicht, aber im normalen Sage funktioniert der obige Code, wenn ich Imageaus der ersten Zeile entferne und hinzufüge from PIL import Image.
Das funktioniert, aber das Bild entspricht nicht meinen Erwartungen. Eigentlich will ich so ein Bild hier . Weißt du, wie man das mit Sage macht?
Anscheinend benötigt PIL Numpy-Arrays, um einen bestimmten Datentyp zu haben. Ich habe das jetzt hoffentlich behoben (siehe Bearbeiten).
Ja, das ist genau das. Vielen Dank!

<canvas>Sie können dies einfach mit dem Element und etwas JavaScript tun ... Aist bereits im JS-Format!

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
    }
}

Hinweis : Diese Lösung färbt die Pixel von links nach rechts und dann von oben nach unten, da ich das Format Ihres Arrays so interpretiert habe. Wenn Sie möchten, dass es von oben nach unten und dann von links nach rechts geht, wechseln Sie einfach rowund colin der fillRectZeile wie folgt :

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

Sehen Sie sich hier die Demo an !

Mein 1000x1000-Array ist ziemlich groß für ein "Copy-Paste". Wie kann ich es transportieren?
@SébastienPalcoux Kopieren und Einfügen sollte damit umgehen können ... Aber Sie könnten es in einem Texteditor öffnen, das Format so ändern, dass es mit dem hier übereinstimmt, und dann als .js-Datei speichern (oder .html, wenn Sie es formatieren dieser Weg)
Tatsächlich hätte ich gerne so etwas wie: var A = read(/home/palcoux/array.txt);Kennen Sie den guten Code dafür?
@SébastienPalcoux das tue ich, aber das ist eine andere Frage als die hier gestellte :)