将图像数组与 javascript 组合(有或没有 canvas)

combine array of images with javascript (with or without canvas)

我想创建一条图像并合成一个新图像,例如 image = [image0-image1-image2].

我们将使用:

images = ['https://upload.wikimedia.org/wikipedia/commons/5/55/Al-Farabi.jpg',
    'https://upload.wikimedia.org/wikipedia/commons/e/e1/FullMoon2010.jpg',
 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/3D_coordinate_system.svg/10000px-3D_coordinate_system.svg.png']

我想把上面的外拍,拼贴出来。 我想在后台进行。

我了解到可以在 dom 之外使用 canvas 元素;为了看我在做什么,我将在这里使用 canvas 元素。

// create an off-screen canvas using document.createElement('canvas')
// here I use a canvas in DOM cause I cannot find a way to displayed the final collage 
var canvas = document.getElementById('canvas'),
    context = canvas.getContext('2d');

// set its dimension to target size
canvas.width = 1200;
canvas.height = 630;  

并发现三种不同的行为,我认为应该给出相同的结果。你能解释一下为什么吗?

如果我手动复制并粘贴每张图片的控制台代码,一次一张在此处输入代码`

var image = new Image();
// i is the i-th element in images
image.src = images[i]; 
image.onload = function() {
    context.save();
    context.drawImage(image, canvas.width * 0.3 * i, 0, canvas.width*0.3, canvas.height);
}

我可以看到元素一个挨着一个放置,就像我希望的那样。

但是如果我一次复制所有三段代码,无论是在一个循环中,我只能看到放在中的最后一张图像三个不同的位置:

for (var i = images.length; i <= 0; i++) {
var image = new Image();
image.src = images[i];
  image.onload = function(){
        context.save();
        context.drawImage(image, canvas.width*0.3 * i, 0, canvas.width*0.3, canvas.height); 
  }
}

所以我想,也许这是在加载图像后使用回调的问题 - 我尝试了以下但没有任何反应:canvas 保持为空。

// my callback
function addImage(image, position){
      image.onload = function(){
          context.save();
          context.drawImage(image, canvas.width*0.3 * position, 0, canvas.width*0.3, canvas.height); 
      }         
}

function loadImages (images, callback) {
  for (var i = images.length-1; i >= 0; i--) {
    var image = new Image();
    image.src = images[i];
    callback(image, i);
   }
}


// canvas will stay empty:
loadImages(images, addImage);

你能帮忙弄清楚这三个部分的区别,并弄清楚如何将一组图像组合成一个图像吗?

可能在后台,然后我想通过 ajax 保存图像并 post。

在您的循环示例中,所有 onload 函数都共享循环中相同的 i 和 image 变量。但是 onload 函数是在循环完成后调用的回调函数。因此,所有 onload 函数都使用循环完成后的相同 i 和 image 值。您需要创建一个本地作用域,以便每个 onload 函数都有自己的 i 和 image 值。例如...

for (var i = 0; i < images.length; i++) {
    var image = new Image();
    image.src = images[i];
    image.onload = function(image, i) {
        return function(){
           context.drawImage(image, canvas.width*0.3 * i, 0, canvas.width*0.3, canvas.height); 
        }
    }(image, i);
}