sumisu
sumisu

Reputation: 135

Kinetic JS - Loading multiple images on canvas

I want to load and display multiple images on a canvas. The image sources are saved in an array:

var sources = {"../src/img/IMG_1284.JPG", "../src/img/IMG_1285.JPG", "../src/img/IMG_1286.JPG", "../src/img/IMG_1287.JPG", "../src/img/IMG_1288.JPG"}

I found this tutorial: http://www.html5canvastutorials.com/tutorials/html5-canvas-image-loader

But I don't know how I can adapt this code to my sources array. Additionally, I want to set every image draggable, but I think this is not possible with context.drawImage(..).

Hope my problem is understandable. Thanks for your help...

Upvotes: 1

Views: 2130

Answers (1)

markE
markE

Reputation: 105015

I see you tagged your question with KineticJS.

KineticJS makes your task easy by keeping track of your images and allows your users to drag them.

Simple as:

  • use an image loader to be sure that all you images a fully loaded before trying to draw them
  • when loaded, create a Kinetic.Image using each image.
  • put the draggable property on the Kinetic.Image and it will automatically be draggable

Here's code and a Demo: http://jsfiddle.net/m1erickson/3es4Z/

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Prototype</title>
    <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
    <script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.7.2.min.js"></script>
<style>
body{padding:20px;}
#container{
  border:solid 1px #ccc;
  margin-top: 10px;
  width:350px;
  height:350px;
}
</style>        
<script>
$(function(){

    // create the Kinetic stage and layer
    var stage = new Kinetic.Stage({
        container: 'container',
        width: 350,
        height: 350
    });
    var layer = new Kinetic.Layer();
    stage.add(layer);

    // put the paths to your images in imageURLs
    var imageURLs=[];
    imageURLs.push("https://dl.dropboxusercontent.com/u/139992952/stackoverflow/house204-1.jpg");
    imageURLs.push("https://dl.dropboxusercontent.com/u/139992952/stackoverflow/house204-2.jpg");
    imageURLs.push("https://dl.dropboxusercontent.com/u/139992952/stackoverflow/house204-3.jpg");
    var imagesOK=0;
    var imgs=[];

    // fully load every image, then call the start function
    loadAllImages(start);

    function loadAllImages(callback){
        for (var i=0; i<imageURLs.length; i++) {
            var img = new Image();
            imgs.push(img);
            img.onload = function(){ 
                imagesOK++; 
                if (imagesOK>=imageURLs.length ) {
                    callback();
                }
            };
            img.onerror=function(){alert("image load failed");} 
            img.crossOrigin="anonymous";
            img.src = imageURLs[i];
        }      
    }

    function start(){
        // the imgs[] array holds fully loaded images
        // the imgs[] are in the same order as imageURLs[]

        // make each image into a draggable Kinetic.Image
        for(var i=0;i<imgs.length;i++){
            var img=new Kinetic.Image({
                x:i*75+15,
                y:i*75+15,
                width:60,
                height:60,
                image:imgs[i],
                draggable:true
            });
            layer.add(img);
        }
        layer.draw();
    }

}); // end $(function(){});
</script>       
</head>
<body>
    <button id="myButton">Button</button>
    <div id="container"></div>
</body>
</html>

Upvotes: 4

Related Questions