当前位置: 首页 > news >正文

vue Element-ui对图片上传和选用时的比例控制

vue Element-ui对图片上传和选用时的比例控制

在后台上传图片和选用已经上传的图片时,往往会因为图片的比例控制不到位导致在客户端渲染时效果差强人意,虽然可以在操作时选择合适的比例上传,但必要的控制还是能完成渲染时良好的体验,今天就分享一个vue+Element-ui上传图片和选用图片场景时,对图片比例控制的方法。

知识点

关键的判断其实就是利用了js 的new image()对象来完成图片比例的控制的。

这里介绍一下关于new image()用法。
Image 对象是 JS 中的内置对象,它代表嵌入的图像。当我们创建一个 Image 对象时,就相当于给浏览器缓存了一张图片,Image 对象也常用来做预加载图片(也就是将图片预先加载到浏览器中,当浏览图片的时候就能享受到极快的加载速度)。在HTML页面中, 标签每出现一次,也就创建了一个 Image 对象。

var img=new Image();
img.src="img.png";
img.οnlοad=function(){console.log(img.width,img.height);
};

在创建 Image 对象后,如果没有给它的 width 和 height 属性赋值,那它的 width 和 height 的默认值都为0,定义Image对象的src=”xxx.jpg”; 这样做就相当于给浏览器缓存了一张图片,在img的onload事件中,也就是被浏览器解析完成以后,可以获取到该图片的信息。然后,就可以根据宽高信息来做一些判断,以下是实例代码。

上传前控制比例

<el-uploadclass="upload-demo mr10 mb15":action="fileUrl":before-upload="beforeUpload":on-success="handleSuccess":headers="myHeaders":show-file-list="false"multiple><el-button size="small" type="primary">点击上传</el-button>
</el-upload>
<script>
export default{data() {return {myHeaders: { 'X-Token': getToken() },}},computed: {fileUrl() {return SettingMer.https + `/upload/image/${this.tableData.attachment_category_id}/file`;},},methods:{beforeUpload(file){return new Promise((resolve, reject) => {let reader = new FileReader()reader.readAsDataURL(file)reader.onload = () => {let img = new Image()img.src = reader.resultimg.onload = () => {if (img.naturalWidth / img.naturalHeight !== 1) {this.$message.error(`请上传宽高比为1:1的图片!`)return reject(false)} else {return resolve(true)}}}})},// 上传成功handleSuccess(response) {if (response.status === 200) {this.$message.success('上传成功');this.getFileList('');} else {this.$message.error(response.message);}},}
}
</script>

通过封装的组件选用时

getImageSize(url) {//用promise捕捉比例是否合适,不合适返回一个提醒return new Promise((resolve, reject) => {const img = new Image();img.src = url;img.onload = () => {//根据传入的图片url获取宽高比例if (img.width / img.height !== 1) {reject('请选择宽高比为1:1的图片!');} else {resolve(true);}};});
},
modalPicTap(tit, num, i){const _this = this;//封装的图片选择器选择完图片点击确定时的回调this.$modalUpload(function (img){if (tit === '2' && !num){//选用多张时img.forEach((item) => {_this.getImageSize(item).then((res) => {_this.formValidate.slider_image.push(item);}).catch((err) => {this.$message.error(err);});});}if (tit === '1' && num === 'dan') {_this.getImageSize(img[0]).then((res) => {_this.image = img[0];}).catch((err) => {this.$message.error(err);});}}
}

http://www.xdnf.cn/news/527041.html

相关文章:

  • C+++STL(一)
  • 自制操作系统day4(c指针)(指针和数组)(CLI和STI)(EFLAGS)
  • Flink概述
  • 问题 | 代码审查:函数是否包含返回语句
  • C++11特性
  • 计算机视觉设计开发工程师学习路线
  • 远程数据采集智能网关支持下的雨洪资源分布式监测网络搭建实践
  • 【每天一个知识点】embedding与representation
  • 关于 Web 漏洞原理与利用:2. XSS(跨站脚本攻击)
  • Scala 访问修饰符
  • java基础-关键字:static、单例模式
  • JDBC指南
  • 【线下沙龙】NineData x Apache Doris x 阿里云联合举办数据库技术Meetup,5月24日深圳见!
  • [[春秋云境] Privilege仿真场景
  • ElasticSearch 8.x 快速上手并了解核心概念
  • 比较两个用于手写体识别的卷积神经网络(CNN)模型
  • PostgreSQL基本用法
  • 谷歌 NotebookLM 即将推出 Sparks 视频概览:Gemini 与 Deep Research 加持,可生成 1 - 3 分钟 AI 视频
  • 前缀和——和为K的子数组
  • 光纤克尔非线性效应及其在光通信系统中的补偿教程-3.2 克尔效应
  • 分布式与集群:概念、区别与协同
  • 没有 Mac,我如何用 Appuploader 完成 iOS App 上架
  • RabbitMQ的简介
  • React集成百度【JSAPI Three】教程(002):设置不同的环境效果
  • 数据结构(二) 线性表
  • java中的Servlet4.x详解
  • 湖北理元理律师事务所观察:债务服务中的“倾听者价值”
  • 深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务
  • APP小程序抓包和下游代理
  • 云原生攻防2(Docker基础补充)