7

Let's say I have this image:

enter image description here

and I have this 2D array tiles[] .. and using Image() function... how can do I use the (what I assume be best way?) for loop to add each tile into the array so tile[0] through however many there are is read and used as Image() objects later to be painted on HTML5 canvas?

4

2 に答える 2

4

私は...するだろう..

  • この画像の幅と高さのタイル数を計算します
  • イメージをメモリ内のキャンバスに描画し、コンテキストを使用してイメージ データを取得します。
  • 各タイルをループしてサブイメージ化し、配列に格納します。

仮定:

imageWidth, imageHeight, tileWidth, tileHeight

すべての名前が示唆するものを説明し、次のことを行います。

編集:コメントに従って画像の読み込みを追加し、間違った名前ImageWidthImageHeightを修正imageWidthしましたimageHeight

編集:ここで画像が描画されるときに内部でコードを実行imageObj.onloadし、原点(0,0)から drawImage()

    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");
    var imageObj = new Image();
    imageObj.src = "tilesetImageLocationHere";

  imageObj.onload = function() {
    ctx.drawImage(imageObj, 0, 0);

次に、画像をタイル データのリストに分割します。

    var tilesX = imageWidth / tileWidth;
    var tilesY = imageHeight / tileHeight;
    var totalTiles = tilesX * tilesY;        
    var tileData = new Array();
    for(var i=0; i<tilesY; i++)
    {
      for(var j=0; j<tilesX; j++)
      {           
        // Store the image data of each tile in the array.
        tileData.push(ctx.getImageData(j*tileWidth, i*tileHeight, tileWidth, tileHeight));
      }
    }
    //From here you should be able to draw your images back into a canvas like so:
    ctx.putImageData(tileData[0], x, y);
  }
于 2012-07-18T03:53:20.630 に答える
0

わかりました。ローカルホストでこれを実行しました。少なくともベースが提供されるはずです。箱から出してすぐに使用できるはずですが、必要に応じて計算を調整する必要があるかもしれません。私はあなたの例にそれを完成させるためにあなたの時間を費やす必要はないと思います:

明らかに、画像を自分の画像に向ける必要があります。

<html>
  <head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script type="text/javascript">
      $(function(){
        var canvas = document.getElementById('fakeCanvas');
        var ctx = canvas.getContext('2d');
        var img = new Image();
        img.src = '/theImage.png';
        var tiles = [];
        var  imageTileNumWidth = 23;
        var imageTileNumHeight = 21;

img.onload = function(){
  var imageWidth = img.width;
  var imageHeight = img.height;
  sndCanvasWidth = imageWidth/imageTileNumWidth;
  sndCanvasHeight = imageHeight/imageTileNumHeight;
  canvas.width = imageWidth;
  canvas.height = imageHeight;
  ctx.drawImage(img,0,0,imageWidth,imageHeight);
  var sndCanvas = document.getElementById('drawCanvas');
  sndCanvas.width=sndCanvasWidth;
  sndCanvas.height=sndCanvasHeight;
  var i=0;
  var j=0;
  var t=0;
    for(i=0;i<imageWidth;i+=sndCanvasWidth){
      for(j=0;j<imageHeight;j+=sndCanvasHeight){
            var myImageData = ctx.getImageData(j,i,sndCanvasWidth,sndCanvasHeight);     
            var ctx2 = sndCanvas.getContext("2d");
            ctx2.putImageData(myImageData,0,0);
            tiles.push(myImageData);  
      }
    }
};
    });
  </script>
</head>
  <body>
    <canvas id="fakeCanvas"></canvas>
    <canvas id="drawCanvas"></canvas>
  </body>
</html>
于 2012-07-18T06:45:01.973 に答える