HTML5 File APIで開いた画像をキャンバスに描きたいです。
handleFiles(e)
メソッドでは、e.target.files[0]
を使用してファイルにアクセスできますが、drawImage
を使用してその画像を直接描画することはできません。 HTML5キャンバスでFile APIから画像を描画するにはどうすればよいですか?
私が使用したコードは次のとおりです。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script>
window.onload = function() {
var input = document.getElementById('input');
input.addEventListener('change', handleFiles);
}
function handleFiles(e) {
var ctx = document.getElementById('canvas').getContext('2d');
ctx.drawImage(e.target.files[0], 20,20);
alert('the image is drawn');
}
</script>
</head>
<body>
<h1>Test</h1>
<input type="file" id="input"/>
<canvas width="400" height="300" id="canvas"/>
</body>
</html>
イメージではないFile
インスタンスがあります。
File
の内容を取得するには、FileReader
を使用します。次に、内容をImage
インスタンスに渡します。これは、キャンバスに描画できます: http://jsfiddle.net/t7mv6/ 。
画像を取得するには、new Image()
を使用します。 src
は、選択したFile
を参照するURLである必要があります。 _URL.createObjectURL
_を使用して、Blob
を参照するURLを取得できます(File
はBlob
でもあります): http:// jsfiddle。 net/t7mv6/86 / 。
_var ctx = document.getElementById('canvas').getContext('2d');
var img = new Image;
img.onload = function() {
ctx.drawImage(img, 20,20);
alert('the image is drawn');
}
img.src = URL.createObjectURL(e.target.files[0]);
_
注:作業が完了したら、必ずオブジェクトのURLを無効にしてください。そうしないと、メモリリークが発生します。あまりにもクレイジーなことをしていない場合は、_img.onload
_関数にURL.revokeObjectURL(img.src)
を貼り付けることができます。
参照:
function handleFiles(e) {
var ctx = document.getElementById('canvas').getContext('2d');
var url = URL.createObjectURL(e.target.files[0]);
var img = new Image();
img.onload = function() {
ctx.drawImage(img, 20, 20);
}
img.src = url;
}
window.URL.createObjectUrl
docs
代わりにFileReader
を使用してオブジェクトURLを作成することもできます。
FileReader
は、ブラウザのサポートがわずかに優れています。
FileReader
アプローチはFF6/Chromeで機能します。ただし、Img.src
をBlob
に設定することが有効であり、クロスブラウザであるかどうかはわかりません。
オブジェクトURLを作成するのが正しい方法です。
編集:
コメントwindow.URL
で述べたように、オフラインでのサポートはFF6/Chromeでは利用できないようです。
これは 完全な例(フィドル)FileReader
を使用したものです(Raynosが述べたように、ブラウザのサポートが向上しています)。この例では、画像に合わせてCanvasも拡大縮小します。
実際の例では、フォームが爆発しないように画像を最大に拡大するかもしれません;-)。 スケーリング(フィドル)の例 です。