LoginSignup
4
7

More than 3 years have passed since last update.

fabric.jsを使って、指定画像にcanvas上で手書き実装

Posted at

初めに

ダウンロードやクリア(書いた内容)機能の実装等を含め、すこし迷ったので、そのあたりを含めたサンプルメモ(3.6.3で確認)

ライブラリのjsファイルについては、以下のページのダウンロードリンクから取得
fabric.jsのメインページ

フォルダ構成

root/
 ├ index.html
 ├ canvas.jpg(表示する画像)
 └ assets/
    ├ main.js
    └ fabric.min.js

ソース

HTML

index.html
<!DOCTYPE html>
<html>
<head>
    <script src="./assets/js/fabric.min.js"></script>
    <script src="./assets/js/main.js"></script>
</head>
<body>
    <canvas id="canvas"></canvas>
    <a id="download" href="#">ダウンロード</a>
    <a id="init" href="javascript:void(0)">クリア</a>
</body>
</html>

JavaScript

main.js
// キャンバスの共通オブジェクト
var canvas = null;
// 読み込むファイル名(動的に変えてもOK)
var FILENAME = "canvas.jpg";

window.addEventListener("load", function(){

    // キャンバスの初期設定
    const canvasinit = function(){

        // キャンバス取得
        var canvas = new fabric.Canvas('canvas');

        // 手書きモードOK
        canvas.isDrawingMode = true;
        // 手書きの色
        canvas.freeDrawingBrush.color = "#990000";
        // 手書きの太さ
        canvas.freeDrawingBrush.width = 10;

        // 画像読み込み
        var img = new Image();
        img.src=FILENAME;

        // 画像読み込んだときの処理
        img.onload = function(){

            // キャンバスサイズを設定()
            canvas.setWidth(this.width);
            canvas.setHeight(this.height);

            // サイズを指定画像に合わせるために読み込み終わったときに、キャンバスに設定する
            canvas.setBackgroundImage(FILENAME, canvas.renderAll.bind(canvas),
                {
                    // キャンバス内の画像サイズを設定
                    scaleX: canvas.width / img.width,
                    scaleY: canvas.height / img.height
                }
            );

        }

        // 描いた内容はクリア、画像はそのまま
        var init = document.getElementById("init");
        init.addEventListener("click", function(){
            // キャンバスクリア
            canvas.clear();
            // 画像を表示(上記onload処理にいく)
            img.src=FILENAME;
        });

    }
    // 初期処理で実行
    canvasinit();

    // ダウンロード処理
    var download = document.getElementById("download");
    download.addEventListener("click", function(){

        // ダウンロードファイル名指定
        this.setAttribute("download", "sample.jpg");
        // キャンバスのオブジェクト取得
        canvas = document.getElementById('canvas');
        // base64に変換
        var base64 = canvas.toDataURL("image/jpeg");
        // ダウンロード
        document.getElementById("download").href = base64;

    });

});

ダウンロードは、ローカル実行では動かないことがあるのでお気を付けを(多分ブラウザのセキュリティレベルによるものかと)

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7