The CanvasRenderingContext2D.drawImage() method of the Canvas 2D API provides different ways to draw an image onto the canvas.
Syntax
void ctx.drawImage(image, dx, dy); void ctx.drawImage(image, dx, dy, dWidth, dHeight); void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

Parameters
- image
- An element to draw into the context. The specification permits any canvas image source (CanvasImageSource), specifically, aCSSImageValue, anHTMLImageElement, anSVGImageElement, anHTMLVideoElement, anHTMLCanvasElement, anImageBitmap, or anOffscreenCanvas.
- dx
- The X coordinate in the destination canvas at which to place the top-left corner of the source image.
- dy
- The Y coordinate in the destination canvas at which to place the top-left corner of the source image.
- dWidth
- The width to draw the imagein the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.
- dHeight
- The height to draw the imagein the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.
- sx
- The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.
- sy
- The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.
- sWidth
- The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by sxandsyto the bottom-right corner of the image is used.
- sHeight
- The height of the sub-rectangle of the source image to draw into the destination context.
Exceptions thrown
- INDEX_SIZE_ERR
- If the canvas or source rectangle width or height is zero.
- INVALID_STATE_ERR
- The image has no image data.
- TYPE_MISMATCH_ERR
- The specified source element isn't supported.
Examples
Using the drawImage method
This is just a simple code snippet which uses the drawImage method.
HTML
<canvas id="canvas"></canvas>
<div style="display:none;">
  <img id="source" src="https://mdn.mozillademos.org/files/5397/rhino.jpg"
       width="300" height="227">
</div>
JavaScript
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var image = document.getElementById('source');
ctx.drawImage(image, 33, 71, 104, 124, 21, 20, 87, 104);
Edit the code below and see your changes update live in the canvas:
Understanding source element size
The drawImage() method uses the source element's intrinsic size in CSS pixels when drawing.
For example, if an image was loaded using the optional size parameters in the constructor you will have to use the naturalWidth and naturalHeight properties of its instance, or videoWidth and videoHeight properties if an video element and so forth, rather that element.width and element.height to properly calculate things like crop and scale regions.
HTML
<canvas id="canvas"></canvas>
JavaScript
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var image = new Image(60, 45);   // using optional size for image
image.onload = drawImageActualSize; // draw when image has loaded
// load an image of intrinsic size 300x227 in CSS pixels
image.src = 'https://mdn.mozillademos.org/files/5397/rhino.jpg';
function drawImageActualSize() {
  // use the intrinsic size of image in CSS pixels for the canvas element
  canvas.width = this.naturalWidth;
  canvas.height = this.naturalHeight;
  // will draw the image as 300x227 ignoring the custom size of 60x45
  // given in the constructor
  ctx.drawImage(this, 0, 0);
  // To use the custom size we'll have to specify the scale parameters 
  // using the element's width and height properties - lets draw one 
  // on top in the corner:
  ctx.drawImage(this, 0, 0, this.width, this.height);
}
Result
Specifications
| Specification | Status | Comment | 
|---|---|---|
| HTML Living Standard The definition of 'CanvasRenderingContext2D.drawImage' in that specification. | Living Standard | 
Browser compatibility
| Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari | 
|---|---|---|---|---|---|---|
| Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | 
| ImageBitmapas source image | (Yes) | No support | 42 (42) | ? | ? | ? | 
| SVGImageElementas source image | 59 | ? | ? | ? | ? | ? | 
| Smoothing when downscaling | (Yes) | ? | 56 (56)[1] | ? | (Yes) | ? | 
| Feature | Android Webview | Chrome for Android | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | 
|---|---|---|---|---|---|---|---|
| Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | 
| ImageBitmapas source image | (Yes) | (Yes) | No support | 42.0 (42) | ? | ? | ? | 
| SVGImageElementas source image | 59 | 59 | ? | ? | ? | ? | ? | 
| Smoothing when downscaling | (Yes) | (Yes) | ? | 56.0 (56)[1] | ? | (Yes) | ? | 
[1] See bug 1360415 for details.
Compatibility notes
- Support for flipping the image by using negative values for swandshwas added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2).
- Starting with (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2) drawImage()handles negative arguments in accordance with the specification, by flipping the rectangle around the appropriate axis.
- Specifying a nullorundefinedimage when calling ordrawImage()correctly throws aTYPE_MISMATCH_ERRexception starting with (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2).
- Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4), Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.
- Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6) now correctly supports CORS for drawing images across domains without tainting the canvas.
- Gecko 11.0 (Firefox 11.0 / Thunderbird 11.0 / SeaMonkey 2.8) now allows SVG-as-an-image to be drawn into a canvas without tainting the canvas.
Notes
- drawImage()only works correctly on an- HTMLVideoElementwhen its- HTMLMediaElement.readyStateis greater than 1 (i.e, seek event fired after setting the currentTime property)
- drawImage()will always use the source element's intrinsic size in CSS pixels when drawing, cropping and/or scaling. For example, if an image is loaded using the constructor's optional size parameters the actual intrinsic size of the bitmap in CSS pixels will still be used.
- drawImage()will ignore all EXIF metadata in images, including the Orientation. This behavior is espacially troublesome on iOS devices. You should detect the Orientation yourself and use rotate() to make it right.
See also
- The interface defining it, CanvasRenderingContext2D.
Document Tags and Contributors
    
    Tags: 
    
  
                    
                       Contributors to this page: 
        jpmedley, 
        chrisdavidmills, 
        smalllong, 
        K3N, 
        nmve, 
        arronei, 
        erikadoyle, 
        QihangSun, 
        wdgreg, 
        fscholz, 
        Kaku, 
        figure002, 
        lukasolson
                    
                    
                       Last updated by:
                      jpmedley,