Vue图片处理解决方案,一篇就够了

news2024/11/19 2:41:25

文章目录

      • 一、阅读须知
      • 二、解决的问题
      • 三、知识储备
      • 四、解决方案
      • 五、核心代码
      • 六、参考资料
      • 七、FileReader()对象
      • 八、Exif库使用
      • 九、Canvas画布
      • 十、动态创建标签并添加绑定事件
      • 十一、utils方法
      • 十二、vue中图片预览
      • 十三、工具网站

一、阅读须知

小帅爆肝整理的这篇文章,内容比较多,帅帅的你值得看一看,有解决方案的核心代码,放到项目中可以直接使用
最近还会更新关于“图片横向合并、纵向合并、图片编辑”的另一篇文章,敬请期待!

二、解决的问题

  • 使用canvas处理图片旋转、导入问题
  • 目前来看,在前端对图片文件进行处理,再传到服务端,性能上是可以的,不必要图片处理逻辑在服务端实现

三、知识储备

  1. 使用<input type="file">标签得到的File文件格式对象如下
    在这里插入图片描述
  2. 图片Base64编码的格式(可以直接使用<img> <el-image>标签进行渲染)
    在这里插入图片描述

四、解决方案

如果使用canvas实现对图片的旋转目前有两种方案

  1. 利用canvas的translate()平移函数 + rotate()旋转函数 + drawImage()函数 实现,这种方式存在更复杂的数学计算问题
  2. 利用canvas的 rotate()旋转函数 + drawImage()函数 实现(本篇使用的解决方案),下文提供代码案例

五、核心代码

  • 解决方案2对应的核心代码,解决将图片顺时针旋转90°、180°、270°问题
  • 如下代码drawImage()函数中的img参数为new Image()对象,或者其它符合函数要求的参数类型
// 创建canvas
const selfCanvas = document.createElement('canvas')
const selfCtx = selfCanvas.getContext('2d')

if (angle == '90') { // 顺时针旋转90度
  selfCanvas.width = img.height
  selfCanvas.height = img.width
  selfCtx.rotate(90 * Math.PI / 180);
  selfCtx.drawImage(img, 0, 0, img.width, -img.height)       
} else if (angle == '180') { // 顺时针旋转180度
  selfCanvas.width = img.width
  selfCanvas.height = img.height
  selfCtx.rotate(180 * Math.PI / 180)
  selfCtx.drawImage(img, -img.width, -img.height, img.width, img.height)
} else if (angle == '270') { // 顺时针旋转270度
  selfCanvas.width = img.height
  selfCanvas.height = img.width
  selfCtx.rotate(270 * Math.PI / 180)
  selfCtx.drawImage(img, -img.width, 0, img.width, img.height)        
} else { // 不进行任何旋转
  selfCanvas.width = img.width
  selfCanvas.height = img.height
  selfCtx.drawImage(img, 0, 0, img.width, img.height)
}

六、参考资料

  1. 得到图片文件File的URL
img.src = URL.createObjectURL(imgFile)
  1. 相关api函数方法
  • createObjectURL(obj):返回一个URL 对象表示指定的 File 对象(生成blob:http://www.xxxx.com/xx的链接,可以直接在网页上打开File内容)或 Blob 对象(用于下载),obj为 File 对象、Blob 对象或者 MediaSource 对象
  • revokeObjectURL(objURL):在每次调用 createObjectURL() 方法时,都会创建一个新的 URL 对象,即使你已经用相同的对象作为参数创建过。当不再需要这些 URL 对象时,每个对象必须通过调用 URL.revokeObjectURL() 方法来释放,objURL为URL.createObjectURL(obj) 返回的对象
  • arr = new Uint8Array(length):返回一个长度为length的8位无符号整型数组(存储大小为0~256,负数会自动加256转为整数,超出-256),创建时内容被初始化为0
  • new Blob(arr,options):返回一个blob对象(可理解为二进制的数据对象),常用用于文件下载
  • canvas.toBlob(callback, type, quality):创造 Blob 对象,用以展示 canvas 上的图片;这个图片文件可以被缓存或保存到本地,具体参数:
    • allback:回调函数,可获得一个单独的 Blob 对象参数。如果图像未被成功创建,可能会获得 null 值
    • type:指定图片格式,默认格式(未指定或不支持)为 image/png
    • quality:值在 0 与 1 之间,当请求图片格式为 image/jpeg 或者 image/webp 时用来指定图片展示质量。如果这个参数的值不在指定类型与范围之内
  1. 在h5中,使用input的type="file"和capture="camera"这两个属性就可以调用摄像头
  2. 如果使用document.createElement()动态创建的元素,通过如下的方法得到输入的值
// 创建一个input元素
var inputElem = document.createElement("input");
// 获取input的值
var inputValue = inputElem.value;
// 如果input标签type="file"
// 得到文件对象File
var file = inputElem.files
  1. 如果input标签不是动态创建的,是已经写好的html元素,则可以在change=“methodsName(e)”,通过e.target.files获得文件对象
  2. Vue中可以使用如下方式添加、移除事件
// 绑定事件 可以进行监听
addEventListener()
// 移除事件
removeEventListener()
  1. 关于<input>标签中的webkitdirectory属性参考:https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLInputElement/webkitdirectory
  2. 使用FormData对象上传文件
const formData = new FormData()
formData.append('file', File)

七、FileReader()对象

  • FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
  • FileReader实例拥有4个方法,3个用来读取文件,一个用来中断读取
    • abort 参数none 中断读取
    • readAsBinaryString 参数file 将文件读取为二进制码
    • readAsDataUrl 参数file 将文件读取为data:开头的字符串,实质就是Data URL 是将小文件(图像等)直接嵌入文档的方案,base64的方式由此来获得
    • readAsText file,[encoding] 文本方式读取文件,读取结果是文本的内容
  • 读取结果会存储在FileReader的result属性中,处理事件简介:
    • onabort 中断时触发
    • onerror 出错时触发
    • onload 读取成功时触发
    • onloadend 读取完成时触发 无论成功失败
    • onloadstart 读取开始时触发
    • onprogress 读取中
  • 文件开始读取后无论成功失败都会填充result属性,读取失败result属性会赋值null,否则会填充读取结果
  • onload读取成功之后,直接将base64赋值给img元素的src属性,就可以预览图片了
  • 使用FileReader对象将File转成base64代码案例
// 图片file转base64方法(file文件,回调函数)
  fileToBase64(file, callback) {
    // 创建FileReader对象(不兼容IE)
    let reader = new FileReader();
    // 将file转为base64 (异步操作)
    reader.readAsDataURL(file); 
    // 转换成功
    reader.onload = () => {
      const response = {
        status: true,
        data: reader.result
      }
      callback(response);
    };
    // 转换失败
    reader.onerror = function () {
      const response = {
        status: false,
        data: reader.error
      }
      callback(response);
    };
  }

// 调用方法
fileToBase64(imgFile, (res) => {
  if(res.status) {
    console.log('file转化成base64成功---',res.data)
  } else {
    console.log('file转化base64失败---',res.data)
  }
})

八、Exif库使用

  1. 用Exif获取图像的原始数据,例如:拍照方向,拍摄事件,ISO感光度,GPS地理位置等数据
  2. vue中引入exif-js
npm install exif-js --save   
  1. Exif提供的部分API方法
    • Exif.getData(img,callback) 获取图像数据
    • Exif.getTag(img,tag) 获取图像的某个数据
    • Exif.getAllTags(img) 获取图像的全部数据
    • Exif.pretty(img) 获取图像的全部数据,值以字符串的形式范围
  • 其中Exif中orientation不同的值代表不同的方向
  1. Exif的npm仓库地址:https://www.npmjs.com/package/exif-js
  2. Exif的GitHub地址:https://github.com/exif-js/exif-js
    上述两个地址里面有使用参考文档
  3. 前端开发工具箱:http://code.ciaoca.com/

九、Canvas画布

  1. canvas是一个容器(画布),他的getContext()方法用来获取一个对象,这个对象提供了在画布上绘图的方法和属性
  2. 菜鸟教程中关于canvas资料:https://www.runoob.com/tags/ref-canvas.html
  3. w3school中的canvas资料:https://www.w3school.com.cn/jsref/dom_obj_canvas.asp
  4. 资料网站:https://www.twle.cn/l/yufei/canvas/canvas-basic-index.html

十、动态创建标签并添加绑定事件

var input = document.createElement('input'); 
input.setAttribute('value', ''); 
input.setAttribute('type', 'text'); 
input.setAttribute('class', 'my-custom-input'); 

document.body.appendChild(input); 

//Change event listener 
input.addEventListener('change', function(e) { 
    console.log('I just changed'); 
}, false);

十一、utils方法

  1. 从base64代码中获取图片的宽高
var i = new Image();  //创建一个临时存储
i.onload = function(){  //定义加载图片后弹出显示
 alert( i.width+", "+i.height );
};
i.src = imageData //将图片数据赋值即可
  1. base64转文件
dataURLtoFile(dataurl) {
    var arr = dataurl.split(',')
    var bstr = atob(arr[1])
    var n = bstr.length
    var u8arr = new Uint8Array(n)
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n)
    }
    return new File([u8arr], 'image', {
      type: 'image'
    })
  }

十二、vue中图片预览

  1. 使用远程的<img>标签
  2. 使用element-ui的<el-image>标签
  3. 使用element-ui的<el-image-viewer>
<el-image-viewer v-if="imgViewerVisible" :on-close="closeImgViewer" :url-list="imgList" />
  1. 使用v-viewer库

十三、工具网站

  1. base64转图片:http://www.atoolbox.net/Tool.php?Id=1024
  2. vue图片裁剪插件(vue-picture-cut 2.x):https://gitee.com/light-year/vue-picture-cut

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 Java 实现【异常的打卡记录】【2023Q1 100分】

一、题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据&#xff0c;也是计算职工工资的原始依据。 为了正确地计算职工工资和监督工资基金使用情况&#xff0c;公司决定对员工的收集打卡记录进行异常排查。 如果出现以下两种情况&#xff0c;则认为打卡异常&…

持续引领 | 通付盾入选数说安全《2023年中国网络安全市场全景图》!

5月16日&#xff0c;数说安全正式发布《2023年中国网络安全市场全景图》&#xff08;以下简称全景图&#xff09;&#xff0c;这是自2018年开始&#xff0c;数说安全发布的第六版全景图。 其中&#xff0c;通付盾入选自动化攻击防护&#xff08;Anti-Bot&#xff09;、移动应用…

【软件工程】面向对象开发全面总结

文章目录 前言一、引言二、面向对象开发的含义三、面向对象开发的原则1. 封装原则2. 继承原则3. 多态原则4. 抽象原则5. 接口隔离原则6. 依赖倒置原则 四、面向对象开发的基本原则1. 单一职责原则2. 开放封闭原则3. 里氏替换原则 五、面向对象开发的方法1. 面向对象分析&#x…

阿里云服务器安装MySQL的具体步骤

1.首先打开阿里云&#xff0c;找到自己对于的公网ip 2.这里我使用MobaXterm的远程连接工具&#xff0c;这个工具还是很不错的耶&#xff0c;就是复制上图的公网ip地址 3.填写完成之后&#xff0c;会让你输入你阿里云服务端登入的密码&#xff0c;也就是你阿里云重置实例的密码&…

深度学习的十条调参经验

目录 法则一:调参、模型和数据 1、调参是锦上添花的事 2、模型 3、数据

富文本编辑器 kindeditor 使用整理

kindeditor富文本编辑器忘记什么时候添加到项目中了&#xff0c;最近做一个功能需要在原有编辑器上自定义添加一些固定内容&#xff0c;于是对着编辑器文档研究了一番&#xff0c;在这里做一个使用方式整理。 1.下载kindeditor 下载地址如下&#xff1a; https://github.com/…

视频平台。。。。 。

1.py 读取图片视频流 from flask import Flask from flask import render_template import os images_path_list[‘D:\imgs\’filename for filename in os.listdir(‘D:\imgs\’) if filename.endswith(‘.jpg’)] print(images_path_list) def return_img_stream(img_local_p…

城市内涝监测预警系统解决方案

一、方案背景 城市化进程的逐渐加快&#xff0c;城市内人口大量增多&#xff0c;交通运输压力增大&#xff0c;城市建设越来越密集&#xff0c;道路铺建面积越来越多&#xff0c;城市化的发展改变了城市区域的地表环境&#xff0c;致使城市雨水不能像农村或是古代雨水那样&…

JVM调优神器,运用 Arthas 释放 Java应用性能的全部潜力

Arthas、jstack、jstat 和 jmap 都是 Java 调优工具&#xff0c;但它们之间有以下区别&#xff1a; Arthas 是一款全新的 Java 诊断与调试工具&#xff0c;不仅可以执行传统的 JVM 监控命令&#xff0c;还提供了许多其他高级特性&#xff0c;如实时监控、动态修改代码、反编译…

什么是容器

什么是容器 一&#xff1a;概念二&#xff1a;容器API类图2.1 Collection2.2 Set2.3 List2.4 Map 三&#xff1a;详细解释3.1 Collection接口3.1.1 Collection用法 3.2 Iterator接口3.3 List接口3.4 Comparable接口 四&#xff1a;如何选择数据结构4.1 衡量标准&#xff1a;读的…

CRM系统本地部署和云部署的优缺点

众所周知&#xff0c;CRM系统部署方式有两种&#xff0c;分别是本地部署和云部署。两者各有优缺点&#xff0c;企业可以按照自身的需求来进行选择。下面说说CRM不同部署方式的优缺点。 CRM本地部署 本地部署是指将CRM系统安装在企业自己的服务器上&#xff0c;并由企业自行维…

网工届封神的五条命令

文章目录 前言一、PING:测试与目标主机的连通性二、IPCONFIG:显示网络适配器的IP地址三、tracert:测试到达目标主机的路径四、arp -a:查询本机高速缓存项目五、route print&#xff1a;查看计算机路由表中的项目 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#…

【密码产品篇】VPN产品密钥体系结构

【密码产品篇】VPN产品密钥体系结构 VPN产品只有"设备密钥"是"非对称密钥"—【蘇小沐】 IPSec VPN密钥体系 IPSec VPN密钥体系&#xff1a;设备密钥、工作密钥、会话密钥。 IPsec VPN作用设备密钥非对称密钥对&#xff0c;包括签名密钥对和加密密钥对&a…

axios 的 qs库

1.axios官网中提到的qs库 axios官网 2. content-type和 参数 的关系 content-type : application/json&#xff0c;要求的参数格式是JSON {a:c,b:d }content-type :application / x-www-form-urlencoded 要求的参数格式是键值对拼接的方式 :keyvalue&keyvalue ac&bd…

Powerflex ready node

1 网络交换机 需要配置 2 网卡配置 3 磁盘残留信息清楚 4 磁盘顺序如何设置固定 特别是sda这块 #rpm -qa | grep EMC --查看当前安装的EMC Powerflex组件信息 安装客户端注意 需要使用如下 rpm --import RPM-GPG-KEY-ScaleIO #MDM_IP10.10.10.xx,10.10.20.xx rpm -i EMC-…

webpack将vue3单页面应用改造成多页面应用

上篇文章搞了个单页面vue&#xff0c;现在要将其改成多页面&#xff0c;只是简单尝试&#xff0c;给了例子 其实也就是改个webpack的入口和html模版的配置&#xff0c;其他的话&#xff0c;每个页面都有自己的vue和路由实例&#xff0c;pinia的话就共享吧 &#xff01;import…

界面控件DevExpress Blazor UI v22.2 - 报表、富文本编辑器组件增强

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具&#xff0c;该组件拥有众多新产品和数十个具有高影响力的功能&#xff0c;可为桌面、Web和移动应…

Linux做爬虫被封IP怎么办

如果您的 Linux 爬虫被目标网站封禁了 IP 地址&#xff0c;可以考虑以下几种解决方案&#xff1a; 1、切换 IP 地址 您可以使用代理服务器或 PPTP 等工具来改变您的 IP 地址。这些工具可以模拟不同的网络位置并使您的爬虫变得更加隐蔽。例如在 Python 中&#xff0c;可以通过…

Maven基础学习---2、Maven安装与配置

1、Maven核心程序解压与配置文件 1、Maven官网地址 首页&#xff1a; Maven – Welcome to Apache Maven(opens new window) 下载页面&#xff1a; Maven – Download Apache Maven(opens new window) 下载链接&#xff1a; 具体下载地址&#xff1a;https://dlcdn.apache.…

爱奇艺新财报:转机频频

配图来自Canva可画 今年开年&#xff0c;一部《狂飙》拉开了剧集大幕。据灯塔专业版数据显示&#xff0c;《狂飙》的全网正片播放市占率最高超过30%&#xff0c;春节期间稳定在25%以上。《狂飙》的爆火在观众群体中掀起了一波追剧狂潮&#xff0c;除了一路“狂飙”的收视率外&…