2012-11-06 17 views
5

Esiste un modo efficace per ottenere un elenco di colori di ciò che viene attualmente disegnato in una tela HTML?Elenca colori univoci in una tela HTML

Credo che il termine corretto sarebbe una tavolozza di colori del composito corrente

+1

definire "colori univoci" -> codici colore RGB/HEX = tutti i colori possibili. –

+0

ha modificato la domanda come avrebbe potuto essere fuorviante – lostsource

+0

Potresti entrare in ulteriori dettagli sul tuo approccio? Stai provando a scattare un'istantanea della tua tela e poi analizza ogni pixel per determinare l'RGB/HEX? –

risposta

4

Si supponga di avere un documento HTML simile al seguente:

<canvas id="example" width="500" height="300"></canvas> 
<ul id="list"> 
    <h3>Click the canvas to extract colors</h3> 
</ul> 

ho creato un violino in cui si dispone di un tela pronta con alcune forme e colori che elaboreremo quando clicchiamo su di essa. Non sto creando un raccoglitore di colori per te, solo elencando quella era la risposta originale e dovrei servire come mezzo per raggiungere la seconda parte di esso.

Here's the fiddle

La funzione che estrae i colori una lista di loro è la seguente, Sto evitando la copia di tutto il materiale di disegno di tela in quanto serve solo come esempio e non è sufficientemente generico.

var colorList = []; //This will hold all our colors 
function getColors(){ 
     var canvas  = document.getElementById('example'); 
     var context  = canvas.getContext('2d'); 
     var imageWidth = canvas.width; 
     var imageHeight = canvas.height; 
     var imageData = context.getImageData(0, 0, imageWidth, imageHeight); 
     var data  = imageData.data; 

     // quickly iterate over all pixels 
     for(var i = 0, n = data.length; i < n; i += 4) { 
      var r = data[i]; 
      var g = data[i + 1]; 
      var b = data[i + 2]; 
      //If you need the alpha value it's data[i + 3] 
      var hex = rgb2hex("rgb("+r+","+g+","+b+")"); 
      if ($.inArray(hex, colorList) == -1){ 
       $('#list').append("<li>"+hex+"</li>"); 
       colorList.push(hex); 
      } 
     }  
} 

Questo produrrà un risultato contenente un elenco apparentemente non ordinata di valori esadecimali che rappresentano l'ordine in cui appaiono nell'immagine (da qui il 'apparentemente'), se si desidera un selettore di colori tuttavia si consiglia di considerare l'uso di colorList.sort(); che ordinerà la matrice in modo nero-bianco.

Nota che sto usando la funzione rgb2hex per convertire i valori restituiti al formato esadecimale sto assumendo la vostra voglia, se sei ok con rgb si sentono liberi di non utilizzare, la funzione è la seguente:

function rgb2hex(rgb) { 
    rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); 
    function hex(x) { 
     return ("0" + parseInt(x).toString(16)).slice(-2); 
    } 
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); 
} 

e la fonte è this, come ho detto come commento nel codice, si potrebbe facilmente estrarre il canale alfa anche se è necessario, ma sono andato per lo scenario più generico (e più semplice), che mi veniva in mente di.

+0

questo è un buon post. +1 –

+0

Grazie @DanKanze –

+2

Probabilmente sarà un po 'lento usare un array quando la tela ha disegnato un bazillion di colori (Ok, probabilmente non ci saranno più di qualche centinaio di migliaia di pixel sulla tua tela, e non ci sono che 16 milioni di colori, ma sto divagando). Con alcune piccole modifiche, non solo è possibile trovare i colori distinti, ma è possibile calcolare un istogramma e accelerare l'accesso (per un numero elevato di colori comunque) utilizzando un oggetto come dizionario: http://jsfiddle.net/pcZCP/2 / – JayC