Chart.jsで作成したグラフを画像に変換する方法

IT関連

以前に紹介した、ブラウザ上で簡単にグラフが作れるjQueryプラグインの「Chart.js」ですが、今回はそのChart.jsで作成したグラフを画像にする方法を紹介します。

前回の記事はコチラ

簡単にグラフを作れるのはいいものの、そのグラフをダウンロードして保存したいという場面もあると思います。

Chart.jsで作成したグラフを画像で保存する方法

まずは前回のおさらいですが、下記のコードでグラフを作成します。

<html>
	<head>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
	<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.4/dist/Chart.min.js"></script>
	</head>
	<script>
		$(document).ready(function(){
			var ctx = $("#myChart");
			var myChart = new Chart(ctx, {
				type: 'line',
				data: {
					labels: ['4月', '5月', '6月'],
					datasets: [{
						label: 'Male',
						data: [8, 5, 3],
						backgroundColor: "rgba(65,105,225,0.4)"
						}, {
						label: 'Female',
						data: [2, 10, 8],
						backgroundColor: "rgba(255,105,180,0.4)"
					}]
				}
			});
		});
	</script>
	<body>
    	<canvas id="myChart"></canvas>
	</body>
</html>

ボタンをクリックしたときに画像に変換する方法

まずは、新しくボタンを作成し、そのボタンをクリックした時にグラフを画像に変換する方法です。

まずは、表示用の空のimgタグと、ボタンを用意します。

        <input type="button" id="btnToPicture" value="画像変換" />
        <img id="imgBase64" />

次に、ボタンを押したときにグラフを画像に変換してimgタグに表示する処理を記載します。

画像はBase64形式に変換しますが、主に二通の方法があります。

方法①

canvas要素のtoDataURLを使用する方法です。

var ctx = $("#myChart")[0];
$("#imgBase64").attr("src", ctx.toDataURL("image/png"));

ポイントとしては、jQueryオブジェクトからDOMオブジェクトへの変換のために[0]という添え字を使用している点です。

一行目でjQueryを使わない場合は下記の通りとなります。

var ctx = document.getElementById("myChart");
$("#imgBase64").attr("src", ctx.toDataURL("image/png"));

方法②

canvas要素の toBase64Image を使用する方法です。

var image = $("#myChart").toBase64Image();
$("#imgBase64").attr("src", image);

全体のコードは下記の通りです。

<html>
	<head>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
	<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.4/dist/Chart.min.js"></script>
	</head>
	<script>
		$(document).ready(function(){
			var ctx = $("#myChart");
			var myChart = new Chart(ctx, {
				type: 'line',
				data: {
					labels: ['4月', '5月', '6月'],
					datasets: [{
						label: 'Male',
						data: [8, 5, 3],
						backgroundColor: "rgba(65,105,225,0.4)"
						}, {
						label: 'Female',
						data: [2, 10, 8],
						backgroundColor: "rgba(255,105,180,0.4)"
					}]
				}
			});


            $("#btnToPicture").click(function(){
                var ctx = $("#myChart")[0];
                $("#imgBase64").attr("src", ctx.toDataURL("image/png"));
            });

            $("#btnToPicture2").click(function(){
                var image = $("#myChart").toBase64Image();
                $("#imgBase64").attr("src", image);
            });

		});
	</script>
	<body>
        <canvas id="myChart"></canvas>
        <input type="button" id="btnToPicture" value="画像変換 toDataURLを使用" />
        <input type="button" id="btnToPicture2" value="画像変換 toBase64Imageを使用" />
        <img id="imgBase64" />
	</body>
</html>

初期表示時に画像に変換する方法

初期表示時に表示する場合は、グラフの描画が終わってから画像に変換しないといけません。

グラフ描画の処理に下記を追加します。

options: {
	animation: {
		onComplete: function(animation){
			var ctx = $("#myChart")[0];
			$("#imgBase64").attr("src", ctx.toDataURL("image/png"));
		}
	}
}

オプションでanimationを指定し、onComplete内にグラフの描画が終わった後の処理を書きます。onCompleteの中は、ボタンクリックで画像を出力した時と同じです。

全体では下記の通りとなります。

<html>
	<head>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
	<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.4/dist/Chart.min.js"></script>
	</head>
	<script>
		$(document).ready(function(){
			var ctx = $("#myChart");
			var myChart = new Chart(ctx, {
				type: 'line',
				data: {
					labels: ['4月', '5月', '6月'],
					datasets: [{
						label: 'Male',
						data: [8, 5, 3],
						backgroundColor: "rgba(65,105,225,0.4)"
						}, {
						label: 'Female',
						data: [2, 10, 8],
						backgroundColor: "rgba(255,105,180,0.4)"
					}]
				},
				options: {
    				animation: {
						onComplete: function(animation){
							var ctx = $("#myChart")[0];
                			$("#imgBase64").attr("src", ctx.toDataURL("image/png"));
						}
					}
				}
			});


            $("#btnToPicture").click(function(){
                var ctx = $("#myChart")[0];
                $("#imgBase64").attr("src", ctx.toDataURL("image/png"));
            });

            $("#btnToPicture2").click(function(){
                var image = $("#myChart").toBase64Image();
                $("#imgBase64").attr("src", image);
            });

		});
	</script>
	<body>
        <canvas id="myChart"></canvas>
        <img id="imgBase64" />
	</body>
</html>

コメント

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