こんにちは、Ryohei(@ityryohei)です!

本記事では、Canvasに描画した画像をマウスホイールで拡大・縮小する方法をご紹介しています。

Canvasの画像をマウスホイールで拡大・縮小する処理を作りたいんだけど、どうすればいいんだろう?

上記の疑問にお答えします。

では、解説していきます。

Canvasに画像を描画する

Canvasに画像を描画します。Canvasに画像を描画するにはdrawImage()を使用します。drawImage()に指定することができる引数はいくつか種類がありますが、本記事では、描画に最低限必要なイメージの描画位置とサイズのみを指定します。

ctx.drawImage(image, x, y, width, height);

各引数には下記の値を指定します。

imageイメージオブジェクト
xChavasの左上からのx座標
yChavasの左上からのy座標
width画像の幅(ピクセル)
height画像の高さ(ピクセル)

試しにCanvasに画像を描画してみます。

HTML

<canvas id="canvas" width="470" height="300"></canvas>

JavaScript

//canvas取得
const canvas = document.getElementById('canvas');
//canvasに描画するコンテキスト取得
const ctx = canvas.getContext('2d');

//画像生成
const image = new Image();

//画像指定
image.src = 'https://into-the-program.com/demo/images/sample010.jpg';

//画像描画用変数
const x = 0, y = 0, width = 470, height = 300;

//画像描画
image.onload = ()=>{
    ctx.drawImage(image, x, y, width, height);
}

実行結果

See the Pen 7307-1 by ryohei (@intotheprogram) on CodePen.

実行結果の通り、Canvasに画像が描画されます。引数の値がどういった役割を持っているのか、座標値を変更したり、画像幅や高さを指定したりすると理解が深まるのでおすすめです。

Canvasの画像を拡大・縮小する

Canvasに画像を描画することができましたので、次は描画した画像を拡大・縮小してみます。拡大・縮小にはscale()を使用します。scale()は引数に指定した値(整数・少数)に応じて画像を拡大・縮小することができます。

ctx.scale(scale, scale);

動作確認もかねて、前項で描画した画像にscale(1.5, 1.5)を実行して拡大してみます。

HTML

<canvas id="canvas" width="470" height="300"></canvas>

JavaScript

//canvas取得
const canvas = document.getElementById('canvas');
//canvasに描画するコンテキスト取得
const ctx = canvas.getContext('2d');

//画像生成
const image = new Image();

//画像指定
image.src = 'https://into-the-program.com/demo/images/sample010.jpg';

//画像描画用変数
const x = 0, y = 0, width = 470, height = 300;

//画像拡大・縮小
ctx.scale(1.5, 1.5);

//画像描画
image.onload = ()=>{
    ctx.drawImage(image, x, y, width, height);
}

実行結果

See the Pen 7307-2 by ryohei (@intotheprogram) on CodePen.

Canvasに描画された画像がscale()に指定した値て拡大されました。縮小する場合は少数を指定してくださいね。

Canvasの画像をマウスホイールで拡大・縮小する

Canvasのおさらいができたところで、マウスホイールにあわせて拡大・縮小する処理を作成します。JavaScriptが長くなってしまいましたので、各行にコメントを記載しています。実装される場合に参考にしていただければ幸いです。

HTML

<canvas id="canvas" width="470" height="300"></canvas>

JavaScript

const draw = ()=>{

    //canvas取得
    const canvas = document.getElementById('canvas');
    //canvasに描画するコンテキスト取得
    const ctx = canvas.getContext('2d');

    //画像生成
    const image = new Image();

    //画像指定
    image.src = 'https://into-the-program.com/demo/images/sample010.jpg';

    //画像描画用変数
    const x = 0, y = 0, width = 470, height = 300;
    
    //画像描画
    image.onload = ()=>{
        ctx.drawImage(image, x, y, width, height);
    }

    //拡大・縮小用変数
    let scale = 1;

    //マウスホイールイベント
    canvas.addEventListener('wheel', ()=>{
        
        //ページがスクロールしないようにイベントキャンセル
        event.preventDefault();
        //描画リセット
        ctx.clearRect(0, 0, event.target.width, event.target.height);
        //マウスホイールの Up/Down でscaleを0.1増減
        scale += event.deltaY * -0.001;
        //最小値(0.5)・最大値(2)を指定
        scale = Math.min(Math.max(0.5, scale), 2);
        //描画状態保存
        ctx.save();
        //画像拡大・縮小
        ctx.scale(scale, scale);
        //画像再描画
        ctx.drawImage(image, x, y, width, height);
        //描画状態復元
        ctx.restore();

    }, false);
}

draw();

実行結果

See the Pen 7307-3 by ryohei (@intotheprogram) on CodePen.

マウスホイールの動きに応じて、Canvasに描画した画像が拡大・縮小していますね。

Canvasについては下記ドキュメントに情報がつまってます。サンプルも豊富なので、実装時に参考にしていただければと思います。

参考:https://developer.mozilla.org/ja/docs/Web/API/Canvas_API

最後に

Canvasは入門するまでは難しいように思えるAPIですが、いざ触ってみると楽しく学ぶことができ、JavaScript側からの操作にも対応しているため、CSSだけでは難しかった位置調整などが簡単にできたり、本記事で紹介した拡大・縮小なんかも簡単に実装することができます。今後使用する機会が増えていくAPIだと思いますので、扱えるようになっておくと良いかもしれないですね。

以上、Canvasに描画した画像をマウスホイールで拡大・縮小する方法のご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。

JavaScriptを基礎からしっかりと学びたい方へ

下記の参考書がおすすめです。私がJavaScript入門時に購入した書籍で、基礎から応用まで多様なサンプルを用いて解説されています。ページ数は多いですが、内容が伴っているのですらすら読めます。腰を据えて学びたい方に最良の一冊となっています。