javascript - 在 Canvas 上绘制多个图像并保存到图像

标签 javascript html image canvas

我正在尝试构建一个构造器,您可以在其中应用多个图像、 Canvas 上的文本,然后将其全部保存在一个图像中。

我无法让它处理多个图像

这是我从 http://www.html5canvastutorials.com/tutorials/html5-canvas-image-loader/ 获取的基础代码:

   function loadImages(sources, callback) {

    var images = [];
    var loadedImages = 0;
    var numImages = 0;
    // get num of sources
    for(i=0; i< sources.length; i++) {
      numImages++;
    }
    for(i=0; i< sources.length; i++) {
      images[i] = new Image();
      images[i].onload = function() {
        if(++loadedImages >= numImages) {
          callback(images);
        }
      };
      images[i].src = sources[i];
    }
  }



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

  //var sources = {
  //  darthVader: '/image/CategorieVerkeersborden/Verboden.jpg',
  //  yoda: '/image/CategorieVerkeersborden/Funborden.jpg'
  //};

var sources = []; // I need to add the values to that array dynamically I

$(document).ready(function(){


    $('.add').click(function(){

        if ( $.inArray($(this).siblings('img').attr('src'), sources) == -1 ){
            sources[sources.length] = $(this).siblings('img').attr('src');

        }

        loadImages(sources, function(images) {

            imageElem = document.getElementById('image');


            for (i = 0; i< sources.length; i++){

                context.drawImage(images[i], 0, 0, 300, 200); // this is the part that doesn't work - it draws the last image in the array I guess

            }
    //context.drawImage(images.darthVader, 0, 0, 300, 200);
    //context.drawImage(images.yoda, 0, 0, 200, 150);

  // the above part works 

    imageElem.src = context.canvas.toDataURL('image/png');

        });
     }); 


  });

有人能告诉我为什么当我尝试通过循环绘制图像时它不起作用吗?

最佳答案

function loadImages(sources, callback) {

    var images = [];
    var loadedImages = 0;
    var numImages = 0;
    // get num of sources
    for(i=0; i< sources.length; i++) {
      numImages++;
    }
    for(i=0; i< sources.length; i++) {
      images[i] = new Image();
      images[i].onload = function() {
        if(++loadedImages >= numImages) {
          callback(images);
        }
      };
      images[i].src = sources[i];
    }
  }



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

  //var sources = {
  //  darthVader: '/image/CategorieVerkeersborden/Verboden.jpg',
  //  yoda: '/image/CategorieVerkeersborden/Funborden.jpg'
  //};

var sources = []; // I need to add the values to that array dynamically I
 sources.push('http://pngimg.com/uploads/grass/grass_PNG10866.png');
 sources.push('http://pngimg.com/uploads/street_light/street_light_PNG11542.png');
 sources.push('http://pngimg.com/uploads/pokeball/pokeball_PNG34.png');
$(document).ready(function(){




        loadImages(sources, function(images) {

            imageElem = document.getElementById('image');


            for (i = 0; i< sources.length; i++){

                context.drawImage(images[i], 0, 0, 300, 200); // this is the part that doesn't work - it draws the last image in the array I guess

            }
    //context.drawImage(images.darthVader, 0, 0, 300, 200);
    //context.drawImage(images.yoda, 0, 0, 200, 150);

  // the above part works 

    imageElem.src = context.canvas.toDataURL('image/png');

        });



  });
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<canvas id="myCanvas" width="400" height="400"></canvas>

ctx.drawImage(图像、dx、dy、dWidth、dHeight) More info

在 Canvas 中,您正在位置(dx,dy)绘制图像,图像宽度(dWidth)和图像高度(dHeight)。在您的情况下,开始绘制位置是(0,0),所有图像宽度= 300,高度= 200,这就是它重叠所有图像的原因,并且您只能看到最后一个图像。

关于javascript - 在 Canvas 上绘制多个图像并保存到图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45058619/

相关文章:

html - 如何缩放任意文本以始终适合视口(viewport)宽度?

image - OpenCL 中的图像和缓冲区有什么区别?

image - Qt jpeg 无法在我 friend 的电脑上运行

java - 使用 Java 小程序裁剪从网络摄像头拍摄的图像

javascript - Highcharts + Angularjs : Graph doesn't redraw when adding series from an external event

javascript - jQuery 移动 : Is there a way to do some js before the first page shows up?

html - 如何调整 DropDown <select> 框的宽度?

javascript - Javascript 中的数组行为

javascript - 为什么使用CSSOM的insertRule后样式不可见,样式标签不能重新追加

javascript - 将 iframe 插入到 div 的底部