【发布时间】:2016-06-29 12:18:59
【问题描述】:
我有一个 HTML 页面,可以从设备摄像头获取视频源。我使用 setTimeOut 循环将它绘制到画布上,然后将图片拍摄到图像上。然后我对该图像应用过滤器(棕褐色,灰度......)并保存它。图像在没有过滤器的情况下保存。为什么过滤后的图像没有保存,而是“原始”图像?我不太擅长 Javascript,所以请温柔一点。
<video id = "video" autoplay></video>
<button onclick = "snap()">Snap</button>
<canvas id = "canvas" width = "400" height = "300"></canvas>
<img id = "photo" src = "pic.png" alt = "Photo">
<button onclick = "save()">Save</button>
<button onclick = "sepia()">Sepia</button>//Added in edit
//--------------
var video = document.getElementById('video');
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
var photo = document.getElementById('photo');
navigator.getMedia({ video: true, audio: false }, success, failure);
function success(stream) {
video.src = vendorUrl.createObjectURL(stream);
}
function failure(error) {}
video.addEventListener('play', sendToCanvas, false);
function sendToCanvas() {
draw(this, context, canvas.width, canvas.height);
}
function draw(video, context, width, height) {
context.drawImage(video, 0, 0, width, height);
setTimeout(draw, 10, video, context, width, height);
}
function snap() {
photo.setAttribute('src', canvas.toDataURL("image/png"));
}
function save() {
var currentdate = new Date().toLocaleString();
var link = document.createElement('a');
link.download = currentdate + ".png";
link.href = photo.src;
link.click();
}
function sepia() {//Added in edit
photo.style["-webkit-filter"] = "sepia(100%)";
}
【问题讨论】:
-
你如何应用过滤器?如果通过 CSS,这是完全正常的。您必须将它应用到您从
ctx.getImageData获取的图像数据上。应用在画布上的样式并未真正绘制在画布中,因此无法通过其方法导出。 -
每个过滤器都有一个按钮,每个过滤器都有自己的功能:function sepia() { photo.style["-webkit-filter"] = "sepia(100%)";}
-
所以这只是 CSS 过滤器,重新阅读我的评论,这是你的答案
-
但是我将过滤器应用到图像并在屏幕上应用它,只是没有保存。
-
是的,但是如果你设置了画布的背景颜色,它仍然没有进入画布的图像,因此无法导出。
标签: javascript image html5-canvas html5-video href