[Edit] : This bug has been fixed in FF52+ (current latest Nightly)
I let the answer and its workaround in case it helps someone some time.
This seems to be a bug in Firefox with filter-functions. Chrome 54 seems to handle it just right.
When a filter-function is passed as the value of ctx.filter
, FF does taint the canvas, making all export methods unavailable (toDataURL
included).
However, it seems pretty happy with svg filters, so one workaround, until this bug is fixed, is to use an svg filter along with the url(#yourSVGFilter)
value type.
var img = new Image();
var c = document.createElement('canvas');
var ctx = c.getContext('2d');
document.body.appendChild(c);
btn.onclick = function() {
var i = new Image();
i.src = c.toDataURL();
document.body.appendChild(i);
};
img.onload = function() {
c.width = this.naturalWidth;
c.height = this.naturalHeight;
// this doesn't taint the canvas
ctx.filter = 'url(#blurMe)';
ctx.drawImage(img, 0, 0);
}
img.crossOrigin = 'anonymous';
img.src = 'https://dl.dropboxusercontent.com/s/4e90e48s5vtmfbd/aaa.png';
<svg width="0" height="0">
<filter id="blurMe">
<feGaussianBlur in="SourceGraphic" stdDeviation="2" />
</filter>
</svg>
<button id="btn">call toDataURL()</button><br>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…