画像は、600×600ピクセルの正方形画像を使用した。
1ブロックのサイズは100×100ピクセル。合計36個のブロックをランダムで置き換えて表示している。
ブロックの置き換えは100回行う。
ただランダムに置き換えてしまうと元の画像に戻らなくなるので、前半50回の置き換え順序を後半50回では、下から順にして元に戻るようにしている。
イメージ
1回目 1番 2番 を置き換え
2回目 5番 6番 を置き換え
3回目 9番 3番 を置き換え
:
98回目 9番 3番 を置き換え
99回目 5番 6番 を置き換え
100回目 1番 2番 を置き換え
ソースコード
index.html
5 | < meta http-equiv = "X-UA-Compatible" content = "IE=edge" > |
6 | < meta name = "viewport" content = "width=device-width, initial-scale=1.0" > |
7 | < link rel = "stylesheet" href = "style.css" > |
8 | < script src = "main.js" ></ script > |
9 | < title >画像がブロック単位で置き換わり元に戻る</ title > |
13 | < canvas id = "canvas" width = "600" height = "600" ></ canvas > |
style.css
11 | grid-template-columns: 100 vw; |
12 | grid-template-rows: 100 vh; |
main.js
11 | const $id = (id) => { return document.getElementById(id); }; |
12 | const IMG_FILE = "majo024.jpg" ; |
15 | const BUNKATU = IMG_SIZE / BLK_SIZE; |
19 | const [x, y] = [ timeLine[currentNo][0], timeLine[currentNo][1] ]; |
25 | if (currentNo >= timeLine.length){ |
27 | g.fillStyle = "rgba(200, 200, 200, 128)" ; |
28 | g.fillText( "©スタジオジブリ 魔女の宅急便" , 440, 580); |
30 | setTimeout(mainLoop, 10000); |
33 | setTimeout(mainLoop, 100); |
39 | for (let block of blocks){ |
40 | g.drawImage(image, block.dx, block.dy, BLK_SIZE, BLK_SIZE, |
41 | block.dx, block.dy, BLK_SIZE, BLK_SIZE); |
46 | function swapBlock(x, y){ |
47 | [ blocks[x].value, blocks[y].value ] = [ blocks[y].value, blocks[x].value ]; |
52 | const x = blocks[n].value; |
53 | g.drawImage(image, cells[x].sx, cells[x].sy, BLK_SIZE, BLK_SIZE, |
54 | blocks[n].dx, blocks[n].dy, BLK_SIZE, BLK_SIZE); |
58 | function setTimeline(){ |
62 | for (let i=0; i<50; i++){ |
63 | const r1 = Math.floor(Math.random()*BUNKATU*BUNKATU); |
64 | const r2 = Math.floor(Math.random()*BUNKATU*BUNKATU); |
65 | half.push( [r1, r2] ); |
66 | timeLine.push( [r1, r2] ); |
70 | const obj = half.pop(); |
71 | if (obj === undefined) break ; |
72 | const [x, y] = [obj[0], obj[1]]; |
73 | timeLine.push([y, x]); |
80 | window.addEventListener( "load" , function (){ |
82 | canvas = $id( "canvas" ); |
83 | g = canvas.getContext( "2d" ); |
89 | image.addEventListener( "load" , ()=>{ |
90 | console.log( "image loaded." ); |
93 | for (let y=0; y<BUNKATU; y++){ |
94 | for (let x=0; x<BUNKATU; x++){ |
95 | const block = { value: i, dx: x*BLK_SIZE, dy: y*BLK_SIZE }; |
98 | const cell = { sx: x*BLK_SIZE, sy: y*BLK_SIZE }; |
参考
使った魔女の宅急便の画像は、スタジオジブリが常識の範囲内での利用に限り提供してくれているもの。

今月から、スタジオジブリ作品の場面写真の提供を開始します - スタジオジブリ|STUDIO GHIBLI
今月から、スタジオジブリ作品の場面写真の提供を開始します。 今月からスタジオジブリ全作品の場面写真を順次提供することになりました。今月は、新しい作品を中心に 8作品、合計400枚提供します。 常識の範囲でご自由にお使いください。 思い出のマ...
コメント