Vue简单的图片上传解决拍出来的照片旋转问题

项目经常会用到图片上传的功能不管是PC端还是移动端,今天整理一下代码:
之前做移动端上传图片的时候,会发现,有些图片没有旋转过来,然后,我们只要引入这个插件,就能解决这个问题。
先安装插件exif-js:

npm install exif-js --save

在需要的页面引入

import Exif from 'exif-js'

上传图

uploadImgs (e) {
  let file = e.target.files || e.dataTransfer.files
  if (!file.length) {
    return
  }
  var picavalue = file[0]
  this.imgPreview(picavalue)
},
imgPreview (file, callback) {
  const that = this
  // 创建一个reader
  const reader = new FileReader()
  const img = new Image()

  if (!file || !window.FileReader) return
  if (/^image/.test(file.type)) {
    // eslint-disable-next-line
    let Orientation = null
    // 去获取拍照时的信息,解决拍出来的照片旋转问题
    Exif.getData(file, () => {
      Orientation = Exif.getTag(file, 'Orientation')
    })

    // 读取成功后的回调
    reader.onloadend = function () {
      console.log('==this.result===', this.result)
      const result = this.result
      img.src = result
      img.onload = function () {
        console.log('===Orientation===', Orientation)
        console.log('===img===', img)
        const data = that.compress(img, 0.1, Orientation)
        const blob = that.dataURItoBlob(data)
        const formData = new FormData()
        var nameImg = new Date().getTime() + '.jpg'
        formData.append('file', blob, nameImg)
        // 发送请求
        // 代码自己写把formData传给后台就可以了
      }
    }
    // 将图片转成base64格式
    reader.readAsDataURL(file)
  } else {
    this.$toast('请上传正确的图片格式')
  }
},
// 压缩图片
compress (img, compressNum, Orientation) {
  const canvas = document.createElement('canvas')
  const ctx = canvas.getContext('2d')
  const width = img.width
  const height = img.height
  canvas.width = width
  canvas.height = height
  // 铺底色
  ctx.fillStyle = '#fff'
  ctx.fillRect(0, 0, canvas.width, canvas.height)
  if (Orientation && Orientation !== 1) {
    switch (Orientation) {
      case 6:
        canvas.width = height
        canvas.height = width
        ctx.rotate(Math.PI / 2)
        ctx.drawImage(img, 0, -height, width, height)
        break
      case 3:
        ctx.rotate(Math.PI)
        ctx.drawImage(img, -width, -height, width, height)
        break
      case 8:
        canvas.width = height
        canvas.height = width
        ctx.rotate(3 * Math.PI / 2)
        ctx.drawImage(img, -width, 0, width, height)
        break
    }
  } else {
    ctx.drawImage(img, 0, 0, width, height)
  }

  // 进行压缩 compressNum - 图片质量:取值范围为0到1
  const ndata = canvas.toDataURL('image/jpeg', compressNum)
  return ndata
},
// base64转成bolb对象
dataURItoBlob (base64Data) {
  var byteString
  if (base64Data.split(',')[0].indexOf('base64') >= 0) {
    byteString = atob(base64Data.split(',')[1])
  } else {
    byteString = unescape(base64Data.split(',')[1])
  }
  var mimeString = base64Data
    .split(',')[0]
    .split(':')[1]
    .split(';')[0]
  var ia = new Uint8Array(byteString.length)
  for (var i = 0; i < byteString.length; i++) {
    ia[i] = byteString.charCodeAt(i)
  }
  return new Blob([ia], { type: mimeString })
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好,关于如何解决vue项目中上传图片旋转问题,可以考虑使用exif-js库来读取图片的Exif信息,并根据旋转角度进行旋转处理,最后再上传图片。具体代码可以参考下面的示例: ``` // 安装 exif-js 库 npm install exif-js --save // 引入 exif-js 库 import EXIF from 'exif-js'; // 假设选择的图片为 file 对象 const file = ...; // 读取图片的 Exif 信息 EXIF.getData(file, function() { // 获取旋转角度信息 const orientation = EXIF.getTag(this, "Orientation"); // 根据旋转角度进行旋转处理 let canvas = document.createElement('canvas'); let ctx = canvas.getContext('2d'); let img = document.createElement('img'); img.onload = function() { if ([5,6,7,8].indexOf(orientation) > -1) { canvas.width = img.height; canvas.height = img.width; } else { canvas.width = img.width; canvas.height = img.height; } switch (orientation) { case 2: ctx.transform(-1, 0, 0, 1, img.width, 0); break; case 3: ctx.transform(-1, 0, 0, -1, img.width, img.height); break; case 4: ctx.transform(1, 0, 0, -1, 0, img.height); break; case 5: ctx.transform(0, 1, 1, 0, 0, 0); break; case 6: ctx.transform(0, 1, -1, 0, img.height, 0); break; case 7: ctx.transform(0, -1, -1, 0, img.height, img.width); break; case 8: ctx.transform(0, -1, 1, 0, 0, img.width); break; default: ctx.transform(1, 0, 0, 1, 0, 0); } ctx.drawImage(img, 0, 0); const rotatedDataUrl = canvas.toDataURL('image/jpeg'); // 上传旋转后的图片 // ... }; img.src = URL.createObjectURL(file); }); ``` 上述代码中,通过使用exif-js库获取图片旋转角度信息,利用canvas进行旋转处理,最后上传旋转后的图片。 希望可以帮到您!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值