putImageData(), zu halten, wie die alten Pixel, wenn neue Pixel transparent?
In html5, wenn Sie beim zeichnen auf eine Leinwand, mit putImageData(), wenn einige der Pixel, die Sie zeichnen, sind transparent oder semi-transparent), wie halten Sie alt Pixel im canvas-Bereich unberührt?
Beispiel:
var imgData = context.createImageData(30,30);
for(var i=0; i<imgData.data.length; i+=4)
{
imgData.data[i]=255;
imgData.data[i+1]=0;
imgData.data[i+2]=0;
imgData.data[i+3]=255;
if((i/4)%30 > 15)imgData.data[i+3] = 0;
}
context.putImageData(imgData,0,0);
Der rechten Hälfte der 30x30 rect ist transparent.
Wenn diese gezeichnet über das, was auf der Leinwand die Pixel hinter der rechten Hälfte entfernt werden (oder werden thransparent). Wie halte ich Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie getImageData zu erstellen, die ein semi-transparentes overlay:
Hier ist der Beispiel-code und eine Demo: http://jsfiddle.net/m1erickson/CM7uY/
Alternativ können Sie check-out mit einem linearen Gradienten zu tun, Ihre Wirkung direkter.
http://jsfiddle.net/m1erickson/j6wLR/
Problem
Wie Sie wissen, ist Ihre Aussage
machen Pixel auf der rechten Hälfte des Bildes transparent sein, so dass jedes andere Objekt auf der Seite hinter der Leinwand kann man durch die canvas an, dass die pixel-position. Sie sind jedoch immer noch überschreiben die pixel auf der Leinwand selbst mit
context.putImageData
, ersetzt alle seine vorherigen Pixel. Die Transparenz, die Sie hinzufügen, wird nicht dazu führen, die bisherigen Pixel zu zeigen, durch, weil das ErgebnisputImageData
ist nicht einen zweiten Satz von Pixeln, die auf der vorherigen Pixel im canvas-Bereich, sondern eher der Ersatz der vorhandenen Pixel.Lösung
Schlage ich vor, dass Sie beginnen, Ihren code nicht mit
createImageData
die beginnen mit einem leeren Satz von Daten, sondern mitgetImageData
die geben Sie eine Kopie der vorhandenen Daten, mit zu arbeiten. Sie können dann mit dem bedingten Anweisung zu vermeiden überschreiben der Teil des Bildes, die Sie erhalten wollen. Dies wird auch Ihre Funktion effizienter.Etwas, dass ausgelöst me up, die von nutzen sein können... ich hatte Probleme mit diesem, weil ich davon ausgegangen, dass
putImageData()
unddrawImage()
arbeiten würde, in der gleichen Weise, aber es scheint Sie nicht.putImageData()
überschreibt die vorhandenen Pixel mit eigenen transparenten Daten währenddrawImage()
verlassen Sie unberührt.Wenn man in dieser, die ich gerade blickte auf die Dokumente für CanvasRenderingContext2D.globalCompositeOperation (sollte gelesen haben, enger), sah, dass
source-over
ist die Standardeinstellung und wusste nicht, dass dies würde für Sie nicht geltenputImageData()
Zeichnung in eine temporäre Leinwand und dann mit
drawImage()
hinzufügen die temp Leinwand zu den wichtigsten Kontext war die Lösung, die ich brauchte, also ein hoch auf diese.Wollte ich kopieren Sie eine gestochen SCHARFE, un-modifizierte version von der Leinwand auf sich selbst. Ich kam schließlich mit dieser Lösung, die gilt.
https://jsfiddle.net/4Le454ak/1/
Dem Kopie Teil ist in diesem code:
Was passiert:
<img>
(<img>
werden im dom obwohl)<img>
an dieser Stelle