File APIでローカルから画像を選択して、取得した画像をcanvas上に表示する流れを実装してみたのでメモ。
サンプルコード
HTML
<canvas id="canvas"></canvas> <div><input type="file" name="select" id="select" /></div>
JavaScript
var canvas;
var canvasW = 480;
var canvasH = 270;
var ctx;
var select;
var localImg;
window.onload = function() {
init();
}
function init() {
select = document.getElementById('select');
canvas = document.getElementById('canvas');
// input fileがあるか確認
if(!select) {
return false;
};
// canvasがあるかどうかとcanvasに対応したブラウザかを確認
if(!canvas || !canvas.getContext) {
select.style.display = "none";
return false;
};
canvas.width = canvasW;
canvas.height = canvasH;
ctx = canvas.getContext('2d');
// File APIに対応しているか確認
if(!window.File) {
return false;
}
// ファイルが選択されたとき
select.addEventListener('change', function(e) {
// 選択されたファイルの情報を取得
var fileData = e.target.files[0];
var imgType = fileData.type;
// 選択されたファイルが画像かどうか確認
if(!imgType.match(/^image/)) {
alert('画像を選択してください');
select.value = '';
return;
}
var reader = new FileReader();
// ファイル読み取りに失敗したとき
reader.onerror = function() {
alert('ファイル読み取りに失敗しました')
}
// ファイル読み取りに成功したとき
reader.onload = function() {
localImg = reader.result;
draw();
}
// ファイル読み取りを実行
reader.readAsDataURL(fileData);
}, false);
}
function draw() {
// canvas内の要素をクリアする
ctx.clearRect(0, 0, canvasW, canvasH);
var img = new Image();
img.src = localImg;
img.onload = function() {
// 画像をcanvas内に収まるようにサイズ調整
canvasW / canvasH
this.width / this.height
if(this.width / this.height > canvasW / canvasH) {
// 幅に合わせて画像サイズ設定
var imgWidth = canvasW;
var imgHeight = Math.floor(this.height * (canvasW / this.width));
} else {
// 高さに合わせて画像サイズ設定
imgHeight = canvasH;
imgWidth = Math.floor(this.width * (canvasH / this.height));
}
ctx.drawImage(img, 0, 0, imgWidth, imgHeight);
}
}
ローカルから取得した画像をcanvas上に表示するデモページ
【参考サイト】
コメントが承認されるまで時間がかかります。