【vue功能】多张图片合并

多张图片合并成一张图片

      • 步骤一,多张图片上传
      • 步骤二,循环获取所有绘制图片的总高度
          • new FileReader()方法作用
          • new Image()方法作用介绍
      • 步骤三,合并多张图片
          • canvas.toDataURL()作用-
          • dpr作用
      • 步骤四,下载图片

步骤一,多张图片上传

<input type="file" id="imageInput" multiple accept="image/*" @change="handleFileUpload" />
<!-- 图片绘制合并区域 -->
<div class="canvasPDF">
   <canvas
      id="myCanvas"
      :style="{ width: wcanvansimg + 'px', height: hcanvansimg + 'px', border: '1px solid #eeeeee' }"
    ></canvas>
</div>
handleFileUpload(event) {
     this.imageslist = event.target.files;
     console.log('初始文件内容格式',this.imageslist[0])
},

在这里插入图片描述

步骤二,循环获取所有绘制图片的总高度

//获取所有图片的总高度
    getImginfo() {
      return new Promise((resolve, reject) => {
        let allHeight = 0;
        let loadedCount = 0; // 用于追踪已加载图片数量
        let totalImages = this.imageslist.length; // 图片总数
        for (let i = 0; i < totalImages; i++) {
          //图片转化方式
          const reader = new FileReader();
          reader.readAsDataURL(this.imageslist[i]);
          reader.onload = (e) => {
            const img = new Image();
            img.onload = () => {
              console.log('经过转化的图片文件',e);
              console.log('可以获取图片宽高的图片格式',img);
              allHeight += img.height;
              loadedCount++; // 增加已加载图片计数
              if (loadedCount === totalImages) {
                resolve(allHeight);
              }
            };
            img.onerror = (error) => {
              reject(error);
            };
            //将经过转化的图片文件赋值给src
            img.src = e.target.result;
          };
        }
      });
    },

在这里插入图片描述
在这里插入图片描述

new FileReader()方法作用
  • 通过创建一个FileReader实例,你可以使用它的方法来异步读取文件内容。
  • readAsDataURL方法就是FileReader提供的一种读取方式,它将文件读取为数据URL,
  • 这是一种以Base64编码的字符串,可以直接在HTML中作为图像源使用
const file = event.target.files[0]; // 获取选中的文件
    if (file) {
        const reader = new FileReader();
        
        // 当文件读取完成后,reader.onload事件将被触发
        reader.onload = function(e) {
            // e.target.result包含了文件的数据URL,也就是base64
            console.log(e.target.result);
            // 这里可以将数据URL设置为<img>标签的src属性,显示图片
        };
        
        // 开始读取文件
        reader.readAsDataURL(file);
    }
new Image()方法作用介绍
  • 这里的img,就可以获取img的宽高
  • img也可以绘制在画布上
// 创建一个新的Image对象
const img = new Image();

// 设置onload事件处理函数,当图片加载完成后执行
img.onload = () => {
    // 在这里编写当图片加载完成后想要执行的代码
    console.log('图片加载完成!');
    //img
};

// 设置图片的source属性,开始加载图片
img.src = 'path/to/your/image.jpg';

步骤三,合并多张图片

 async mergeImg() {
      let that = this;
      var canvas = document.getElementById('myCanvas');
      const ctx = canvas.getContext('2d');
      let x = 0;
      let y = 0;
      //获取图片信息
      const res = await that.getImginfo();
      //展示高度
      that.hcanvans = res;
      that.wcanvans = 2400;
      canvas.width = that.wcanvans * that.dpr;
      canvas.height = res * that.dpr;
      for (let i = 0; i < that.imageslist.length; i++) {
        const reader = new FileReader();
        reader.readAsDataURL(this.imageslist[i]);
        reader.onload = (e) => {
          const img = new Image();
          img.src = e.target.result;
          img.onload = () => {
            ctx.drawImage(img, x, y, img.width, img.height);
            y += img.height;
            if (i === that.imageslist.length - 1) {
              // 下载图片
              that.downloadImage(canvas.toDataURL(),`合并图片.png`)
            }
          };
        };
      }
      ctx.scale(this.dpr, this.dpr);
    },
canvas.toDataURL()作用-
  • 获取画布图片的base64格式
dpr作用
  • 获取设备像素比
  created() {
    this.dpr = window.devicePixelRatio;
  },

步骤四,下载图片

//参数1为base64格式图片文件,参数2是下载后的图片文件名
 downloadImage(base64str, filename) {
      const link = document.createElement('a');
      link.href = 'data:' + 'image/png';
      link.href += base64str;
      link.download = filename + '.png';
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/572341.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入Linux下的GCC编译器:从入门到精通

目录标题 1、GCC编译器概述2、安装GCC3、GCC的基本使用4、高级功能4.1 多文件编译4.2 静态和动态链接4.3 什么是链接&#xff1f;4.4 静态链接优点缺点 4.5 动态链接优点缺点 4.6 实际应用4.7 编译优化 GCC&#xff08;GNU Compiler Collection&#xff09;是一款免费、开源的编…

从 Android 恢复已删除文件的 3 种简单方法

如何从 Android 恢复已删除的文件&#xff1f;毫不犹豫&#xff0c;有些人可能会认为从 Google 备份恢复 Android 文件太容易了。但是&#xff0c;如果删除的文件未同步到您的帐户或未备份怎么办&#xff1f;您错误的恢复可能会永久删除您想要的数据。因此&#xff0c;我们发布…

Maven 安装及配置教程(Windows)【安装】

文章目录 一、 下载1. 官网下载2. 其它渠道 二、 安装三、 配置四、 验证五、 本地仓储配置六、 配置镜像七、 配置JDK八、完整配置九、常用命令十、IDEA 中配置 Maven1. 配置当前项目2. 配置新建 / 新打开 项目 软件 / 环境安装及配置目录 一、 下载 1. 官网下载 安装地址&a…

【2024年最新】NodeMCU-ESP8266刷AT固件教程——适用于esp-12E和esp-12F

硬件图片 原理图 0、工具打包下载 工具包 密码:keduo 1、工具及固件下载 固件下载地址&#xff1a; 欢迎 | 安信可科技 (ai-thinker.com) 下载以下固件&#xff1a; 直接下载地址&#xff1a;AT 固件&#xff08;固件号&#xff1a;0781&#xff09; 下载以下工具&#xf…

【前端】vue数组去重的3种方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数组去重说明二、Vue数组去重的3种方法 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使用一些开发工具&#xff0c;本文…

react09 hooks(useState)

react-09 hooks&#xff08;useState&#xff09; hooks组件&#xff08;函数组件动态化&#xff09; 其本质就是函数组件&#xff0c;引用一些hooks方法&#xff0c;用来在函数组件中进行例如状态管理&#xff0c;模拟类组件的生命周期等&#xff0c;只能运用到函数组件中 ho…

基于MaxKB搭建一个知识库问答系统

什么是MaxKB MaxKB 是一款基于 LLM 大语言模型的知识库问答系统。MaxKB Max Knowledge Base&#xff0c;旨在成为企业的最强大脑。 开箱即用&#xff1a;支持直接上传文档、自动爬取在线文档&#xff0c;支持文本自动拆分、向量化&#xff0c;智能问答交互体验好&#xff1b…

DHCP Relay配置与抓包

前言&#xff1a;DHCP请求报文是以广播包方式发送的&#xff0c;当DHCP服务器与DHCP客户端不在同一网段时&#xff0c;就需要在三层网关设备配置DHCP中继功能 。 为能更好理解DHCP Relay功能&#xff0c;建议先看看DHCP Server的内容 https://blog.csdn.net/weixin_58574637…

【Java框架】SpringMVC(三)——异常处理,拦截器,文件上传,SSM整合

目录 异常处理解释局部异常处理全局异常 拦截器拦截器介绍作用:拦截器和过滤器之间的区别拦截器执行流程代码实现补充 文件上传依赖配置MultipartResolver编写文件上传表单页APIMultipartFileFile.separator必须对上传文件进行重命名代码示例 SpringMVC文件上传流程多文件上传 …

你知道吗?PCBA产品上市前还需要进行老化测试?

在PCBA加工过程中&#xff0c;电子工程师可能发现明明PCBA板出货时各项功能指标正常&#xff0c;但使用一段时间&#xff0c;就莫名其妙出现各种不良问题&#xff0c;最后返场维修&#xff0c;那么这是为什么&#xff1f; 首先&#xff0c;这些原因&#xff0c;十有八九可能是P…

谷歌开发者账号关联被封?解封申诉指南来了!

相信大部分在谷歌上架应用的开发者&#xff0c;已经被谷歌封号封麻了。且不少开发者普遍认为&#xff0c;一旦开发者账号被封禁&#xff0c;想要成功申诉回来的难度极大。 特别是那些因为涉及“高风险”滥用模式行为关联被封的账号&#xff0c;更是不可能申诉成功。但事实上&am…

再谈C语言——理解指针(五)(完结篇)

数组名的理解 在上⼀个章节我们在使⽤指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址&#xf…

【产品经理修炼之道】- 将用户需求转化为研发需求

每当接到一个用户需求&#xff0c;产品经理头疼的事情之一&#xff0c;可能就是如何把用户需求转化成研发需求。怎么理解二者的区别&#xff0c;并成功地将需求转化呢&#xff1f;这篇文章里&#xff0c;作者做了分享与总结&#xff0c;一起来看一下。 产品经理与研发人员的博弈…

【图像分割】光流生成标签(matlab)

文章目录 1. 框架2. opticalFlow_label3. 光流 1. 框架 2. opticalFlow_label close all; clear; clc; % 使用光流进行标签的生成 %% 视频帧的读取 npy_data readNPY(train.npy);%% 提取标签的坐标 first_label squeeze(npy_data(2,1,:,:)); h fspecial("gaussian&quo…

C语言自定义类型【结构体】

结构体的概念 结构是一些值的集合&#xff0c;这些值被称为成员变量。结构的每个成员可以是不同类型的变量。 1.结构体的声明 1.1普通声明 我们假设要创建一本书的类型&#xff0c;那我们需要书名&#xff0c;作者&#xff0c;价格&#xff0c;书的ID 代码如下&#xff1a;…

第十五届蓝桥杯省赛第二场C/C++B组A题【进制】题解(AC)

解题思路 按照题意进行模拟&#xff0c;计算 x x x 的 b b b 进制过程中&#xff0c;若出现余数大于 9 9 9&#xff0c;则说明 x x x 的 b b b 进制一定要用字母进行表示。 #include <iostream> #include <cstring> #include <algorithm> #include &l…

vue3推荐算法

Vue 3 推荐算法主要指的是在 Vue 3 框架中实现的或者适用于 Vue 3 的算法库或组件库。Vue 3 由于其优秀的设计和性能&#xff0c;被广泛应用于构建各种类型的应用程序&#xff0c;包括需要复杂算法支持的项目。以下是一些在 Vue 3 中可能会用到的推荐算法资源&#xff1a; Vue-…

啊? 又要洗数据啦!! 还是两个key决定一个表! 二维Map学习,基于guava的HashBasedTable

一个洗数据的需求&#xff0c;表设计的外建不能判断某一个数据源&#xff0c;还要根据tyoe来进行判断才可以。 那此时呆逼的查发能实现但不够优雅&#xff0c;于是乎想到了二维数组&#xff0c;查了下资料有相关的实现给大家分享下&#xff01;&#xff01; 背景 表设计如下&a…

美易官方:AI热潮“熄火”了?Meta Q1财报较差

近期&#xff0c;随着Meta&#xff08;前Facebook&#xff09;发布了其2023年第一季度的财报&#xff0c;一场科技股的震荡在美股市场上演。曾经风光无限的AI热潮似乎出现了“熄火”的迹象&#xff0c;引发了市场的广泛关注和讨论。 Cresset Wealth Advisors首席投资官Jack Abl…

libVLC 专栏介绍

本专栏主要界面libVLC的使用&#xff0c;详细介绍了相关用法&#xff0c;使用Qt作为显示界面&#xff0c;不仅可以了解Qt的使用&#xff0c;QSS的美化&#xff0c;更能够熟悉libVLC核心接口的使用&#xff0c;最后打造一款属于自己的精美播放器。 每一节都有单独的源码供查看。…