コアダンプの数だけ強くなれるよ

見習いエンジニアの備忘log

Javascriptで画像を分割してシャッフルする

HTML5のcanvasとJavascriptを使って画像データを9つのブロックに分割し、ブロックをシャッフルして表示してみる。

画像を分割してシャッフル表示

シャッフル前

シャッフル後

ソースコード

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>画像を分割してシャッフル表示</title>
<script type="text/javascript">

function resize(x, y) {
  document.orig.width = x;
  document.orig.height = y;
}

function shuffleArray(array) {
  var n = array.length, t, i;

  while (n) {
    i = Math.floor(Math.random() * n--);
    t = array[n];
    array[n] = array[i];
    array[i] = t;
  }

  return array;
}

function shuffle() {
  //描画コンテキストの取得
  var canvas = document.getElementById('c');
  
  if (canvas.getContext) {
    var ctx = canvas.getContext('2d');
    ctx.fillStyle = "rgb(255,255,255)";
    ctx.fillRect(0, 0, 300, 300);
    
    var img = new Image();
    img.src = "http://freesozai.jp/sozai/roadsign/img/rds_001/1.png";
    
    img.onload = function() {
      img.width = 300;
      img.height = 300;
      var xmax = 3;
      var ymax = 3;
      var width = 300/xmax;
      var height = 300/ymax;
      var width0 = img.width / xmax;
      var height0 = img.height / ymax;
      var ary = [];
      var cnt = 0;
  
      for(var i = 0; i < xmax; i++){
        for(var j = 0; j < ymax; j++){
          ary[cnt++] = [i,j];
        }
      }
      
      ary = shuffleArray(ary);
      
      for(var i = 0; i < xmax; i++){
        for(var j = 0; j < ymax; j++){
          cnt--;
          var x = ary[cnt][0];
          var y = ary[cnt][1];
          ctx.drawImage(img, width0 * x, height0 * y, width0, height0, width * i, height * j, width, height);
        }
      }
      
    }
  }
}
</script>
</head>
<body onLoad="shuffle()">
  <h4>シャッフル前</h4>
  <div><img src="http://freesozai.jp/sozai/roadsign/img/rds_001/1.png" name="orig" onload="resize(300,300)"></img></div>
  <h4>シャッフル後</h4>
  <canvas id="c" style="background-color:white;" width=300 height=300></canvas>
  
  <p></p>
  <input type="button" value="Shuffle" onclick="shuffle()">
</body>
</html>

参照

道路標識の一覧 - 無料で使えるEPSフリー素材集

JavaScript で配列のシャッフル - HAM MEDIA MEMO




次回はこれをベースに8ピースパズルを作成予定。

www.segmentation-fault.xyz