JavaScript で画像をウィンドウに合わせる
Contents
画像の表示サイズをボタンで切り替えるプログラムです。
サイズは、画像本来のサイズ(オリジナルサイズ)と、ウィンドウに合わせたサイズ(ウィンドウサイズ)の2種類です。
・オリジナルサイズ: 画像本来のサイズ
・ウィンドウサイズ: ウィンドウ内に画像全体が収まるサイズ
(注)ウィンドウサイズ
正確には、画像の横幅をウィンドウの横幅に一致させる
動作例


プログラム1
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Fit image size to window</title>
<style type="text/css"> *{ margin:0; padding:0; border:0; }</style>
<script>
var canvas;
var originalWidth;
var originalWidthFlg=false;
window.onresize = function() {
if (!originalWidthFlg) {
canvas.style.width = window.innerWidth + "px";
}
};
function originalSize() {
originalWidthFlg = true;
canvas.style.width = originalWidth + "px";
}
function windowSize() {
originalWidthFlg = false;
canvas.style.width = window.innerWidth + "px";
}
window.onload = function() {
canvas = document.getElementsByTagName("canvas")[0];
var context = canvas.getContext("2d");
//
var file = document.getElementById("selectFile");
file.onchange = function(evt) {
var fileList = evt.target.files;
var reader = new FileReader();
reader.readAsDataURL(fileList[0]);
//
reader.onload = function(evt) {
var image = new Image();
image.src=evt.target.result;
originalWidth = image.naturalWidth;
canvas.width = image.naturalWidth;
canvas.height = image.naturalHeight;
context.drawImage(image, 0, 0);
windowSize();
}
}
};
</script>
</head>
<body>
<p>
<input type="file" id="selectFile"><br>
<input type="button" value="Original size" onclick="originalSize()">
<input type="button" value="Window size" onclick="windowSize()">
</p>
<canvas></canvas>
</body>
</html>
プログラム1 の説明
グローバル変数
- canvas: canvas 要素を保存する変数
- originalWidth: 元画像の横幅
- オリジナルサイズの横幅
- originalWidthFlg:
- 表示画像をオリジナルサイズで表示: ture
- 表示画像をウィンドウサイズで表示: false
body部
<body>
<p>
<input type="file" id="selectFile"><br>
<input type="button" value="Original size" onclick="originalSize()">
<input type="button" value="Window size" onclick="windowSize()">
</p>
<canvas></canvas>
</body>
<input>要素が3 個、<canvas>要素が1 個です。
以下のボタンはクリックすると、各関数が動作します。
- [Original size]ボタン: originalSize() 関数
- [Window size]ボタン: windowSize() 関数
Canvas のstyle 変化
プログラム1 のラインマークした箇所で、Canvas のstyle を変化させています。
14 行目、25 行目
- Canvas の横幅を、ウィンドウの横幅に設定
canvas.style.width = window.innerWidth + "px";
20 行目
- Canvas の横幅を、オリジナルサイズの横幅に設定
canvas.style.width = window.originalWidth + "px";
(注)style 変化
style の変化は、「見た目」が変わるだけです。そのため、Canvas のstyle が変化しても、Canvas 上の画像データは変化しません。
画像ファイルをCanvas に描画
window.onload = function() {
canvas = document.getElementsByTagName("canvas")[0];
var context = canvas.getContext("2d");
//
var file = document.getElementById("selectFile");
file.onchange = function(evt) {
var fileList = evt.target.files;
var reader = new FileReader();
reader.readAsDataURL(fileList[0]);
//
reader.onload = function(evt) {
var image = new Image();
image.src=evt.target.result;
originalWidth = image.naturalWidth;
canvas.width = image.naturalWidth;
canvas.height = image.naturalHeight;
context.drawImage(image, 0, 0);
windowSize();
}
}
};
何段階かの処理を経て、画像ファイルをCanvas に読み込みます。
以下、各処理を簡単に説明します。
Canvas の2次元コンテキスト
canvas = document.getElementsByTagName("canvas")[0];
var context = canvas.getContext("2d");
29 行目、30 行目で、Canvas の2次元コンテキストが使えるようにします。
- Canvas 要素を、変数canvas に代入
- getContext() メソッドで、2 次元コンテキストを、変数context に代入
ダイアログでファイルを選択
var file = document.getElementById("selectFile");
file.onchange = function(evt) {
32 行目、33 行目で、ダイアログを表示し、ファイル選択を待ちます。
- [selectFile]ボタンをクリックすると、ダイアログを表示
- ファイルを選択すると、onchange イベントが発生
dataURL 形式
reader.readAsDataURL(fileList[0]);
//
reader.onload = function(evt) {
36 行目、38 行目で、画像をdataURL 形式で読み込みます。
- 画像をdataURL 形式で読込
- 読込が終了すると、onload イベントが発生
drawImage() メソッド
var image = new Image(); image.src=evt.target.result;
39 行目、40 行目で、image 要素を作成し画像を代入します。
- 新たなimage 要素を作成
- image にdataURL形式の画像を代入
context.drawImage(image, 0, 0);
44 行目で、image をCanvas に描きます。
- 2次元contextのdrawImage() を用い、image をCanvas に描画
