選択した画像ファイルのBase64/DataURLをJavascriptで取得しようとしています。ユーザーは基本的にファイル入力コントロールを介して画像を選択し、データURLが生成されます。ただし、次のエラーが発生します。
Uncaught TypeError: 'CanvasRenderingContext2D'で 'drawImage'の実行に失敗しました:指定された値はタイプ '(HTMLImageElementまたはHTMLVideoElementまたはHTMLCanvasElementまたはImageBitmap)'ではありません
HTML:
<body>
<form id="form1">
<div>
<input type="file" id="imageinput" onchange="testit(event)" />
<canvas width="300" height="300" id="mycanvas" style="display: none;"></canvas>
</div>
</form>
</body>
Javascript:
function testit(event) {
var myImage = URL.createObjectURL(event.target.files[0]);
var myCanvas = document.getElementById('mycanvas');
var ctx = myCanvas.getContext('2d');
ctx.drawImage(myImage, 0, 0);
var mydataURL = myCanvas.toDataURL('image/jpg');
alert(mydataURL);
}
なぜこのコードが機能しないのですか?
URLからキャンバスに直接画像を描画することはできません。そのためには、画像要素/オブジェクトを作成する必要があります。
_var myCanvas = document.getElementById('mycanvas');
var ctx = myCanvas.getContext('2d');
var img = new Image();
img.onload = function(){
ctx.drawImage(img, 0, 0);
alert(myCanvas.toDataURL('image/jpeg'));
};
img.src = URL.createObjectURL(event.target.files[0]);
_
ここでは、image
オブジェクトを作成し、src
をユーザーが選択した画像のURLに設定しました。画像が読み込まれた後、キャンバスに追加します。
編集:
ここにもう1つの問題があります。画像のサイズが何であれ、キャンバスの幅と高さが静的であるため、常に画像の300x300のトリミングされたdataurlを取得します。したがって、画像が読み込まれた後、キャンバスの幅と高さを動的に設定できます。 console.log()
の代わりにalert()
を使用できるため、ブラウザ自体でコンソールから画像を開いて表示できます。
_myCanvas.width = img.width;
myCanvas.height = img.height;
_
最終的なコードは次のとおりです。
_var myCanvas = document.getElementById('mycanvas');
var ctx = myCanvas.getContext('2d');
var img = new Image();
img.onload = function(){
myCanvas.width = img.width;
myCanvas.height = img.height;
ctx.drawImage(img, 0, 0);
console.log(myCanvas.toDataURL('image/jpeg'));
};
img.src = URL.createObjectURL(event.target.files[0]);
_
これがフィドルです(画像全体と幅と高さの変化をキャンバスで確認できるように、キャンバスを表示しました):
更新:
@Kaiidoが述べたように、「image/jpg」はmimetypeではないため、PNG画像が生成されます。 「image/jpeg」は、JPG画像とJPEG画像の両方のmimetypeです。
更新されたフィドル:
キャンバスにオブジェクトURLを描画しようとしています。最初にメモリに画像を作成する必要があります
http://jsfiddle.net/zmtu6t6c/4/
var myImageUrl = URL.createObjectURL(event.target.files[0]);
var myImage = new Image();
myImage.src = myImageUrl;
myImage.onload = function(){
... then do the canvas stuff
}