Javascript 动画PNG到画布

Javascript 动画PNG到画布,javascript,jquery,html,canvas,Javascript,Jquery,Html,Canvas,我用一个脚本来复制动画PNG,把它放到画布上使用chromakey过滤器 一切似乎都在工作,但我没有得到图像复制到画布上的动画 我使用的是DrawImage,这就是它出错的地方。我已经尝试了一段时间,但我不明白如何不将动画PNG转换为静态PNG $(function(){ var img = $("#source").get(0); var $canvasbg = $("<div id='target-container' />"); var canvas =

我用一个脚本来复制动画PNG,把它放到画布上使用chromakey过滤器

一切似乎都在工作,但我没有得到图像复制到画布上的动画

我使用的是DrawImage,这就是它出错的地方。我已经尝试了一段时间,但我不明白如何不将动画PNG转换为静态PNG

$(function(){
    var img = $("#source").get(0);
    var $canvasbg = $("<div id='target-container' />");
    var canvas = $("<canvas class='greenscreen'></canvas>").get(0);
    $canvasbg.append(canvas);
    $('#container').append($canvasbg);
    img.onload = function() {
        greenScreen(img, canvas, $canvasbg);
    };

});

function greenScreen(img, canvas, $container, bg) {
    var context = canvas.getContext('2d');
    canvas.width = img.clientWidth;
    canvas.height = img.clientHeight;
    $container.width(img.clientWidth);
    $container.height(img.clientHeight);
    context.drawImage(img, 0, 0);

    var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
    var data = imageData.data;
    var start = {
        red: data[0],
        green: data[1],
        blue: data[2]
    };


    // iterate over all pixels
    for(var i = 0, n = data.length; i < n; i += 4) {
        var diff = Math.abs(data[i] - data[0]) + Math.abs(data[i+1] - data[1]) + Math.abs(data[i+2] - data[2]);
        data[i + 3] = (diff*diff)/$('#tolerance').val();
    }
    context.putImageData(imageData, 0, 0);
    $container.css('background',$('#color').val());
}
$(函数(){
var img=$(“#source”).get(0);
var$canvasbg=$(“”);
var canvas=$(“”)。获取(0);
$canvasbg.append(canvas);
$(“#容器”).append($canvasbg);
img.onload=函数(){
绿色屏幕(img、canvas、$canvasbg);
};
});
功能绿色屏幕(img、画布、容器、背景){
var context=canvas.getContext('2d');
canvas.width=img.clientWidth;
canvas.height=img.clientHeight;
$container.width(img.clientWidth);
$集装箱高度(如集装箱重量);
drawImage(img,0,0);
var imageData=context.getImageData(0,0,canvas.width,canvas.height);
var数据=imageData.data;
变量开始={
红色:数据[0],
绿色:数据[1],
蓝色:数据[2]
};
//迭代所有像素
对于(变量i=0,n=data.length;i
我的资料主要是:

我也尝试了同样的使用视频,这是有效的,但使用了太多的客户端源

JSBin here:在这个Bin上进行文件归档不起作用,因为我猜测图像来自另一个url。

根据Canvas 2RenderingContext
drawImage
方法

具体而言,当CanvasImageSource对象表示HtmlLorsvGimageElement中的动画图像时,用户代理必须使用动画的默认图像(格式定义的图像将在动画不受支持或禁用时使用),或者,如果没有此类图像,则使用动画的第一帧,为CanvasRenderingContext2D API渲染图像时

这适用于.gif、SMIL animated.svg、CSS animated.svg、.mjpeg媒体和APNG。因此,画布上只应绘制一个帧

您必须手动解析APNG文件并从中提取所有帧。

根据Canvas 2RenderingContext
drawImage
方法

具体而言,当CanvasImageSource对象表示HtmlLorsvGimageElement中的动画图像时,用户代理必须使用动画的默认图像(格式定义的图像将在动画不受支持或禁用时使用),或者,如果没有此类图像,则使用动画的第一帧,为CanvasRenderingContext2D API渲染图像时

这适用于.gif、SMIL animated.svg、CSS animated.svg、.mjpeg媒体和APNG。因此,画布上只应绘制一个帧


您必须手动解析APNG文件并从中提取所有帧。

您可以创建一个演示您所拥有的内容吗?例如,使用JSFIDLE?感谢您的回复,这里有一个JSBin:您可以创建一个您拥有的atm的演示吗?例如,使用JSFIDLE?感谢您的回复,这里有一个JSBin:我面临同样的问题。我编写了一个动画SVG生成器,用户可以下载到SVG。SVG样式标签中有CSS动画,用于制作SVG和其他东西的动画。我想让用户下载这个视频。为此,我在画布中绘制SVG以导出每个帧,并构建用户可以下载的视频。这工作得很好,但我在这个过程中失去了我的SVG动画。。。将SVG附加到画布时不再有动画。你知道怎么解决这个问题吗?多谢各位much@Benjamin这值得提出自己的问题。我想我最近看到了一个关于这个问题的答案,但我现在确实没有时间回答,我再也找不到了。。。如果它是你的,你可能想取消删除它,否则,你可能想问它。谢谢@kaido!我不知道你在说什么。但是我做了一些关于将CSS动画SVG导出为video/gif的高级研究,这似乎是不可能的。要做到这一点,我必须将CSS SVG动画转换为SMIL或使用Javascript(例如,使用GSAP)制作动画。但我不希望这样,因为我也希望我的SVG能够很轻地导出(并且没有依赖性),而SMIL会使它更重。。。我仍然可以生成两个版本:为SVG设置CSS动画和为视频导出/Gif导出设置SMIL动画),但这需要做一点工作……:/@Benjamin SMIL在这里没有帮助,正如这个答案所说,即使是SMIL动画也只能在画布上绘制第一帧。现在,其实有很多方法可以做到这一点,即使是CSS动画)所以如果你想打开一个新的问题,请随时让我知道(现在没有太多时间回答,但可能明天)非常感谢你。事实上,这里解释了一种在画布中设置SMIL动画的方法:。但是我没有找到任何CSS动画的黑客。我将提出一个问题,并与您保持联系!非常感谢;)我也面临同样的问题。我编写了一个动画SVG生成器,用户可以下载到SVG。SVG样式标签中有CSS动画,用于制作SVG和其他东西的动画。我想让用户下载这个视频。为此,我在画布中绘制SVG以导出每个帧,并构建用户可以下载的视频。这工作得很好,但我在这个过程中失去了我的SVG动画。。。将SVG附加到画布时不再有动画。你知道怎么解决这个问题吗?多谢各位much@Benjamin这值得提出自己的问题。我想我最近看到了一个关于这个问题的答案,但我现在确实没有时间回答,我再也找不到了。。。如果它是你的,你