vue - vue中使用canvas进行前端图片合并

这篇具有很好参考价值的文章主要介绍了vue - vue中使用canvas进行前端图片合并。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

如何合成一个二维码和背景图片:其实就是多次调用canvas的drawImage方法进行不同坐标的图像;但是因为涉及到微信长按分享图片或保存到本地,所以不能直接使用canvas来放置图片(因为微信中长按识别不出来),只能使用<img>标签来引入canvas合成的base64路径。

一、canvas介绍

Canvas API 提供了一个通过JavaScript 和 HTML的元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。

看起来和 元素很相像,唯一的不同就是它并没有 src 和 alt 属性。实际上,<canvas>>标签只有两个属性: width和height。这些都是可选的,并且同样利用 DOM properties 来设置。当没有设置宽度和高度的时候,canvas 会初始化宽度为 300 像素和高度为 150 像素。该元素可以使用CSS来定义大小,但在绘制时图像会伸缩以适应它的框架尺寸:如果 CSS 的尺寸与初始画布的比例不一致,它会出现扭曲。

备注: 如果你绘制出来的图像是扭曲的,尝试用 width 和 height 属性为明确规定宽高,而不是使用 CSS。

名词解释:

1,画布

这里创建了一个canvas也就是画布;

 let canvas = document.createElement('canvas');

2,渲染上下文

也可以理解为画笔: getContext()只有一个参数,上下文的格式

// 使用它的getContext() 方法来访问绘画上下文
let ctx = canvas.getContent('2d');

方法:

1,rect

可以用此方法来绘制图形;

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
ctx.rect(10, 20, 150, 100); // ctx.rect(x, y, width, height);
ctx.fill();

2,drawImage(image, x, y)

// 使用方法
void ctx.drawImage(image, dx, dy);
void ctx.drawImage(image, dx, dy, dWidth, dHeight);
void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

详细介绍:

参数名 是否必填 类型 描述
image CSSImageValue,HTMLImageElement,SVGImageElement,HTMLVideoElement,HTMLCanvasElement,ImageBitmap, OffscreenCanvas 绘制到上下文的元素
sx number 需要绘制到目标上下文中的,image的矩形(裁剪)选择框的左上角 X 轴坐标
sy number 需要绘制到目标上下文中的,image的矩形(裁剪)选择框的左上角 Y 轴坐标
sWidth number 需要绘制到目标上下文中的,image的矩形(裁剪)选择框的宽度。如果不说明,整个矩形(裁剪)从坐标的sx和sy开始,到image的右下角结束
sHeight number 需要绘制到目标上下文中的,image的矩形(裁剪)选择框的高度
dx number image的左上角在目标canvas上 X 轴坐标
dy number image的左上角在目标canvas上 Y 轴坐标
dWidth number image在目标canvas上绘制的宽度。 允许对绘制的image进行缩放。 如果不说明, 在绘制时image宽度不会缩放
dHeight number image在目标canvas上绘制的高度。 允许对绘制的image进行缩放。 如果不说明, 在绘制时image高度不会缩放

二、实现图片合成

下面是我案例最终实现的效果图:主要流程是后端返回给我一个背景图片的链接,我本地生成一个二维码,然后合并到一起组成一个新的图片;

vue图片拼接,前端,vue.js,javascript

主要代码如下:

第一步:点击【点击生成签到二维码】按钮生成一个二维码;(这里生成二维码使用的是qrcodejs2第三方的库)

第二步(重点):点击【点击合成图片】按钮调用composeImgs方法,参数分别是两张图片的资源(html节点);

注意:如果你其中传的一个参数是一个图片的链接资源,那么你需要new Image() 创建一个新的HTMLImageElement实例;因为 drawImage()方法的第一参数就是期望一个html实例;写法可以参考下面案例中的 composeImgs 方法;

<template>
  <div class="copy">
    <h4>测试合成图片</h4>
    <van-button type="primary" class="line1 _getter" @click="makeQrcode">1,点击生成签到二维码 </van-button>
    <!-- 存放图片的容器 -->
    <div class="code" ref="qrcode"></div>

    <br />
    <van-button type="primary" class="line1 _getter" @click="handleImg">2,点击合成图片</van-button>
    <img :src="imgSrc" class="imgSrc" alt="" />
  </div>
</template>
<script>
//引入二维码库
import Qrcode from 'qrcodejs2';
export default {
  data() {
    return {
      // 两张图片的链接
      imgSrc: '',
      bgSrc: 'http://xtbapp1.su.bcebos.com/QRCode/image/2023/37010ec1-49dd-4403-a87c-4f27afa6b71b.png',
    };
  },
  methods: {
   
    // 点击生成二维码
    makeQrcode() {
      new Qrcode(this.$refs.qrcode, {
        // text 需要转二维码的内容 可以是文本也可以是一个链接 是链接会直接跳走
        text: 'https://blog.csdn.net/qq_43886365?spm=1000.2115.3001.5343', // https://www.csdn.net/
        width: 120,
        height: 120,
        colorDark: '#333', //二维码颜色
        colorLight: '#fff', //二维码背景颜色
        correctLevel: Qrcode.CorrectLevel.L, //容错率,L/M/H
      });
    },

    /* 合成图片 */
    async handleImg() {
      // 拿到二维码的资源
      let codeElement = document.querySelector('.code img');
      codeElement.crossOrigin = 'Anonymous' // 设置跨域属性
      console.dir(codeElement);
      let imgSource = codeElement.attributes.src.value;
      let base64 = await this.composeImgs(this.bgSrc, codeElement);
      this.imgSrc = base64;
    },
    //图片合成
    composeImgs(img1, img2) {
      return new Promise((resolve, reject) => {
        // 1,先创建一个画布
        let canvas = document.createElement('canvas');
        //2,创建画笔
        const context = canvas.getContext('2d');
        //3,设置背景的宽高
        canvas.width = 687;
        canvas.height = 1104;

        // context.rect(0, 0, canvas.width, canvas.height);
        
        // 第一张图片传的是个链接 需要new Image 创建一个html元素
        // 如果本身就是一个html元素 那么可以直接调用 drawImage 方法进行绘制图片
        const myImage1 = new Image();
        myImage1.src = img1;
        myImage1.crossOrigin = 'Anonymous';// 跨域设置

        myImage1.onload = () => {
          context.drawImage(myImage1, 0, 0, 687, 1104); // 开始画第一张
          context.drawImage(img2, 365, 770, 190, 190); // 开始画第二张
          const base64 = canvas.toDataURL('image/png'); //获取base64的图片流
          resolve(base64); // 成功之后返回出去
        };
      })
    },
  },
};
</script>
<style scoped lang="scss">
.code {
  margin-top: 10px;
}
.imgSrc {
  display: block;
  // width: 400px;
  // height: 685px;
  // transform: scale(0.5);
  zoom: 0.51;
}
</style>

如果composeImgs方法传的两个参数都是图片的链接,代码修改如下:

 data() {
    return {
      // 背景图片的链接
      bgSrc: 'http://xtbapp1.su.bcebos.com/QRCode/image/2023/37010ec1-49dd-4403-a87c-4f27afa6b71b.png',
      // 二维码的链接
      qrSrc: '您的二维码的链接',
    };
  },
  methods:{
   // 合成图片
    composeImgs(img1, img2) {
      return new Promise((resolve, reject) => {
        // 1,先创建一个画布
        let canvas = document.createElement('canvas');
        //2,创建画笔
        const context = canvas.getContext('2d');
        //3,设置背景的宽高
        canvas.width = 687;
        canvas.height = 1104;
        
        //第一张图片====================================
        const myImage1 = new Image();
        myImage1.src = img1;
        myImage1.crossOrigin = 'Anonymous';
        myImage1.onload = () => {
          context.drawImage(myImage1, 0, 0, 687, 1104); // 设置坐标并绘制
          //第二张图片
          const myImage2 = new Image();
          myImage2.src = img2;
          myImage2.crossOrigin = 'Anonymous';
          myImage2.onload = () => {
            context.drawImage(myImage2, 365, 770, 190, 190);
            const base64 = canvas.toDataURL('image/png'); //获取base64的图片流
            resolve(base64); // 成功之后返回图片路径
          };
        };
      });
    },
  }

End;

还有我为什么使用 let codeElement = document.querySelector('.code img');来获取二维码的img 节点;因为 qrcodejs2生成的二维码 img元素中没有可以拿到的类名和id值;所以我使用了父元素的类名 .code

vue图片拼接,前端,vue.js,javascript文章来源地址https://www.toymoban.com/news/detail-782044.html

到了这里,关于vue - vue中使用canvas进行前端图片合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用JavaScript给图片添加图片水印的前端实现方法

    当涉及图片处理时,JavaScript是一种强大的工具。在本篇博客中,我们将学习如何使用JavaScript来给图片添加水印,并将其封装成一个函数,以便在需要的时候重复使用。 在开始之前,确保你已经准备好了以下内容:         1.一张待添加水印的图片。         2.水印图片。

    2024年03月15日
    浏览(60)
  • 【Python处理EXCEL】基础操作篇3:用Python对Excel表格进行拼接合并

    目录 准备工作 一、横向拼接 1.1 一般拼接 1.2 指定键进行拼接,即指定某一列作为两个表的连接依据。 1.2.1 多对一 1.2.2 多对多 1.2.3 用on来指定多个连接键 1.2.4 指定左右连接键 1.2.5 索引当作连接键 1.3 连接的方式 1.3.1 内连接(inner) 1.3.2 左连接(left) 1.3.3 右连接(right)

    2024年01月17日
    浏览(55)
  • vue3中,使用html2canvas截图包含视频、图片、文字的区域

    需求:将页面中指定区域进行截图,区域中包含了图片、文字、视频。 第一步,先安装 第二步,在页面引入: 第三步,页面使用: 1)html部分: 2)js部分: 刚开始我截出的图只有文字,插图和视频部分是空白的,并没有将页面的插图和视频截进去,最终发现是 跨域 导致的

    2024年02月06日
    浏览(49)
  • 【前端灵魂脚本语言JavaScript⑤】——JS中数组的使用

    🐚 作者: 阿伟 💂 个人主页: Flyme awei 🐋 希望大家多多支持😘一起进步呀! 💬 文章对你有帮助👉关注✨点赞👍收藏📂 第一种: var 数组名 = new Array(); 创建一个空数组 第二种: var arr2 = new Array(10); 创建一个定长为10的数组 第三种 var arr3 = new Array(a,b,c); 创建时直接指定元素值

    2023年04月08日
    浏览(60)
  • python opencv:批量识别拼接图片分界线并进行自动裁剪

    在网上找图片素材时,有很多的图片是长图片,在一张图片上拼接了许多张图片,而很多时候我们需要单张图片,此时就需要将长图进行裁剪,一般可以用图片工具进行简单裁剪,高级点可以采用ps进行切片处理,如果图片数量少还好说一旦有大量的图片需要裁剪就很繁琐并

    2024年02月11日
    浏览(48)
  • 前端使用vue-pdf、pdf-lib、canvas 给PDF文件添加水印,并预览与下载

    原理就是给显示pdf 的容器增加一层水印遮罩层 下载: 通过url获取pdf文件的arrarybuffer文件流 将arraybuffer数据转成pdf文档 添加水印字体(内置/自定义) 为每页pdf添加文字水印 保存pdf文件的unit64Arrary文件流 预览: 创建canvas容器(用于显示水印文字) 创建水印canvas 将水印canv

    2024年01月24日
    浏览(59)
  • 解决前端html2canvas生成图片慢问题

    分享一个小发现 这里首先直接说结论:         由于html2canvas生成图片的过程会从html的head、body层标签开始遍历,所以对于项目较大,但是只需要对 某个dom (下文以D称呼)生成图片的情况非常不友好!          所以,一定要通过ignoreElements过滤掉大部分没用的标签。

    2024年02月13日
    浏览(57)
  • 5个前端练手项目(html css js canvas)

     前言: 首先祝大家端午节快乐。本篇文章有5个练手项目 对于刚学完前端三剑客的你们。应该是一个很好的实践 目录 🥩.跑马灯 1.1效果图: 1.2思路解析 1.3源码 🍧.彩虹爱心 2.1效果图 2.2思路解析 2.3源码 🌮.闹钟 3.1效果图 3.2思路解析 3.3源码 🍲.自制笔记本 4.1效果展示 4

    2024年02月02日
    浏览(54)
  • 使用numpy处理图片——图片拼接

    在《使用numpy处理图片——图片切割》一文中,我们介绍了如何使用numpy将一张图片切割成4部分。本文我们将反其道而行之,将4张图片拼接成1张图片。 基本的思路就是先用两张图以左右结构拼接成上部,另外两张图也以左右拼接成为下部。然后上下两部再拼接。当然也可以

    2024年02月02日
    浏览(36)
  • 微信小程序使用canvas绘制网络图片,使用canvas将图片变成圆形

    以上的写法 会造成某些图标无法绘制上去, 解决方法是在网络图片中不断嵌套,先绘制大图片,再绘制小图片的顺序 网上说使用先下载到本地,再使用img.src加载,我尝试过还是不行 长用在海报,需要将用户的头像画到canvas图片上,如: 其原理就是在图片上面放一个圆

    2024年02月13日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包