.scale() method of the Canvas 2D API adds a scaling transformation to the canvas units horizontally and/or vertically.
By default, one unit on the canvas is exactly one pixel. A scaling transformation modifies this behavior. For instance, a scaling factor of 0.5 results in a unit size of 0.5 pixels; shapes are thus drawn at half the normal size. Similarly, a scaling factor of 2.0 increases the unit size so that one unit becomes two pixels; shapes are thus drawn at twice the normal size.
void ctx.scale(x, y);
- Scaling factor in the horizontal direction. A negative value flips pixels across the vertical axis. A value of
1results in no horizontal scaling.
- Scaling factor in the vertical direction. A negative value flips pixels across the horizontal axis. A value of
1results in no vertical scaling.
Scaling a shape
This example draws a scaled rectangle. A non-scaled rectangle is then drawn for comparison.
The rectangle has a specified width of 8 and a height of 20. The transformation matrix scales it by 9x horizontally and by 3x vertically. Thus, its final size is a width of 72 and a height of 60.
Notice that its position on the canvas also changes. Since its specified corner is (10, 10), its rendered corner becomes (90, 30).
const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); // Scaled rectangle ctx.scale(9, 3); ctx.fillStyle = 'red'; ctx.fillRect(10, 10, 8, 20); // Reset current transformation matrix to the identity matrix ctx.setTransform(1, 0, 0, 1, 0, 0); // Non-scaled rectangle ctx.fillStyle = 'gray'; ctx.fillRect(10, 10, 8, 20);
The scaled rectangle is red, and the non-scaled rectangle is gray.
Flipping things horizontally or vertically
You can use
scale(-1, 1) to flip the context horizontally and
scale(1, -1) to flip it vertically. In this example, the words "Hello world!" are flipped horizontally.
Note that the call to
fillText() specifies a negative x coordinate. This is to adjust for the negative scaling factor:
-280 * -1 becomes
280, and text is drawn leftwards from that point.
const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); ctx.scale(-1, 1); ctx.font = '48px serif'; ctx.fillText('Hello world!', -280, 90); ctx.setTransform(1, 0, 0, 1, 0, 0);
|HTML Living Standard
The definition of 'CanvasRenderingContext2D.scale' in that specification.
|Chrome Full support Yes||Edge Full support 12||Firefox Full support 1||IE Full support Yes||Opera Full support Yes||Safari Full support Yes||WebView Android Full support Yes||Chrome Android Full support Yes||Edge Mobile Full support Yes||Firefox Android Full support 4||Opera Android Full support Yes||Safari iOS Full support Yes||Samsung Internet Android Full support Yes|
- Full support
- Full support
- The interface defining this method: