How can I draw an image from the HTML5 File API on Canvas?
You have a File
instance which is not an image.
To get an image, use new Image()
. The src
needs to be an URL referencing to the selected File
. You can use URL.createObjectURL
to get an URL referencing to a Blob
(a File
is also a 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]);
Note: be sure to revoke the object url when you are done with it otherwise you'll leak memory. If you're not doing anything too crazy, you can just stick a URL.revokeObjectURL(img.src)
in the img.onload
function.
References:
- https://developer.mozilla.org/en/DOM/File
- http://html5demos.com/file-api
Live Example
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
You could also use the FileReader
instead to create the object URL.
The FileReader
has slightly better browser support.
The FileReader
approach works in FF6 / Chrome. I'm not certain whether setting Img.src
to a Blob
is valid and cross-browser though.
Creating object urls is the correct way to do it.
Edit:
As mentioned in the commment window.URL
support whilst offline seems unavailable in FF6/Chrome.