使用canvas将两张图片合成一张图片

608 阅读2分钟

使用 Canvas 将两张图片合成一张图片

在前端开发中,Canvas 是一个强大的工具,可以用于图形绘制和图像处理。本文将详细介绍如何使用 Canvas 将两张图片合成一张图片。以下是实现的步骤和代码示例。

1. 准备 HTML 结构

首先,创建一个简单的 HTML 页面,包含一个 Canvas 元素和两个图片元素。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Canvas 合成图片</title>
    <style>
        #canvas {
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <canvas id="canvas" width="500" height="500"></canvas>
    <img id="image1" src="image1.jpg" style="display:none;">
    <img id="image2" src="image2.png" style="display:none;">
    <script src="app.js"></script>
</body>
</html>

2. 加载图片

在 JavaScript 中,使用 Image 对象加载图片,并确保在图片加载完成后再进行合成操作。

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

const image1 = new Image();
const image2 = new Image();

image1.src = document.getElementById('image1').src;
image2.src = document.getElementById('image2').src;

let imagesLoaded = 0;

image1.onload = () => {
    imagesLoaded++;
    if (imagesLoaded === 2) {
        drawImages();
    }
};

image2.onload = () => {
    imagesLoaded++;
    if (imagesLoaded === 2) {
        drawImages();
    }
};

3. 合成图片

创建 drawImages 函数,用于将两张图片绘制到 Canvas 上。

function drawImages() {
    // 绘制第一张图片
    ctx.drawImage(image1, 0, 0, canvas.width, canvas.height);

    // 设置第二张图片的透明度
    ctx.globalAlpha = 0.5; // 50%透明度

    // 绘制第二张图片
    ctx.drawImage(image2, 50, 50, canvas.width - 100, canvas.height - 100);

    // 恢复透明度
    ctx.globalAlpha = 1.0;
}

4. 保存合成后的图片

合成完成后,可以使用 toDataURL 方法将 Canvas 转换为图片格式,并可以下载或展示。

function saveImage() {
    const link = document.createElement('a');
    link.href = canvas.toDataURL('image/png');
    link.download = '合成图片.png';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}

5. 完整代码

将以上代码整合在一起,形成完整的示例。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Canvas 合成图片</title>
    <style>
        #canvas {
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <canvas id="canvas" width="500" height="500"></canvas>
    <img id="image1" src="image1.jpg" style="display:none;">
    <img id="image2" src="image2.png" style="display:none;">
    <button id="saveButton">保存合成图片</button>
    <script>
        const canvas = document.getElementById('canvas');
        const ctx = canvas.getContext('2d');

        const image1 = new Image();
        const image2 = new Image();

        image1.src = document.getElementById('image1').src;
        image2.src = document.getElementById('image2').src;

        let imagesLoaded = 0;

        image1.onload = () => {
            imagesLoaded++;
            if (imagesLoaded === 2) {
                drawImages();
            }
        };

        image2.onload = () => {
            imagesLoaded++;
            if (imagesLoaded === 2) {
                drawImages();
            }
        };

        function drawImages() {
            ctx.drawImage(image1, 0, 0, canvas.width, canvas.height);
            ctx.globalAlpha = 0.5;
            ctx.drawImage(image2, 50, 50, canvas.width - 100, canvas.height - 100);
            ctx.globalAlpha = 1.0;
        }

        document.getElementById('saveButton').onclick = saveImage;

        function saveImage() {
            const link = document.createElement('a');
            link.href = canvas.toDataURL('image/png');
            link.download = '合成图片.png';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
    </script>
</body>
</html>

6. 注意事项

  • 确保图片的路径正确,避免因路径错误而导致图片无法加载。
  • 调整图片的透明度和位置,达到理想的合成效果。
  • 使用 toDataURL 方法时,可以指定不同的图片格式,如 image/jpegimage/png

通过上述步骤,您可以轻松地使用 Canvas 将两张图片合成一张图片,并实现保存功能。