Utilizzando il tag canvas
, è possibile determinare il valore del colore di un pixel in un determinato punto. È possibile utilizzare i dati dell'evento per determinare le coordinate, quindi verificare la trasparenza. Tutto ciò che rimane è caricare l'immagine in una tela.
In primo luogo, ci prenderemo cura di che:
var ctx = document.getElementById('canvas').getContext('2d');
var img = new Image();
img.onload = function(){
ctx.drawImage(img,0,0);
};
img.src = [YOUR_URL_HERE];
Questo primo bit afferra l'elemento canvas, quindi crea un oggetto Image
. Quando l'immagine viene caricata, viene disegnata sulla tela. Abbastanza diretto! Tranne che ... se l'immagine non si trova nello stesso dominio del codice, sei contro la sicurezza dei criteri dello stesso dominio. Per ottenere i dati della nostra immagine, avremo bisogno che l'immagine sia ospitata localmente. Puoi anche codificare in base64 l'immagine, che va oltre lo scopo di questa risposta. (vedi this url per uno strumento per farlo).
Successivamente, collega l'evento click all'area di disegno. Quando quel clic entra, controlleremo per la trasparenza e agiamo solo per le regioni click non trasparenti:
if (isTransparentUnderMouse(this, e))
return;
// do whatever you need to do
alert('will do something!');
La magia avviene nella funzione isTransparentUnderMouse
, che ha bisogno di due argomenti: l'elemento canvas di destinazione (nel this
click handler's scope) e i dati dell'evento (e, in questo esempio). Ora veniamo alla carne:
var isTransparentUnderMouse = function (target, evnt) {
var l = 0, t = 0;
if (target.offsetParent) {
var ele = target;
do {
l += ele.offsetLeft;
t += ele.offsetTop;
} while (ele = ele.offsetParent);
}
var x = evnt.page.x - l;
var y = evnt.page.y - t;
var imgdata = target.getContext('2d').getImageData(x, y, 1, 1).data;
if (
imgdata[0] == 0 &&
imgdata[1] == 0 &&
imgdata[2] == 0 &&
imgdata[3] == 0
){
return true;
}
return false;
};
In primo luogo, facciamo un po 'di danza intorno per ottenere la posizione precisa dell'elemento in questione. Useremo queste informazioni per passare all'elemento canvas. Lo getImageData
ci fornirà, tra le altre cose, un oggetto data
che contiene il RGBA della posizione che abbiamo specificato.
Se tutti questi valori sono 0, allora guardiamo alla trasparenza. In caso contrario, c'è un po 'di colore presente. -edit- come indicato nei commenti, l'unico valore che dobbiamo veramente considerare è l'ultimo, imgdata[3]
nell'esempio precedente. I valori sono r (0) g (1) b (2) a (3) e la trasparenza è determinata da a, alpha. Puoi utilizzare questo stesso approccio per trovare qualsiasi colore con qualsiasi opacità che conosci per i dati rgba.
Provalo qui: http://jsfiddle.net/pJ3MD/1/
(nota: nel mio esempio, ho usato un'immagine base64 codificata per la protezione del dominio che ho citato È possibile ignorare che parte del codice, a meno che non si intende anche. sull'utilizzo di codifica Base64)
lo stesso esempio, con le modifiche al cursore del mouse gettato in per divertimento: http://jsfiddle.net/pJ3MD/2/
Documentazione
Avete bisogno per fare questo perché le immagini saranno generate dinamicamente? Mentre sono sicuro che potrebbe essere fatto in javascript, probabilmente sarà lento. Avendo usato la "bacchetta magica" e quant'altro in Photoshop, non è banale nemmeno "fare le cose bene". Sembra che se generi immagini in modo dinamico, usa i dati di origine per creare una mappa di immagini. Se non lo sei, allora perché non farlo offline e usa una mappa di immagini? –
Sì, sarà dinamico perché anche le immagini saranno caricate dinamicamente ... – lviggiani