The CanvasRenderingContext2D.drawImage()
method of the Canvas 2D API provides different ways to draw an image onto the canvas.
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);
image
CanvasImageSource
), specifically, a CSSImageValue
, an HTMLImageElement
, an SVGImageElement
, an HTMLVideoElement
, an HTMLCanvasElement
, an ImageBitmap
, or an OffscreenCanvas
.sx
Optional
image
to draw into the destination context.sy
Optional
image
to draw into the destination context.sWidth
Optional
image
to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by sx
and sy
to the bottom-right corner of the image is used.sHeight
Optional
image
to draw into the destination context.dx
image
.dy
image
.dWidth
Optional
image
in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.dHeight
Optional
image
in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.INDEX_SIZE_ERR
INVALID_STATE_ERR
TYPE_MISMATCH_ERR
NS_ERROR_NOT_AVAILABLE
.complete === true
and .onload
to determine when it is ready.This example draws an image to the canvas using the drawImage()
method.
<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>
The source image is taken from the coordinates (33, 71), with a width of 104 and a height of 124. It is drawn to the canvas at (21, 20), where it is given a width of 87 and a height of 104.
const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); const image = document.getElementById('source'); ctx.drawImage(image, 33, 71, 104, 124, 21, 20, 87, 104);
The drawImage()
method uses the source element's intrinsic size in CSS pixels when drawing.
For example, if you load an Image
and specify the optional size parameters in its constructor, you will have to use the naturalWidth
and naturalHeight
properties of the created instance to properly calculate things like crop and scale regions, rather than element.width
and element.height
. The same goes for videoWidth
and videoHeight
if the element is a <video>
element, and so on.
<canvas id="canvas"></canvas>
const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); const 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); }
Specification | Status | Comment |
---|---|---|
HTML Living Standard The definition of 'CanvasRenderingContext2D: drawImage' in that specification. | Living Standard |
Desktop | ||||||
---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | |
Basic support | Yes | 12 | Yes | Yes | Yes | Yes |
ImageBitmap as source image | Yes | No | 42 | ? | ? | ? |
SVGImageElement as source image | 59 | ? | 56 | ? | ? | ? |
Smoothing when downscaling | Yes | ? | 56
|
? | Yes | ? |
Mobile | |||||||
---|---|---|---|---|---|---|---|
Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | iOS Safari | Samsung Internet | |
Basic support | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
ImageBitmap as source image | Yes | Yes | No | 42 | ? | ? | Yes |
SVGImageElement as source image | 59 | 59 | ? | 56 | ? | ? | 7.0 |
Smoothing when downscaling | Yes | Yes | ? | 56
|
Yes | ? | Yes |
sw
and sh
was added in Gecko 5.0 (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.null
or undefined
image when calling or drawImage()
correctly throws a TYPE_MISMATCH_ERR
exception starting with (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2).drawImage()
only works correctly on an HTMLVideoElement
when its HTMLMediaElement.readyState
is 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.drawImage()
will ignore all EXIF metadata in images, including the Orientation. This behavior is especially troublesome on iOS devices. You should detect the Orientation yourself and use rotate()
to make it right.CanvasRenderingContext2D
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage