Canvas合成图片

 

        const canvas = document.createElement('canvas')
        const ctx = canvas.getContext('2d')
        const img = new Image() // 同个画布中可创建多个image图片
        img.crossOrigin = 'Anonymous' // 图片加载的过程中允许出现跨域

        // 先有src属性才会触发 onload函数
        img.src = imgUrl // 图片地址(包括base64 、bloburl)

        img.onload = function() {
          // 注意img.onload方法是异步的
          canvas.width = img.width  // canvas画布的图片大小可以自定义 这里默认跟图片大小相等
          canvas.height = img.height // 同上
          let size = img.width * 0.1 + 'px'
          ctx.font = `${size} Georgia`
          // 给文字添加颜色
          // ctx.fillStyle = 'red';
          // 添加渐变颜色的水印
          var gradient = ctx.createLinearGradient(0, 0, 200, 0)
          gradient.addColorStop(0, 'blue')
          gradient.addColorStop(1, 'red')
          ctx.fillStyle = gradient
          // 以左上角为坐标原点 开始绘制图像
          ctx.drawImage(img, 0, 0, img.width, img.height)
          ctx.fillText('文字', img.width * 0.05, img.height * 0.1) // 在图片上添加字体[第二、三个参数为位置信息]
          size = img.width * 0.08 + 'px' // 填充文字大小是在填充前设置的 每次可设置不同大小
          ctx.font = `${size} Georgia`
          ctx.fillText('文字', img.width * 0.05, img.height * 0.2) // 同上
          size = img.width * 0.05 + 'px'
          ctx.font = `${size} Georgia`
          ctx.fillText('文字', img.width * 0.05, img.height * 0.9, img.width * 0.9)
          // let resultBase64 = canvas.toDataURL('image/png', 0.8) // 压缩图片后返回的文件也是base64格式的
            // 压缩图片后返回blob对象
          canvas.toBlob( 
            function(blob) {
             console.log(blob) // 可上传服务器
            },
            'image/jpeg',
            0.8
          )
        }

合成多个图片

let canvas = document.createElement('canvas'),
    ctx = canvas.getContext('2d');
canvas.width = 800;
canvas.height = 800;

let img1 = new Image(),
    img2 = new Image();
img1.src = './images/1.jpg';
img2.src = './images/2.jpg';

// 加载img1
let pm1 = new Promise((res,rej)=>{
  img1.onload = ()=>{
    res();
  }
});
// 加载img2
let pm2 = new Promise((res,rej)=>{
  img2.onload = ()=>{
    res();
  }
});

// 两张图片都加载完成后绘制于Canva中
let drawAllImg = Promise.all([pm1, pm2]).then((res)=>{
  ctx.drawImage(img2, 0, 0, 400, 533);
  ctx.drawImage(img1, 0, 0, 100, 100);
});

其中Promise对象中的all()方法是为了等两张图片全部加载完后在执行后续操作。由于我们现在创建的Canvas还未添加到DOM中,所以若是想要看现在的Canvas情况得先加上下面这句:

document.body.appendChild(canvas);

当然,实际若是只想要合成图片的话就没必要加上这句了,在离屏Canvas(即手动创建的Canvas但并未添加至DOM中)上绘制即可。 

将Canvas导出为图片


  let outputImg = new Image();
  outputImg.src = ctx.canvas.toDataURL();
  document.body.appendChild(outputImg);

将Canvas导出为在线链接

 let resultBase64 = canvas.toDataURL('image/png', 0.8) // 压缩图片后返回的文件也是base64格式的
            // 压缩图片后返回blob对象
 canvas.toBlob( function(blob) {
             console.log(blob) // 可上传服务器
          },
            'image/jpeg',
            0.8
          )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值