ZetCode

JavaScript Canvas 缩放教程

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 JavaScript 中的 Canvas 缩放变换。缩放允许您按比例或不成比例地调整绘图的大小。理解缩放对于创建响应式图形至关重要。

基本定义

Canvas 缩放通过乘以其尺寸来修改后续绘图的大小。scale(x, y) 方法接受两个参数,分别用于水平和垂直缩放因子。

缩放会影响调用它之后的​​所有绘图操作。大于 1 的值会放大,而介于 0 和 1 之间的值会缩小绘图。负值会翻转并缩放内容。

基本缩放

本示例演示了如何在 Canvas 上缩放简单的矩形。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic Canvas Scaling</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Original rectangle
    ctx.fillStyle = 'blue';
    ctx.fillRect(50, 50, 50, 50);
    
    // Scaled rectangle
    ctx.fillStyle = 'red';
    ctx.scale(2, 1.5);
    ctx.fillRect(50, 50, 50, 50);
</script>

</body>
</html>

此示例绘制了两个矩形——一个蓝色(原始)和一个红色(缩放)。scale(2, 1.5) 使红色矩形的宽度是原始矩形的 2 倍,高度是原始矩形的 1.5 倍。

请注意,缩放会同时影响绘图的大小和位置。红色矩形之所以显得更大并发生偏移,是因为缩放适用于坐标。

从中心缩放

本示例展示了如何在保持对象居中的同时对其进行缩放。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Centered Scaling</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    const centerX = canvas.width / 2;
    const centerY = canvas.height / 2;
    const size = 50;
    
    // Original square
    ctx.fillStyle = 'rgba(0, 0, 255, 0.5)';
    ctx.fillRect(centerX - size/2, centerY - size/2, size, size);
    
    // Scaled square
    ctx.fillStyle = 'rgba(255, 0, 0, 0.5)';
    ctx.translate(centerX, centerY);
    ctx.scale(1.8, 1.8);
    ctx.translate(-centerX, -centerY);
    ctx.fillRect(centerX - size/2, centerY - size/2, size, size);
</script>

</body>
</html>

要从中心进行缩放,我们首先平移到中心点,应用缩放,然后平移回来。此技术可保持对象的中心位置。

蓝色正方形是原始的,而红色正方形在两个方向上都被放大了 1.8 倍。半透明的颜色显示了缩放如何影响形状。

非对称缩放

本示例演示了宽度和高度的不同缩放因子。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Asymmetric Scaling</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Original circle
    ctx.beginPath();
    ctx.arc(75, 100, 30, 0, Math.PI * 2);
    ctx.fillStyle = 'blue';
    ctx.fill();
    
    // Scaled ellipse
    ctx.scale(2, 0.5);
    ctx.beginPath();
    ctx.arc(75, 100, 30, 0, Math.PI * 2);
    ctx.fillStyle = 'red';
    ctx.fill();
</script>

</body>
</html>

在这里,我们使用不同的 x 和 y 缩放因子将圆形缩放成椭圆形。scale(2, 0.5) 使其宽度变为两倍,但高度减半。

蓝色圆是原始的,而红色椭圆显示了缩放后的结果。这演示了如何在 Canvas 上创建非均匀缩放效果。

缩放文本

本示例展示了缩放如何影响 Canvas 上的文本渲染。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Scaling Text</title>
</head>
<body>

<canvas id="myCanvas" width="400" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Original text
    ctx.font = '20px Arial';
    ctx.fillText('Original Text', 50, 50);
    
    // Uniformly scaled text
    ctx.scale(1.5, 1.5);
    ctx.fillText('Scaled 1.5x', 50, 100);
    
    // Reset transform
    ctx.setTransform(1, 0, 0, 1, 0, 0);
    
    // Distorted text
    ctx.scale(1.8, 0.7);
    ctx.fillText('Distorted', 50, 150);
</script>

</body>
</html>

此示例显示了三种文本变体:原始文本、均匀缩放文本和变形文本。缩放会影响包括文本在内的所有 Canvas 绘图操作。

请注意使用 setTransform 在操作之间重置缩放。变形的文本展示了非对称缩放如何创建独特的排版。

多次缩放操作

本示例演示了多次操作的累积缩放效果。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Multiple Scaling</title>
</head>
<body>

<canvas id="myCanvas" width="400" height="300"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Base rectangle
    ctx.fillStyle = 'blue';
    ctx.fillRect(50, 50, 50, 50);
    
    // First scaling
    ctx.fillStyle = 'red';
    ctx.scale(1.5, 1.5);
    ctx.fillRect(50, 50, 50, 50);
    
    // Second scaling (cumulative)
    ctx.fillStyle = 'green';
    ctx.scale(0.8, 1.2);
    ctx.fillRect(50, 50, 50, 50);
</script>

</body>
</html>

此示例显示了缩放操作如何累积。每次调用 scale 都会与之前的变换相乘,而不是替换它们。

蓝色矩形是原始的,红色矩形缩放了 1.5 倍,绿色矩形进行了额外的缩放。最终的缩放因子对于宽度为 1.5 × 0.8 = 1.2,对于高度为 1.5 × 1.2 = 1.8。

来源

MDN Canvas 缩放文档

在本文中,我们探讨了在 HTML Canvas 上缩放绘图的各种技术。掌握缩放变换对于在 Web 应用程序中创建灵活且响应迅速的图形至关重要。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 JS Canvas 教程