1. Matthew Wilcoxson
  2. CanvasZoom




Zooming of very large images with the Javascript, html5 and the canvas element. (Similar in functionality to Zoomify, OpenZoom or DeepZoom). This uses the open source MIT license, use it as you see fit (but an attribution would be appreciated!).

It should work on Opera, Firefox, Chrome, Safari and IE9; and any other browser which supports the HTML5 2D canvas.


You may have seen the program Zoomify, or similar programs like, OpenZoom and DeepZoom, which quickly display large resolution images on websites without large amounts of data being downloaded – only the part which is needed is downloaded. Most of these applications use some kind of plug-in to work (e.g. Flash or Silverlight), so I wanted to see if we could create one without any plug-in, using only the HTML5 standards.

You can zoom with the mouse by either the scroll wheel - scroll forward to zoom in, backward to zoom out - or by clicking the select button to zoom in. You can also add buttons outside of the canvas to zoom in with.


The back end part of the system consists of several folders full of images of different resolution. The images are most easily generated by the DeepZoom Composer program created by Microsoft (here). The DeepZoom Composer program currently only works on windows but once you've download it you can create your own zoom images, very quickly.

  1. Once you have DeepZoom composer installed create a project (on the local machine, network positions don't seem to work) then choose an appropriate image and import it with "Add Image". Now go to Export and select Custom. Change output type to "Images", give it a name, select "Export as a collection", ensure "Enable Smooth Streaming Support" is off, Format JPEG, and set the quality to whatever you like (high recommended). Click Export.

    Once it's finished open the folder you saved to. Open the subfolder "dzc_output_images", the subfolder ending in "_files" is the one you need to copy to your web server. (If you have a look in the folder you can see you images cut up into smaller sections at different zoom levels).

  2. Add the JavaScript to your webpage, (you'll also need to include the imageloader.js file from here )

    <script type="text/javascript" src="imageloader.js"></script> <script type="text/javascript" src="canvaszoom.js"></script>

  3. Now add a canvas and then call the CanvasZoom class to do it's stuff with a little Javascript:

<pre> &lt;canvas id="galaxyCanvas" width="800" height="400">&lt;/canvas> &lt;script type="text/javascript"> var galaxy = new CanvasZoom( { 'canvas': document.getElementById('galaxyCanvas'), 'tilesFolder': "Galaxy/tiles/", 'imgeWidth': 6637, 'imageHeight': 3787, 'drawBorder' : false, 'defaultZoom' : 8, 'minZoom' : 5, 'maxZoom' : 8 } ); &lt;/script> </pre>

Call the CanvasZoom class with your desired settings:

  • 'canvas' : Compulsory. The canvas you want to use. (Best results are achieved when the canvas has a similar aspect ratio to the original image)
  • 'tilesFolder' : Compulsory. The folder where the images are stored.
  • 'imageWidth' : Compulsory. The width of the original image.
  • 'imageHeight' : Compulsory. The height of the original image.
  • 'drawBorder' : Optional. Draw a border around the canvas, default is true,

  • 'defaultZoom' : Optional. The zoom to start with, default is to show complete image zoom,

  • 'minZoom' : Optional. Minimum zoom level, default 0,
  • 'maxZoom' : Optional. Maximum zoom level, default max possible

  • 'tilesSystem' : Optional. Specifies whether Zoomify or DeepZoom image system. DeepZoom is default.

  • 'tileOverlap' : Optional. Overlap of image painting tiles. Default 1 pixel.
  • 'tileSize' : Optional. Specifies the size of each tile. 256 pixels default.
  • 'fileType' : Optional. File extension of tiles. Default is "jpg".
  1. If you'd like to add some controls to zoom in and out you can call the class functions "zoomInCentre()" and "zoomOutCentre()". Adapting the above code it would look like this: <input type="button" value="Zoom in" onclick="galaxy.zoomInCentre()"/> <input type="button" value="Zoom out" onclick="galaxy.zoomOutCentre()"/>