アウトプットブログ

主にプログラミングで学んだことをアウトプットします。

【createjs】図形をくりぬく方法

今回はcreatejsで図形をくりぬく方法です。
備忘録的な意味でも記録しておこうと思います。


やりたいこと

createjsで画像を範囲選択する機能を作成しました。
範囲を示す図形は赤の破線で実装しています。


ただ、なんとなくこれが気に入らない。
ので、Windowsの画面キャプチャのような見た目にしたい。
切り取る範囲以外がグレーがかる感じです。


変更のイメージ。

図形をくりぬくには

一部分だけくりぬかれた画像を表示するには、全体を一旦グレーで塗ってから透明の図形でくり抜く必要があります。
以下イメージ。


通常canvasを扱う際に下に描画されている図形をくりぬくには、contextのglobalCompositeOperation属性に"destination-out"を指定すれば実現できます。
同じようにcreatejsで"destination-out"の指定を行うには、cacheを使用する必要があります。

DisplayObject.cache(x, y, width, height, [scale=1], [options=undefined])

一時的に別の領域に描画をした上で、画面の描画に使用するようです。
x, y, width, heightで指定した領域を、別のcanvasに描画するイメージでしょうか。

DisplayObject.updateCache(compositeOperation)

キャッシュに再描画をします。
stage.updateのキャッシュバージョンと思っておけばよさそうです。
この引数に"destination-out"を指定してあげれば、図形をくりぬくことができます。

試してみる

test.html
<html>
<head>
  <meta charset="utf-8" />
  <script src="https://code.createjs.com/1.0.0/createjs.min.js"></script>
  <script src="./js/test.js"></script>
</head>
<body>
  <canvas id="myCanvas" width="300" height="300" style="border:solid 1px black;"></canvas>
</body>
</html>
js/test.js
window.addEventListener("load", init);

function init() {
  let stage = new createjs.Stage("myCanvas");

  stage.addChild(new createjs.Bitmap("img/red_dot.png"));

  let rect = stage.addChild(new createjs.Shape());

  rect.graphics
    .f("#000000")
    .dr(0, 0, 300, 300);
  rect.alpha = 0.8;
  rect.cache(0, 0, 300, 300);

  rect.graphics
    .c()
    .f("#00FFFF")
    .dr(50, 50, 100, 100);
  rect.updateCache("destination-out");

  createjs.Ticker.on("tick", function () {
    stage.update();
  });
}
表示結果


期待通りの結果が得られました。
cacheに書き込めば、そのあとclearメソッドで図形をクリアしても残るんですね。
ちょっとこのあたりの理解がまだ曖昧ですが・・・期待通りの動きをしているので、まあいいでしょう。

実装

実装しました。

おわりに

画像処理系の記事ばかり書いていましたが、フロント側の実装も楽しいですね。
デザインセンスが欲しいです。


ソースコードgithubに上げました。
https://github.com/dontsutsu/puyo-app-front
https://github.com/dontsutsu/puyo-app-back