Let's add some code to the start()
method of our application to check if the File API is available. You can determine if a browser supports the File API by checking if the File
and FileReader
objects exist:
this.start = function() { // code not shown... if (window.File && window.FileReader) { $("#load-menu input[type=file]").change(function(e) { onLoadFile($(this)); }); } else { loadImage("images/default.jpg"); } }
First we check if the File
and FileReader
objects are available in the window
object. If so, we hook up a change event handler for the file input control to call the onLoadFile()
method passing in the <input>
element wrapped in a jQuery object. If the File API is not available we will just load a default image by calling loadImage()
, which we will write later.
Let's implement the onLoadFile()
event handler method:
function onLoadFile($input) { var file = $input[0].files[0]; if (file.type.match("image.*")) { var reader = new FileReader(); reader.onload = function() { loadImage(reader.result); }; reader.readAsDataURL(file); } else { alert("Not a valid image type: " + file.type); setStatus("Error loading image!"); } }
Here we get the file that was selected by looking at the file input's files
array and taking the first one. Next we check the file type, which is a MIME type, to make sure it is an image. We are using the String
object's regular expression match()
method to check that it starts with "image"
.
If it is an image, we create a new instance of the FileReader
object. Then we set the onload
event handler to call the loadImage()
method, passing in the FileReader
object's result
field, which contains the file's contents. Lastly, we call the FileReader
object's readAsDataURL()
method, passing in the File
object to start loading the file asynchronously.
If it isn't an image file, we show an alert dialog box with an error message and show an error message in the footer by calling setStatus()
.
Once the file has been read, the loadImage()
method will be called. Here we will use the data URL we got from the FileReader
object's result
field to draw the image into the canvas:
function loadImage(url) { setStatus("Loading image"); $img.attr("src", url); $img[0].onload = function() { // Here "this" is the image canvas.width = this.width; canvas.height = this.height; context.drawImage(this, 0, 0); setStatus("Choose an effect"); } $img[0].onerror = function() { setStatus("Error loading image!"); } }
First we set the src
attribute for the image element to the data URL we got after the file was loaded. This will cause the image element to load that new image.
Next we define the onload
event handler for the image, so that we are notified when the image is loaded. Note that when we are inside the onload
event handler, this
points to the <image>
element. First we change the canvas' width and height to the image's width and height. Then we draw the image on the canvas using the context's drawImage()
method. It takes the image to draw and the x and y coordinates of where to draw it. In this case we draw it at the top-left corner of the canvas (0, 0).
Lastly, we set an onerror
event handler for the image. If an error occurs loading the image, we show an error message in the footer.
3.144.86.134