Javascript - 在 Canvas 上平铺多个图像

标签 javascript html canvas tile

我只是尝试并排加载 3 个不同的图像,但是当我运行以下代码时,它只绘制我多次插入 src[] 的最后一个图像。

function draw(){
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    var tileWidth = 25;
    var tileWCount = 3;
    var multi = 2;
    var src = [];
    src.push("http://st.hzcdn.com/simgs/6361d7eb0dee6b28_4-1763/contemporary-tile.jpg");
    src.push("http://www.in.all.biz/img/in/catalog/middle/205131.jpeg");
    src.push("http://www.magnet-textures.com/textures/2011/7/715-1259-1-blue-tiles-ico-big.jpg");

    for(var i=0; i < tileWCount; i++){
        var img = new Image();
        img.onload = (function(value){
            return function() {
                ctx.drawImage(img, (value * tileWidth * multi), 0, tileWidth * multi, tileWidth * multi);
            }
        })(i);
        img.src = src[i];
    }
}

我从 this Stack Overflow post 中获取了大部分代码。我可以将 src 设置为单个图像,但是当我尝试使用迭代器时,它开始失败。我确实注意到答案是将 ctx.drawImage 与 src[value] 结合使用,但我无法用它来绘制任何东西。

我完全不知道为什么会发生这种情况。

为了方便起见,我设置了一个 jsfiddle 项目:http://jsfiddle.net/fierstarter/jv0ko966/

function draw(){
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    var tileWidth = 25;
    var tileWCount = 3;
    var multi = 2;
    var imgA = [];
    var src = [];
    src.push("http://st.hzcdn.com/simgs/6361d7eb0dee6b28_4-1763/contemporary-tile.jpg");
    src.push("http://www.in.all.biz/img/in/catalog/middle/205131.jpeg");
    src.push("http://www.magnet-textures.com/textures/2011/7/715-1259-1-blue-tiles-ico-big.jpg");
    
    for(var i=0; i < tileWCount; i++){
        var img = new Image();
        img.onload = (function(value){
            return function() {
                ctx.drawImage(img, (value * tileWidth * multi), 0, tileWidth * multi, tileWidth * multi);
            }
        })(i);
        img.src = src[i];
    }
}

draw();
#canvas{
    border: 1px solid black;
}
<canvas id="canvas" width="320" height="240"></canvas>

最佳答案

您将需要使用:

ctx.drawImage(this, (value * tileWidth * multi), 0, tileWidth * multi, tileWidth * multi);

而不是

ctx.drawImage(img, (value * tileWidth * multi), 0, tileWidth * multi, tileWidth * multi);

您的 img 变量遇到了与您使用闭包修复的 i 相同的“最后一个值”问题。您可以以相同的方式在闭包中捕获 img 的值,但使用 this 更容易。

工作现场演示:

function draw(){
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    var tileWidth = 25;
    var tileWCount = 3;
    var multi = 2;
    var imgA = [];
    var src = [];
    src.push("http://st.hzcdn.com/simgs/6361d7eb0dee6b28_4-1763/contemporary-tile.jpg");
    src.push("http://www.in.all.biz/img/in/catalog/middle/205131.jpeg");
    src.push("http://www.magnet-textures.com/textures/2011/7/715-1259-1-blue-tiles-ico-big.jpg");
    
    for(var i=0; i < tileWCount; i++){
        var img = new Image();
        img.onload = (function(value){
            return function() {
                ctx.drawImage(this, (value * tileWidth * multi), 0, tileWidth * multi, tileWidth * multi);
            }
        })(i);
        img.src = src[i];
    }
}

draw();
#canvas{
    border: 1px solid black;
}
<canvas id="canvas" width="320" height="240"></canvas>

JSFiddle 版本:http://jsfiddle.net/jv0ko966/2/

关于Javascript - 在 Canvas 上平铺多个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32148492/

相关文章:

HTML5 Canvas - 绘画应用程序的不透明度问题

javascript - 读取外部 HTTPS 站点的 JSON 提要

javascript - jQuery:修改附加对象的 CSS

javascript - 数组作为 React 中的状态?

javascript - 让一个div在点击时滑动

html - Bootstrap ul breaking float 并将其显示在左侧导航下方

python - Django 如何在将当前页面与 request.get_full_path 进行比较时排除 GET 参数

html - 日期选择下拉列表中的选项未对齐 (Firefox)

javascript 跟踪多个图像并将其放置在图像之上

javascript - 如何使用 Canvas drawImage 处理质量损失?