如何从数组中的图像源创建Canvas图像?

时间:2015-08-30 01:31:45

标签: javascript jquery html5 canvas html5-canvas

我想从来自我的ajax请求的数组中的多个图像创建一个Canvas图像;为此,我尝试运行循环,但drawImage不适用于循环。

然后我尝试一个函数,并在循环中调用该函数,但同样的事情发生drawImage不适用于此

下面我已经提到了所有带有loop&功能的代码之一。一个目前有效的drawImage中的静态信息。

如果您有任何人请指导我如何解决此问题,我将非常感激。

静态drawImage代码哪个正常

function loadImages(sources, callback, imagesrc) {
        var images = {};
        var loadedImages = 0;
        var numImages = 0;

        for(var src in sources) {
          numImages++;
        }

        for(var src in sources) {
          images[src] = new Image();
          images[src].onload = function() {
            if(++loadedImages >= numImages) {
              callback(images);
            }
          };
          images[src].src = sources[src];
        }


 }

      var canvas = document.getElementById('product-image');

      canvas.height = (jQuery(window).height()) -120;
      canvas.width = canvas.height * 0.75;
      var heightscreen = (jQuery(window).height()) -120;
      var canvasheight = heightscreen;
      var canvaswidth = canvas.height * 0.75;
      canvaswidthdiv4 = 0;
      var widthNeeded = canvasheight * 0.75;

      var context = canvas.getContext('2d');

// THIS IS A DUMMY ARRAY SAME AS COME IN AJAX RESPONSE  
        var sources = 
        {        
        Slim_Fit: "http://localhost/plugindev/wp-content/uploads/2015/08/slimFit.png",
        Inside_Colar: "http://localhost/plugindev/wp-content/uploads/2015/08/maincolar.png",
        Outside_Colar: "http://localhost/plugindev/wp-content/uploads/2015/08/outer_collar1.png",
        Main_Colar: "http://localhost/plugindev/wp-content/uploads/2015/08/inner_collar11.png"
        };



      loadImages(sources, function(images) 
      {

        context.drawImage(images.Slim_Fit, canvaswidthdiv4, 55, widthNeeded, canvasheight);  
        context.drawImage(images.Inside_Colar, canvaswidthdiv4, 55, widthNeeded, canvasheight);
        context.drawImage(images.Outside_Colar, canvaswidthdiv4, 55, widthNeeded, canvasheight);
        context.drawImage(images.Main_Colar, canvaswidthdiv4, 55, widthNeeded, canvasheight);

      });

以下是我用于功能但不起作用的修正

 loadImages(sources, function(images) 
  {
jQuery.each( sources, function( key, value ) {

 DrawImage(key, images );

  });

  });

function DrawImage(keyname,images){

context.drawImage(images.keyname, canvaswidthdiv4, 55, widthNeeded, canvasheight);      
        }

以下是我使用循环绘制时的修正,但不能正常工作

 loadImages(sources, function(images) 
  {
jQuery.each( sources, function( key, value ) {

 context.drawImage(images.key, canvaswidthdiv4, 55, widthNeeded, canvasheight);

  });

  });

请帮忙!

3 个答案:

答案 0 :(得分:1)

注意,问题中的js会将{1}}上canvas的第二,第三,第四个参数的先前绘制的图像上的每个图像绘制到.drawImage上吗?

loadImages

请注意

上的loadImages(sources, function(images) { context.drawImage(images.Slim_Fit, canvaswidthdiv4, 55, widthNeeded, canvasheight); context.drawImage(images.Inside_Colar, canvaswidthdiv4, 55, widthNeeded, canvasheight); context.drawImage(images.Outside_Colar, canvaswidthdiv4, 55, widthNeeded, canvasheight); context.drawImage(images.Main_Colar, canvaswidthdiv4, 55, widthNeeded, canvasheight); });
sources

是对象,而不是数组

// THIS IS A DUMMY ARRAY SAME AS COME IN AJAX RESPONSE var sources = { Slim_Fit: "http://localhost/plugindev/wp-content/uploads/2015/08/slimFit.png", Inside_Colar: "http://localhost/plugindev/wp-content/uploads/2015/08/maincolar.png", Outside_Colar: "http://localhost/plugindev/wp-content/uploads/2015/08/outer_collar1.png", Main_Colar: "http://localhost/plugindev/wp-content/uploads/2015/08/inner_collar11.png" }; 可缩短为单js次循环;在.forEach()回调中呼叫canvas时根据需要调整.drawImage上的位置



.forEach

var canvas = document.getElementById("product-image");
/*
canvas.height = (jQuery(window).height()) - 120;
canvas.width = canvas.height * 0.75;
var heightscreen = (jQuery(window).height()) - 120;
var canvasheight = heightscreen;
var canvaswidth = canvas.height * 0.75;
canvaswidthdiv4 = 0;
var widthNeeded = canvasheight * 0.75;
*/

var context = canvas.getContext('2d');

var images = ["http://lorempixel.com/50/50/cats"
              , "http://lorempixel.com/50/50/nature"
              , "http://lorempixel.com/50/50/animals"
              , "http://lorempixel.com/50/50/sports"
];

images.forEach(function(src, index) {
  var img = new Image;
  img.onload = function() {
    context.drawImage(this, index * this.width, index * this.width)
  }
  img.src = src
})




答案 1 :(得分:0)

尝试使用images[key]代替images.key

答案 2 :(得分:0)

所以我用以下代码修复了

var canvas = document.getElementById("product-image");

canvas.height = (jQuery(window).height()) - 120;
canvas.width = canvas.height * 0.75;
var heightscreen = (jQuery(window).height()) - 120;
var canvasheight = heightscreen;
var canvaswidth = canvas.height * 0.75;
canvaswidthdiv4 = 0;
var widthNeeded = canvasheight * 0.75;

var context = canvas.getContext('2d');
obj = JSON.parse(imagesrc);

obj = JSON.parse(obj);
var sources = obj;


var images = Object.keys(sources).map(function(k) { return sources[k] });

var returnedImages = loadImages(images);


for (i = 0; i < returnedImages.length; i++) { 
context.drawImage(returnedImages[i], canvaswidthdiv4, 55, widthNeeded, canvasheight);
}

// Image loading global variables
var loadcount = 0;
var loadtotal = 0;
var preloaded = false;

// Load images
function loadImages(imagefiles) {
// Initialize variables
loadcount = 0;
loadtotal = imagefiles.length;
preloaded = false;

// Load the images
var loadedimages = [];
for (var i=0; i<imagefiles.length; i++) {
    // Create the image object
    var image = new Image();

    // Add onload event handler
    image.onload = function () {
        loadcount++;
        if (loadcount == loadtotal) {
            // Done loading
            preloaded = true;
        }
    };

    // Set the source url of the image
    image.src = imagefiles[i];

    // Save to the image array
    loadedimages[i] = image;
   }

// Return an array of images
return loadedimages;
}