JavaScript合并图片与二维码

一般涉及到小程序的项目,都有一个分享的二维码。有的时候大家可能需要把二维码和其他图片合并,做一张海报等等需求。在网上看到很多说是引用jQuery,或者HTML2Canvas和qrcode.js。这里给大家分享的是用canvas合并。

①图片的跨域

image.png

首先呢,我们使用canvas加载绘制图片的时候,会涉及到图片跨域的问题。比如看上面的这个图片

Access to image at 'file:///C:/xxx.jpg' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https
这是说在访问“file:///C:/xxx.img”处的图像/频道列表.jpg“已被CORS策略阻止:跨源请求仅支持协议方案:http、data、chrome、chrome extension、chrome untrusted、https。

img.html:41 GET file:///C:/Users/xxx.jpg net::ERR_FAILED
这是说在获取这个路径的图片获取失败

因此如果是一张在线的图片,那么就需要在图片服务器上设置跨域头,并且前端加载图片之前将<img>标签的crossOrigin设置为*,否则就会报错。

为什么会这样呢?具体说法是:可避免未经许可拉取远程网站信息而导致的用户隐私泄露。

解决步骤

1.使用img标签的crossOrigin属性,设置其值为anonymous。如:

var image= new Image();
image.src = 'img/img01.jpg';
image.setAttribute("crossOrigin",'anonymous');

或者:

var image= new Image();
image.src = 'img/umg01.jpg'; 
image.crossOrigin = 'Anonymous';

也可以:

<img src="" alt="" crossOrigin="Anonymous" />

②图片的加载

canvas绘制是需要加载完成的图片,这里我们就要用到<img>标签的onload事件,在图片加载完成后立即执行。所有浏览器都支持onload事件,而且上文中也提到创建JavaScript图片对象var image = new Image();

③图片的合并

直接上代码

<template>
    <div>
        <img id="avatar" src="" alt="">
    </div>
</template>

<script>
    import img01 from './img01.png';
    import img02 from './img02.png';
    export default {
        data() {
            return {
                
            }
        },
        created() {
            this.handleBlock()
        },
        methods: {
            handleBlock() {
                // 动态创建canvas标签
                var canvas = document.createElement("canvas");
                // 设置canvas画布宽度和高度
                canvas.width = 350;
                canvas.height = 700;
                // 创建context对象
                var context = canvas.getContext("2d");
                // 用context.rect方法绘制矩形
                context.rect(0 , 0 , canvas.width , canvas.height);
                // 进行染色
                context.fillStyle = "#fff";
                // 渲染
                context.fill();
                // 创建一个image对象
                var myImage = new Image();
                myImage.src = img02;    //背景图片  你自己本地的图片或者在线图片
                // 跨域,必须
                myImage.crossOrigin = 'Anonymous';
                // 使用img的onload事件
                myImage.onload = function(){
                    // 画布定义自己要插入的图片
                    context.drawImage(myImage , 0 , 0 , 350 , 700);
                    // 这里是绘制文字,我这里不需要,所以注释了
                    // context.font = "60px Courier New";
                    // context.fillText("山有木兮木有枝,心悦君兮君不知",350,450);
                    // 创建第二个img对象
                    var myImage2 = new Image();
                    myImage2.src = img01;   //你自己本地的图片或者在线图片
                    // 图片跨域,必须
                    myImage2.crossOrigin = 'Anonymous';
                    myImage2.onload = function(){
                        context.drawImage(myImage2 , 100 ,225 , 175, 175);
                        // canvas生成img图片
                        //如果是生成png格式,那么就"image/png" 
                        // 如果是要生成jpg格式,那么就改为"image/jpeg"
                        var base64 = canvas.toDataURL("image/png"); 
                        var img = document.getElementById('avatar');
                        document.getElementById('avatar').src = base64;
                    }
                }
                
            }
        }
    }
</script>

附注:最好使用vue或者react,否则单纯的用html写小demo(.html文件)还是会报图片跨域的问题。


如果是用html写的小demo,推荐使用VScode编辑器,在编辑器扩展这里(快捷键ctrl+shift+x),打开后输入open,选择open in browser,如图

image.png

安装后,在编辑器ctrl+s保存好代码之后,右击,选择open with Live Server(快捷键Alt+L或者Alt+O)如图:


image.png

这样会自动打开你的默认浏览器,在编辑器修改代码保存后,页面也会自动刷新,只要设置了img标签的跨域属性,基本不会报错啦

好了,这篇文章到这里就要结束了,如果您正在看这篇文章,觉得对您有帮助的话,就麻烦您的小手手给我点个赞吧^ _ ^,如果有任何疑惑或建议,都可在下方留言,一起交流、学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354