SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【JavaScript】canvasでお絵かきしたい(半分自作する編)

問題

canvasを使ったお絵かき機能を作りたいです。

出来合いのライブラリもあるみたいだけど、ライブラリのお世話になるのはなるべく最小限にしたいです。

答え

canvasの操作はEaselJSを使ってみる。他の部分は自作する方向で。

canvasそのものは複数の描画オブジェクトを管理できたり、レイヤー操作ができたりするわけでなく、1枚のビットマップ画像を管理しているだけ。

マウスでお絵かきするときの1画目、2画目、3画目……を管理するには、各ストロークや絵の部品を表すデータ(色、形、塗り、線の太さ…)をcanvas上ではないところで管理して、そのデータをもとにcanvasに描画するといった感じの流れになる。そのあたりの処理は、各種のcanvas操作のライブラリがやってくれる。

もし素のcanvasの操作方法を知らなくても、ライブラリの使い方に従っていれば、canvas上に図形が表示される。


easeljsを使えるようにする

easeljsをダウンロードして、読み込む。https://github.com/CreateJS/EaselJS/tags などからダウンロード。

CDNも提供されているので、お試しにはこれも手軽でよい。

<script src="http://code.createjs.com/easeljs-0.6.0.min.js"></script>

jQueryには依存していない。


easeljsでさっそくマウスでお絵かき

後どうするかというと、「マウス操作のイベントの組み込み方」、「マウスの操作にしたがって絵の部品を作っていく処理」、「絵の部品が増えたらcanvasの表示を更新する処理」など、ライブラリの使い方にしたがって組み込んでいくことになる。考えても仕方ない。

デモは、線は角丸5px、色は黒#000000固定で作ってある。

Demo ↓ ここ描けます

JavaScript

<script src="http://code.createjs.com/easeljs-0.6.0.min.js"></script>
<script>
var canvas, stage;
var drawingCanvas;
var oldPt;
var oldMidPt;

function init() {
    canvas = document.getElementById("myCanvas");

    stage = new createjs.Stage(canvas);
    stage.autoClear = false;
    stage.enableDOMEvents(true);

    createjs.Touch.enable(stage);
    createjs.Ticker.setFPS(24);

    drawingCanvas = new createjs.Shape();

    stage.addEventListener("stagemousedown", handleMouseDown);
    stage.addEventListener("stagemouseup", handleMouseUp);

    stage.addChild(drawingCanvas);
    stage.update();
}

function stop() {
    createjs.Ticker.removeEventListener("tick", tick);
}

function handleMouseDown(event) {
    oldPt = new createjs.Point(stage.mouseX, stage.mouseY);
    oldMidPt = oldPt;
    stage.addEventListener("stagemousemove" , handleMouseMove);
}

function handleMouseMove(event) {
    var midPt = new createjs.Point(oldPt.x + stage.mouseX>>1, oldPt.y+stage.mouseY>>1);

    drawingCanvas.graphics.clear().setStrokeStyle(5, 'round', 'round').beginStroke('#000000').moveTo(midPt.x, midPt.y).curveTo(oldPt.x, oldPt.y, oldMidPt.x, oldMidPt.y);

    oldPt.x = stage.mouseX;
    oldPt.y = stage.mouseY;
    oldMidPt.x = midPt.x;
    oldMidPt.y = midPt.y;

    stage.update();
}

function handleMouseUp(event) {
    stage.removeEventListener("stagemousemove" , handleMouseMove);
}

window.onload=init;
</script>

さらに作りこんでいくなら、線の色変更、太さ変更、canvasのサイズ変更、取り消し(アンドゥ、Ctrl+z)、やり直し(リドゥ)、丸・三角・四角などの図形描画、画像挿入、各種ブラシ、画像として保存する機能(右クリックの「名前をつけて画像を保存」でできたりもするが)など、つけてみたい機能はたくさん思いつきますね。

メモ

だいぶ前にeaseljsを使ったことがあって、今改めてメモしておこうと思ったら、バージョンが0.4から0.6になっていて、古い書き方では0.6は動きませんでした。使い方がだいぶ変わっていました。

関連するメモ

コメント