前端canvas合并图片两种实现方式

---恢复内容开始---

需求:

  有一个固定的背景图,还有一个是随机生成的二维码,合并成一张图,让用户下载。

  实现一:纯手写,这里为了省事生成图片我直接给的base64,其实使用qrcode.js生成的也是base64图片;

  body:

<div align="center" id="imgArr" style="display: none;">
    <!--<img src="./img/msg.jpg" width="300">-->
    <img src="https://img-blog.csdnimg.cn/2022010710354646756.jpeg" width="300">
    <img src="./img/qrcode.jpg" width="300">
</div>
<div id="imgBox" align="center">
    <input type="button" value="一键合成" οnclick="hecheng()">
</div>

  js:

function hecheng(){
        draw(function(){
            document.getElementById('imgBox').innerHTML='<img src="'+base64[0]+'">';
        })
    }
    var data=[],base64=[],imgArr=$('#imgArr').find('img');
    for(var i=0;i<imgArr.length;i++){
        data.push(imgArr[i].src);
    }
    function draw(fn){
        var c=document.createElement('canvas'),
                ctx=c.getContext('2d'),
                len=data.length;
        c.width=300;
        c.height=750;
        ctx.rect(0,0,c.width,c.height);
        ctx.fillStyle='#fff';
        ctx.fill();
        function drawing(n){
            if(n<len){
                var img=new Image;
//img.crossOrigin = 'Anonymous'; //解决跨域
                img.src=data[n];
                img.οnlοad=function(){
                    if(n==1){
                        ctx.drawImage(img,50,500,160,160);
                    }
                    else{
                        //ctx.drawImage(img,0,0,250,250);
                        ctx.drawImage(img,0,0,c.width,c.height);
                    }
                    drawing(n+1);//递归
                }
            }else{
//保存生成作品图片
                base64.push(c.toDataURL("image/jpeg",2.8));
//alert(JSON.stringify(base64));
                fn();
            }
        }
        drawing(0);
    }

  

测试结果:在手机里谷歌浏览器和苹果浏览器都可以,uc不行。

  实现二:基于jquery.qrcode.js和html2canva.js,一个是用来生成二维码,一个是将网页元素变成图片。

  源码:链接: https://pan.baidu.com/s/1c1SUiuW 密码: 5iei

---恢复内容结束---

转载于:https://www.cnblogs.com/webSong/p/8119413.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用uniapp中的canvas组件来实现将两个canvas合并成一张图片的效果。具体实现步骤如下: 1. 在页面中添加两个canvas组件,分别用于绘制要合并的两张图片。 2. 分别在两个canvas组件的代码中,使用uni.createCanvasContext()方法获取canvas上下文对象。 3. 在canvas上下文对象中,使用drawImage()方法绘制图片。 4. 绘制完成后,使用toTempFilePath()方法将canvas转换成临时文件路径。 5. 将两个临时文件路径传入uni.getImageInfo()方法中,获取图片的宽高信息。 6. 创建一个新的canvas上下文对象,设置其宽高为两张图片的宽高之和。 7. 将两张图片分别绘制到新的canvas上下文对象中,使用drawImage()方法和坐标参数控制位置。 8. 最后,使用toTempFilePath()方法将新的canvas转换成临时文件路径,即可得到合并后的图片。 示例代码: ``` <template> <view> <canvas canvas-id="canvas1"></canvas> <canvas canvas-id="canvas2"></canvas> <image :src="mergedImage"></image> </view> </template> <script> export default { data() { return { mergedImage: '' } }, methods: { mergeImages() { const ctx1 = uni.createCanvasContext('canvas1') const ctx2 = uni.createCanvasContext('canvas2') // 绘制第一张图片 ctx1.drawImage('image1.png', 0, 0) // 绘制第二张图片 ctx2.drawImage('image2.png', 0, 0) // 将canvas转换成临时文件路径 ctx1.toTempFilePath({ success: res1 => { ctx2.toTempFilePath({ success: res2 => { // 获取图片的宽高信息 uni.getImageInfo({ src: res1.tempFilePath, success: info1 => { uni.getImageInfo({ src: res2.tempFilePath, success: info2 => { // 创建新的canvas上下文对象 const ctx = uni.createCanvasContext('mergedCanvas') ctx.canvas.width = info1.width + info2.width ctx.canvas.height = info1.height // 绘制第一张图片 ctx.drawImage(res1.tempFilePath, 0, 0, info1.width, info1.height) // 绘制第二张图片 ctx.drawImage(res2.tempFilePath, info1.width, 0, info2.width, info2.height) // 将canvas转换成临时文件路径 ctx.toTempFilePath({ success: res => { this.mergedImage = res.tempFilePath } }) } }) } }) } }) } }) } } } </script> ``` 注意,以上代码仅为示例代码,实际使用时需要根据具体情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值