我在使用 CanvasRenderingContext2D.filter 保存照片时遇到问题。当我连接到视频并尝试在没有任何滤镜的情况下拍摄照片时,它会正常保存。但是,在 Canvas 上添加一些滤镜后,它会另存为 HTM 文件,或者返回上一张没有滤镜的照片(如果已制作)。奇怪的是,当通过单击手动下载该屏幕截图时,它确实有自己的 toDataUrl,可以正常下载并包含过滤器,但在使用 toDataUrl 保存它时,它仍然看不到该图片。 我应该怎么做才能保存使用这些滤镜的照片?
这是我的代码片段:
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
var video = document.getElementById("video");
document.getElementById("snapshot").addEventListener("click", function() {
if ($('video').hasClass('blur')) {
context.filter ="blur(2px)";
}
else {
context.filter= "";
}
context.drawImage(video, 0, 0);
});
document.getElementById("download").addEventListener("click", function() {
download.href = canvas.toDataURL("image/jpeg");
};
.blur {
-webkit-filter: blur(3px);
-moz-filter: blur(3px);
-ms-filter: blur(3px);
-o-filter: blur(3px);
filter: blur(3px);
}
<video id="video" autoplay></video>
<canvas id="canvas"></canvas>
<button id="download" download="picture" href=""></button>
最佳答案
[编辑]:此错误有 been fixed在 FF52+(当前最新的 Nightly)
我给出了答案及其解决方法,以防它对某人有帮助。
这似乎是具有过滤功能的 Firefox 中的一个错误。 Chrome 54 似乎处理得恰到好处。
当过滤函数作为 ctx.filter
的值传递时,FF 会污染 Canvas ,使所有导出方法不可用(包括 toDataURL
)。
但是,它似乎对 svg 过滤器非常满意,所以有一个解决方法,直到 this bug是固定的,就是使用svg filter以及 url(#yourSVGFilter)
值类型。
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>
(出于好奇,还有一个 fiddle 重现问题)
关于javascript - 使用 CanvasRenderingContext2D 过滤器保存 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40120212/