当前位置: 首页 > 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);});}}
}

相关文章:

  • 对盒模型的理解
  • 【css】【面试提问】css经典问题总结
  • 使用 OpenCV 实现 ArUco 码识别与坐标轴绘制
  • LinuxYUM下载笔记
  • Web UI自动化测试之PO篇
  • outlook怎么用163邮箱
  • Ubuntu 远程桌面配置指南
  • Baklib Headless CMS 全面介绍
  • python打卡训练营打卡记录day30
  • Ubuntu20.04系统下使用交叉编译工具链(aarch、x86)交叉编译opencv4.5.0
  • FreeMarker
  • 微机系统第二章-题目整理
  • 嵌入式学习--江协51单片机day8
  • 卷积神经网络基础(九)
  • Vue-样式绑定-class
  • liunx定时任务,centos定时任务
  • 前端工程的相关管理 git、branch、build
  • Git上传项目到GitHub
  • 企业销售管理痛点解析与数字化解决方案
  • CVE-2015-1422 Gecko CMS CSRF添加管理员
  • 张核子“限高”次日即被解除,前员工的执行款3个月后仍未到账
  • 小米法务部:犯罪团伙操纵近万账号诋毁小米,该起黑公关案告破
  • 最高法:依法惩治损害民营企业合法权益的串通投标行为
  • 九江银行落地首单畜牧业转型金融业务,助推传统农业绿色智能
  • 玉林一河段出现十年最大洪水,一村民被冲走遇难
  • 打造信息消费新场景、新体验,上海信息消费节开幕