vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理

作者:东河村长 时间:2024-05-10 14:14:25 

一、前言

三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学习。

图片的上传之前都是用的插件(ajaxupload),或者传统上传图片的方式,各有利弊:插件的问题是依赖jq并且会使系统比较臃肿,还有传统的web开发模式 前后端偶尔在一起及对用户体验要求低,现在公司采用webpack+vue+restfullApi开发模式 前后端完全分离,遵从高内聚,低偶尔的原则,开发人员各司其职,一则提升开发效率(从长期来看,短期对于很多开发人员需要有个适应的过程,特别是初中级的前端处理业务逻辑方面的能力比较欠缺),二则提升用户体验。今天分享下在项目开发中写的的图片上传 vue组件。

二、处理问题

这里用h5做图片上传考虑到浏览器支持的问题,这里考虑的场景是在做webapp的时候

1.移动web图片上传还包括拍摄上传,但是在移动端会出现拍摄的照片会旋转,处理这个问题需要得到图片旋转的情况,可以用exif.js来获取,具体可以参看文档

2.图片压缩

3.旋转

三、代码

1组件代码


<template>
<div>
 <input type="file" style="display: none;" id="img-upload" multiple accept="image/*" @change="uploadImg($event)"/>
</div>
</template>
<script>
import EXIF from '../../../Resource/Global/Js/exif'
export default{
 name:"image-html5-upload",
 props:{
  imgArr:{
   type:Array,
   twoWay: true,
   default:Array
  },
  imgNumLimit:{//一次最多可以上传多少张照片
   type:Number,
   default:4
  }
 },
 methods:{
  "uploadImg": function(e){
   let tag = e.target;
   let fileList = tag.files;
   let imgNum = fileList.length;
   let _this = this;
   _this.imgArr = [];//图片数据清零
   if(this.imgArr.length + imgNum > this.imgNumLimit){
    alert('一次最多上传'+this.imgNumLimit+'张图片!');
    return;
   }
   var Orientation;
   for(let i=0;i<imgNum;i++){
    EXIF.getData(fileList[i], function(){
     Orientation = EXIF.getTag(fileList[i], 'Orientation');
    });
    let reader = new FileReader();
    reader.readAsDataURL(fileList[i]);
    reader.onload = function(){
     var oReader = new FileReader();
     oReader.onload = function(e) {
      var image = new Image();
      image.src = e.target.result;
      image.onload = function() {
       var expectWidth = this.naturalWidth;
       var expectHeight = this.naturalHeight;
       if (this.naturalWidth > this.naturalHeight && this.naturalWidth > 800) {
        expectWidth = 800;
        expectHeight = expectWidth * this.naturalHeight / this.naturalWidth;
       } else if (this.naturalHeight > this.naturalWidth && this.naturalHeight > 1200) {
        expectHeight = 1200;
        expectWidth = expectHeight * this.naturalWidth / this.naturalHeight;
       }
       var canvas = document.createElement("canvas");
       var ctx = canvas.getContext("2d");
       canvas.width = expectWidth;
       canvas.height = expectHeight;
       ctx.drawImage(this, 0, 0, expectWidth, expectHeight);
       var base64 = null;
       //修复ios上传图片的时候 被旋转的问题
       if(Orientation != "" && Orientation != 1){
        switch(Orientation){
         case 6://需要顺时针(向左)90度旋转
          _this.rotateImg(this,'left',canvas);
          break;
         case 8://需要逆时针(向右)90度旋转
          _this.rotateImg(this,'right',canvas);
          break;
         case 3://需要180度旋转
          _this.rotateImg(this,'right',canvas);//转两次
          _this.rotateImg(this,'right',canvas);
          break;
        }
       }
       base64 = canvas.toDataURL("image/jpeg", 0.8);
       if(fileList[i].size / 1024000 > 1){
        _this.imgScale(base64, 4)
       }else{
        _this.imgArr.push({"src": base64});
       }
       console.log(JSON.stringify(_this.imgArr));
      };
     };
     oReader.readAsDataURL(fileList[i]);
    }
   }
  },
  "imgScale": function(imgUrl,quality){
   let img = new Image();
   let _this = this;
   let canvas = document.createElement('canvas');
   let cxt = canvas.getContext('2d');
   img.src = imgUrl;
   img.onload = function(){
    //缩放后图片的宽高
    let width = img.naturalWidth/quality;
    let height = img.naturalHeight/quality;
    canvas.width = width;
    canvas.height = height;
    cxt.drawImage(this, 0, 0, width, height);
    _this.imgArr.push({"src": canvas.toDataURL('image/jpeg')});
   }
  },
  "rotateImg":function (img, direction,canvas) {//图片旋转
   var min_step = 0;
   var max_step = 3;
   if (img == null)return;
   var height = img.height;
   var width = img.width;
   var step = 2;
   if (step == null) {
    step = min_step;
   }
   if (direction == 'right') {
    step++;
    step > max_step && (step = min_step);
   } else {
    step--;
    step < min_step && (step = max_step);
   }
   var degree = step * 90 * Math.PI / 180;
   var ctx = canvas.getContext('2d');
   switch (step) {
    case 0:
     canvas.width = width;
     canvas.height = height;
     ctx.drawImage(img, 0, 0);
     break;
    case 1:
     canvas.width = height;
     canvas.height = width;
     ctx.rotate(degree);
     ctx.drawImage(img, 0, -height);
     break;
    case 2:
     canvas.width = width;
     canvas.height = height;
     ctx.rotate(degree);
     ctx.drawImage(img, -width, -height);
     break;
    case 3:
     canvas.width = height;
     canvas.height = width;
     ctx.rotate(degree);
     ctx.drawImage(img, -width, 0);
     break;
   }
  }
 }
}
</script>

2.使用方法


<template>
<div>
 <div class="album-img-list">
  <ul>
   <li v-for="img in imgList"><div class="album-bg-img"><img :src='img.src'> </div></li>
  </ul>
 </div>
 <div class="album">
  <label for="img-upload">上传照片</label>
   <image-html5-upload :img-arr.sync="imgList"></image-html5-upload>
 </div>
</div>
</template>

以上所述是小编给大家介绍的vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理网站的支持!

来源:http://www.cnblogs.com/net-xiejun/p/5901598.html

标签:vue,组件,上传
0
投稿

猜你喜欢

  • python获取图片颜色信息的方法

    2023-11-10 16:40:41
  • 关于python如何生成exe文件

    2021-06-05 00:52:33
  • 基于Python制作一个汇率换算程序

    2022-05-25 20:33:25
  • 如何完美的建立一个python项目

    2021-02-20 21:07:26
  • web标准常见问题集合

    2013-12-25 15:51:19
  • 正则 global 属性介绍

    2008-03-18 20:50:00
  • phar绕过phar与HALT实现文件上传功能

    2023-05-25 06:47:36
  • 对tensorflow中cifar-10文档的Read操作详解

    2022-08-10 06:59:10
  • Python 实现某个功能每隔一段时间被执行一次的功能方法

    2021-11-14 09:57:25
  • python pyqtgraph 保存图片到本地的实例

    2023-05-08 01:15:11
  • Python统计文件中去重后uuid个数的方法

    2023-07-11 17:20:06
  • 如何使用python对图片进行批量压缩详解

    2022-12-05 04:22:25
  • 微信公众平台开发——群发信息

    2023-05-19 16:18:48
  • Vue项目中使用setTimeout存在的潜在问题及解决

    2024-05-28 16:00:14
  • py中的目录与文件判别代码

    2023-06-01 03:32:06
  • 使用Djongo模块在Django中使用MongoDB数据库

    2024-01-21 21:10:17
  • Python 处理表格进行成绩排序的操作代码

    2022-08-25 02:49:36
  • python等待10秒执行下一命令的方法

    2022-02-25 00:40:03
  • ECharts设置x轴刻度间隔的2种解决方法

    2023-08-28 04:18:38
  • pycharm2020.2 配置使用的方法详解

    2022-10-01 12:23:23
  • asp之家 网络编程 m.aspxhome.com