Skip to content

Canvas Images

To draw an image onto the canvas, you primarily use the drawImage() method. This method can take various forms to allow for drawing, scaling, and slicing images.

The basic syntax is:

  • drawImage(image, dx, dy): Draws the image at coordinates (dx, dy).
  • drawImage(image, dx, dy, dWidth, dHeight): Draws the image at (dx, dy), scaled to dWidth and dHeight.
  • drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight): Clips the image from source coordinates (sx, sy) with dimensions (sWidth, sHeight), then draws it onto the canvas at (dx, dy), scaled to dWidth and dHeight.

Crucially, an image must be fully loaded before you can draw it on the canvas. Attempting to draw an image that hasn’t loaded will typically result in nothing being drawn or an error.

Here’s how to correctly load and draw an image:

async function drawMyImage() {
const canvas = document.getElementById('myCanvas');
if (!canvas.getContext) {
console.error('Canvas not supported!');
return;
}
const ctx = canvas.getContext('2d');
// Option 1: Using an existing <img> element
// const imgElement = document.getElementById('myImageElement');
// if (imgElement.complete) { // Check if image is already loaded (e.g. by browser cache)
// ctx.drawImage(imgElement, 10, 10);
// } else {
// imgElement.onload = () => {
// ctx.drawImage(imgElement, 10, 10, 150, 100); // Draw with scaling
// };
// imgElement.onerror = () => {
// console.error('Error loading image from <img> tag.');
// };
// }
// Option 2: Creating an Image object in JavaScript (Recommended for dynamic loading)
const img = new Image();
img.onload = () => {
// Image is loaded, now we can draw it
ctx.drawImage(img, 10, 10); // Draw at original size
// Example: Draw scaled image
// ctx.drawImage(img, 10, 120, 200, 150);
// Example: Draw a slice of the image
// ctx.drawImage(img, 0, 0, 50, 50, 10, 280, 100, 100); // (sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight)
};
img.onerror = () => {
console.error('Error loading the image via JavaScript.');
};
img.src = 'your-image.png'; // Replace with your image path. Ensure the image is accessible.
}
// Call the function, perhaps after the DOM is fully loaded
document.addEventListener('DOMContentLoaded', drawMyImage);
// HTML structure for this example:
// <canvas id="myCanvas" width="400" height="400" style="border:1px solid #000;"></canvas>
// <!-- If using Option 1, include an img tag -->
// <!-- <img id="myImageElement" src="your-image.png" alt="My Image" style="display:none;"> -->
  • We get the canvas element and its 2D rendering context.
  • We create a new Image object.
  • We set an onload event handler. This function will be called once the image has successfully loaded. All drawing operations using this image should happen inside this handler or be called from it.
  • We set an onerror event handler to catch any loading errors.
  • Finally, we set the src attribute of the Image object. This starts the image loading process.
  • Using async/await with image.decode() is an even more modern way to handle image loading if you need to ensure the image is fully decoded and ready, especially for performance-critical applications: await img.decode(); ctx.drawImage(img, 10, 10); (this would be inside an async function and typically within a try-catch block for the src assignment and decode call).

Common Pitfall: Drawing too early. If you call drawImage() before the onload event fires (or before an <img> tag’s content is loaded), the image data isn’t available yet, and nothing will be drawn.

Application Scenario: Displaying user avatars, game sprites, product images in an e-commerce site, or background images within a canvas-based application.