JavaScript:1枚の画像を分割して表示していく

JavaScript

canvasに1枚の画像を分割して表示していくJavaScriptサンプル。

ソースコード

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style.css">
    <script src="main.js"></script>
    <title>1枚の画像を分割して順番に表示</title>
</head>
<body>
    <main>
        <canvas id="canvas" width="600" height="600"></canvas>
    </main>
</body>
</html>

style.css

/* style.css */
@charset "utf-8";

*{
    margin: 0;
    padding: 0;
}

body{
    display: grid;                  /* CSSグリッドを適用 */
    grid-template-columns: 100vw;   /* ビューポート幅最大 */
    grid-template-rows: 100vh;      /* ビューポート高さ最大 */
}

main{
    justify-self: center;   /* 横方向中央揃え */
    align-self: center;     /* 縦方向中央揃え */
}

main.js

// main.js

let canvas = null;      // キャンバス
let g = null;           // コンテキスト
let image;              // 読み込む画像
let blocks = [];        // 画像ブロック用
let currentNo = 0;      // 現在のブロック番号(表示用)

const $id = (id) => { return document.getElementById(id); };    // DOM取得用

// ブロックごとに表示する
function mainLoop(){
    // ブロック描画
    drawBlock(currentNo++);

    // 全て描画したら終了
    if(currentNo >= blocks.length){
        console.log("Finish.");
        return;
    }
    setTimeout(mainLoop, 1000);
}

// ブロック描画
function drawBlock(n){
    g.drawImage(image, blocks[n].sx, blocks[n].sy, blocks[n].sw, blocks[n].sh, blocks[n].dx, blocks[n].dy, blocks[n].dw, blocks[n].dh);
}

/*
 * 起動時の処理
 */
window.addEventListener("load", function(){
    // キャンバス情報取得
    canvas = $id("canvas");
    g = canvas.getContext("2d");

    // 画像情報取得
    image = new Image();
    image.src = "lego_rakuda.jpg";

    image.addEventListener("load", ()=>{
        console.log("image loaded.");
        // 画像を9分割する
        for(let y=0; y<3; y++){
            for(let x=0; x<3; x++){
                const block = {
                    sx: x*200, sy: y*200, sw: 200, sh: 200, // 元の画像の開始点(sx, sy), 描画幅と高さ(sw, sh)
                    dx: x*200, dy: y*200, dw: 200, dh: 200, // 描画位置(dx, dy), 描画幅と高さ(dw, dh)
                };
                // 分割データをblocks配列に保存
                blocks.push(block);
            }
        }
        mainLoop();
    });


});

ポイント

サンプルでは、600×600ピクセルの画像を3×3の9ブロック(1ブロックは200×200ピクセル)に分割して表示している。

ブロックごとの描画には、CanvasAPIのdrawImageメソッドを利用している。
drawImageは、Imageオブジェクトに読み込んだ画像ファイルの1部分を取り出してcanvasの指定位置に描画することが可能。

drawImageの引数については、以下が分かりやすい。

drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)-Canvasリファレンス
Canvasの解説

コメント

タイトルとURLをコピーしました