canvas合成图片

98 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

最近有小伙伴问我分享携带二维码 还有涂鸦生成图片 撤回与反撤回的功能 趁着周末回顾一下canvas 许久不写这些东西 快忘完了

项目功能较复杂 先自己写下demo 看下api

demo效果

image.png

多张合成 ( 这个图是在csdn盗的 )

image.png

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #cvs {
            background: url('https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbkimg.cdn.bcebos.com%2Fpic%2Faa18972bd40735fae6cd9f147b0018b30f2442a7a246&refer=http%3A%2F%2Fbkimg.cdn.bcebos.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1668299858&t=758d3c5077a4f1700ec682a2091a237e') no-repeat;
            background-size: 100% 100%;
        }
    </style>
</head>

<body>
    <canvas id="cvs" height="300" width="500"></canvas>
    <div>
        <button id="submit">保存</button>
    </div>
    <br>
    <br>
    <hr>
    <div id="imgBox">
        <h3>生成的图片</h3>
        <img id="myImg" src="" alt="">
    </div>
    <script>
        const bgImg = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbkimg.cdn.bcebos.com%2Fpic%2Faa18972bd40735fae6cd9f147b0018b30f2442a7a246&refer=http%3A%2F%2Fbkimg.cdn.bcebos.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1668299858&t=758d3c5077a4f1700ec682a2091a237e'
        const canvas = document.getElementById('cvs')
        const ctx = canvas.getContext('2d')

        ctx.fillStyle = "#f3f3f3";
        ctx.fillRect(0, 0, canvas.width, canvas.height)
        ctx.font = '40px Arial'
        ctx.fillStyle = '#000'
        ctx.textAlign = 'center'
        ctx.fillText("刮开有惊喜", canvas.width / 2, canvas.height / 2)
        ctx.globalCompositeOperation = 'destination-out'

        let draw = false;
        canvas.addEventListener('mousedown', e => {
            draw = true
            drawHandler(e)
        })

        canvas.addEventListener('mousemove', e => {
            if (!draw) return;
            drawHandler(e)
        })

        canvas.addEventListener('mouseup', e => {
            draw = false;
        })

        function drawHandler(e) {
            ctx.beginPath()
            ctx.arc(
                e.pageX - canvas.offsetLeft,
                e.pageY - canvas.offsetTop,
                10,
                0,
                Math.PI * 2
            )
            ctx.stroke()
            ctx.fill()
            ctx.closePath()
        }

        const submit = document.getElementById('submit')
        const imgBox = document.getElementById('imgBox')
        submit.addEventListener('click', e => {
            var base64 = canvas.toDataURL("image/png");
            drawAndShareImage(bgImg,base64,500,300)

            //下载
            // const a = document.createElement('a')
            // a.download = 'canvas'
            // a.href = base64;
            // document.body.appendChild(a)
            // a.click()
            // document.body.removeChild(a)
        })

        function drawAndShareImage(bg,img,w,h) {
            var canvas = document.createElement("canvas");
            canvas.width = w;
            canvas.height = h;
            var context = canvas.getContext("2d");

            context.rect(0, 0, canvas.width, canvas.height);
            var myImage = new Image();
            myImage.src = bg;
            myImage.crossOrigin = 'Anonymous';

            myImage.onload = () => {
                context.drawImage(myImage, 0, 0, w, h);
                var myImage2 = new Image();
                myImage2.src = img;
                // 跨域
                myImage2.crossOrigin = 'Anonymous';

                myImage2.onload = () => {
                    // 设置填充的颜色
                    // context.fillStyle = "white";
                    // 绘制填充的矩形
                    // context.fillRect(250, 250, 210, 210);
                    context.drawImage(myImage2, 0,0, 500, 300);
                    var base64 = canvas.toDataURL("image/png");
                    // 获取图片容器
                    var myImg = document.getElementById('myImg');
                    myImg.src = base64;
                }
            }
        }

        // 多张图片合并
        // function drawAndShareImage(imgSrc1, arr) {
        //     console.log(imgSrc1,arr)
        //     //imgSrc1 背景图片(二维码)链接
        //     //arr 合成的小图片的数组[链接1,链接2.....]
        //     var canvas = document.createElement("canvas");
        //     canvas.width = 500;
        //     canvas.height = 300;
        //     var context = canvas.getContext("2d");
        //     context.rect(0, 0, canvas.width, canvas.height);
        //     context.fillStyle = "#fff";
        //     context.fill();
        //     var myImage = new Image();
        //     myImage.src = imgSrc1; //背景图片  你自己本地的图片或者在线图片
        //     myImage.crossOrigin = 'Anonymous';
        //     myImage.onload = () => {
        //         context.drawImage(myImage, 0, 0, 700, 700);
        //         // 示例:如果合成图片的位置有规律,就可以 循环传入的数组
        //         // 如果想要自由的合成图片,那就需要 重复的进行新建,逐个调整位置
        //         arr.forEach((item, index) => {
        //             let myImage2 = new Image();
        //             myImage2.src = item; //你自己本地的图片或者在线图片
        //             myImage2.crossOrigin = 'Anonymous';
        //             myImage2.onload = () => {
        //                 // 设置填充的颜色
        //                 context.fillStyle = "white";

        //                 // 区分每一个图片的位置
        //                 let left = 0
        //                 let top = 0
        //                 if (index % 2 == 0) {
        //                     left = 0
        //                     top = 150 * Math.floor(index / 2)
        //                 } else {
        //                     left = 200
        //                     top = 150 * Math.floor(index / 2)
        //                 }
        //                 // 绘制填充的矩形
        //                 context.fillRect(150 + left, 150 + top, 110, 110);
        //                 // 绘制图片
        //                 context.drawImage(myImage2, 160 + left, 160 + top, 90, 90);
        //                 var base64 = canvas.toDataURL("image/png");
        //                 return base64;
        //             }
        //         })
        //     }
        // }

    </script>
</body>

</html>