canvas加载base64字符串图片 canvas转base64图片错误

本文介绍如何使用Canvas将背景图片与二维码链接合成一张图片,并解决跨域问题,最终将Canvas转换为Base64格式。

canvas加载base64字符串图片 canvas转base64图片错误

碰到一个项目需求,需要将后台传过来的图片还有数据合成一张图片,(里面有个连接要转成二维码),这个时候第一下想到的肯定就是用canvas,我们先来看一下需求和步骤:

  1. 生成一个背景图片
  2. 将二维码连接转base64
  3. 生成二维码图片
  4. 将背景图片画到canvas上
  5. 将二维码图片滑到canvas上
  6. 将canvas转base64(因为需求要将生成的图片发出去)

话不多少,上代码

// 我们先生成背景图片, 背景图片是外链,这里只体现逻辑
const bgImg = new Image();
bg.src = 'http://bg.jpg';

// 将二维码连接转base64,有相关js插件,这里不多说
const qrCode = createQrCode(qrCode);
const qrCodeImg = new Image();
qrCodeImg.src = qrCode;

//生成canvas

const canvas = document.createElement('canvas');
canvas.height = 900;
canvas.width = 620;
const ctx = canvas.getContext('2d');
ctx.drawImage(bgImg, 0, 0, 260, 900);
ctx.drawImage(QrCodeImg, 0, 0, 100, 100);

以上代码都只体现逻辑,具体实现就不多说了
这时候我们可以看到我们想要的图形了,但是这个时候还是canvas,canvas在微信上不能长按发送保存和识二维码的,这个时候我们就要转成真的图片了

const imgUrl = canvas.toDataURL('image/png');
<img src="imgUrl"/>

理论上这个时候我们应该就能得到我们想要的图片了。可现实总是这么残酷,我们会发现报错了
这里写图片描述

这是因为我们再canvas上使用了外链图片,也就是跨域了,所以我们需要在img上加上一个属性

image.setAttribute('crossOrigin', 'anonymous');
// 或者
image.crossOrigin = '*';
// 切记不使用url图片时,一定要把上面这一行注释掉,否则在低版本iOS上就会有问题

现在就可以得到我们想要的效果了,切记base64 的图片画到canvas上别加 crossOrigin 属性,自己当时就是遇到了这么坑,找了我几个小时。现在分享出来,希望对碰到同样问题的朋友能有帮助。

在Vue 3中实现图片换为Base64字符串可以通过以下几种常见方法: ### 使用`FileReader` API 当用户上传图片时,可以利用`FileReader` API读取文件并将其换为Base64字符串。以下是一个示例代码: ```vue <template> <div> <input type="file" @change="handleFileChange" /> <img v-if="base64Image" :src="base64Image" alt="Converted Image" /> </div> </template> <script setup> import { ref } from 'vue'; const base64Image = ref(''); const handleFileChange = (event) => { const file = event.target.files[0]; if (file) { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { base64Image.value = reader.result; }; reader.onerror = (error) => { console.error('Error reading file:', error); }; } }; </script> ``` 在上述代码中,当用户选择文件时,`handleFileChange`方法会被触发。`FileReader`读取文件并将其换为Base64字符串,结果存储在`base64Image`变量中。 ### 换本地静态图片 如果要换项目中的本地静态图片,可以先创建一个`Image`对象,加载图片后使用`canvas`将其换为Base64字符串。示例代码如下: ```vue <template> <div> <img ref="image" style="display:none" src="@/assets/logo.png" /> <button @click="convertToBase64">Convert to Base64</button> <p v-if="base64Image">{{ base64Image }}</p> </div> </template> <script setup> import { ref } from 'vue'; const image = ref(null); const base64Image = ref(''); const convertToBase64 = () => { const img = image.value; const canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0); base64Image.value = canvas.toDataURL('image/png'); }; </script> ``` 在这个示例中,点击按钮会触发`convertToBase64`方法,该方法使用`canvas`将图片换为Base64字符串,并将结果存储在`base64Image`变量中。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值