合并两张图片时,利用 HTML5 中的 Canvas 技术进行操作。这种方法涉及创建一个画布(Canvas),将两张图片叠加在一起。

首先,你需要创建一个画布,然后在画布上绘制第一张图片。接着,在第一张图的基础上指定位置绘制第二张图片。这样就形成了三层结构:底层是画布,中间层是第一张图片,上层是第二张图片。确保第二张图片尺寸小于第一张图片,这样它不会完全遮盖中间层的图。

素材图片

5f1169560001353b01480147.png

5f11695600011ba904060641.png

html代码

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>合成海报-demo</title>
</head>
<body>
<div>
    <img id="qrcode" src="./img/qrcode.png" alt="二维码">
    <img id="poster" src="./img/poster.png" alt="海报模板">
    <img id="qrPoster" alt="合成海报">
</div>
<button onclick="drawPosterImage()">合成海报</button>
</body>
</html>
<script>
    const qrcodeHTML = document.getElementById('qrcode');
    const posterHTML = document.getElementById('poster');

    /**
     * 获取图片
     * @param imageHTML{HTMLElement} 对应的图片Html
     * @return {Promise<unknown>}
     */
    function readImage(imageHTML) {
        return new Promise(resolve => {
            const Image = new Image();
            Image.src = imageHTML.getAttribute('src');
            Image.crossOrigin = 'Anonymous';
            Image.onload = function () {
                resolve(Image);
            };
        });
    }

    const drawPosterImage = async function () {
        const canvas = document.createElement('canvas');
        // 海报模板的宽高
        const posterW = canvas.width = posterHTML.offsetWidth;
        const posterH = canvas.height = posterHTML.offsetHeight;
        posterHTML.clientHeight

        // 获取了一个 2D 渲染上下文,用于在 canvas 元素上进行绘图操作。
        const context = canvas.getContext('2d');
        // 使用 rect() 方法绘制一个矩形
        context.rect(0, 0, canvas.width, canvas.height);
        // 设置了矩形的填充颜色为白色
        context.fillStyle = '#fff';
        // 使用fill()方法填充矩形,将矩形以指定的颜色进行填充
        context.fill();

        // 获取#poster图片
        const image2 = await readImage(posterHTML);
        context.drawImage(image2, 0, 0, posterW, posterH);
        // 获取#qrcode图片
        const image1 = await readImage(qrcodeHTML);
        context.drawImage(image1, 162, 481, 80, 80); // qrcode定位,根据需求修改

        // 获取canvas base64的图片流
        const base64 = canvas.toDataURL('image/png');
        document.getElementById('qrPoster').setAttribute('src', base64);
    };
</script>

效果图

Snipaste_2023-12-06_15-44-51.png


逆风微笑的代码狗
30 声望1 粉丝