H5网页调取设备拍照生成图片上传

话不多唠,直接上代码
<!-- Dom层大同小异都一样 -->
 <div class="publish">
    <video ref="video" id="videoDom" style="object-fit: cover;"></video>
    <!--canvas的宽高可指定为后台接受图片的宽高,这里的宽高必须制定,不然就是默认宽高-->
    <canvas style="display: none;" id="canvasCamera" width="1654" height="2339"></canvas>
    <!--下面就是拍完照后图片展示区-->
    <div v-if="imgSrc" class="img_bg_camera">
      <img :src="imgSrc" ref="tximg" class="tx_img" />
    </div>
    <button @click="OpenCamera">打开摄像头</button>
    <button @click="CloseCamera">关闭摄像头</button>
    <button @click="setImage">拍照</button>
  </div>
// 这个js是Base64转 file 或 blob方法便于上传,该方法我会放到下面
import { base64ConvertFile } from '@/utils/fileBase64Blob'
export default {
  name: 'CanvasImg',
  data () {
    return {
      imgSrc: '', // 拍照图片
      canvas: null,
      context: null
    }
  },
  mounted () {
    // 进入页面 自动调用摄像头
    this.getCamera()
  },
  methods: {
    // 调用打开摄像头功能
    getCamera () {
      // 获取 canvas 画布
      this.canvas = document.getElementById('canvasCamera')
      this.context = this.canvas.getContext('2d')
      const constraints = {
      // ** 想要高清晰图片需要设置宽高,宽高值根据拍照视口比例计算:以A4纸为例宽高比为1.41<后几位省略>,自己定义一个宽度值算出高度值如:2339/1.41 ≈ 1658 **
        video: {
          width: 2339,
          height: 1658,
          facingMode: { // 这里为后置摄像头,前置摄像头的配置为facingMode: "user"
            exact: "environment" 
          }
        }
      };
      navigator.mediaDevices
        .getUserMedia(constraints)
        .then(function(stream) {
          // console.log(stream, ':stream')
          var video = document.querySelector('#videoDom')
          if ('srcObject' in video) {
            video.srcObject = stream
          } else {
            video.src = window.URL.createObjectURL(stream)
          }
          video.onloadedmetadata = function (e) {
            video.play()
          }
        })
        .catch(function(err) {
          alert(err.name + ': ' + err.message)
        })
    },
    // 拍照 绘制图片
    setImage () {
      this.context.drawImage(
        this.$refs.video,
        0,
        0,
        1654,
        2339
      )
      // 获取图片base64链接
      const image = this.canvas.toDataURL('image/jpg')
      // console.log(image)
      this.$emit('refreshDataList', base64ConvertFile(image))
    },
    // 打开摄像头
    OpenCamera () {
      this.getCamera()
    },
    // 关闭摄像头
    CloseCamera () {
      this.$refs.video.srcObject.getTracks()[0].stop()
    }
  }
}
// fileBase64Blob.js
/* base64转file */
export const base64ConvertFile = function (urlData, filename) {
  if (typeof urlData != 'string') {
    return
  }
  let arr = urlData.split(',')
  let type = arr[0].match(/:(.*?);/)[1]
  let fileExt = type.split('/')[1]
  let bstr = atob(arr[1])
  let n = bstr.length
  let u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new File([u8arr], 'filename.' + fileExt, {
    type: type
  })
}
/* base64转blob */
export const dataURItoBlob = (dataURI) => {
  let byteString = atob(dataURI.split(',')[1])
  let mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]
  let ab = new ArrayBuffer(byteString.length)
  let ia = new Uint8Array(ab)
  for (var i = 0; i < byteString.length; i++) {
    ia[i] = byteString.charCodeAt(i)
  }
  return new Blob([ab], { type: mimeString })
}
/*file转base64方法*/
// let reader = new FileReader()
// reader.readAsDataURL(file[0])
// console.log(reader)
为什么没有style样式呢,懒得动懒得写全靠你们自由发挥。。。。。。。。。。。。!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用uniapp结合uView进行拍照上传图片的过程中,可以通过以下步骤实现: 1. 在模板中设置一个按钮,用于触发拍照事件: ``` <view class="u-upload" @click="takePhoto"> <u-icon class="u-icon-upload" name="camerafill"></u-icon> </view> ``` 2. 在methods中实现takePhoto方法,用于触发拍照事件: ``` takePhoto() { const camera = uni.chooseImage({ count: 1, // 一次只能拍摄一张照片 sourceType: ['camera'], // 指定拍照来源为相机 success: (res) => { // 上传图片 this.uploadImage(res.tempFilePaths[0]); }, fail: (err) => { uni.showToast({ icon: 'none', title: '拍照失败' }); console.error(err); } }); }, ``` 3. 在uploadImage方法中,使用uni.uploadFile方法上传图片,并在success回调函数中获取上传后的图片地址: ``` uploadImage(filePath) { const upload = uni.uploadFile({ url: 'your-upload-api', // 上传图片的接口地址 filePath: filePath, name: 'file', // 上传图片时的参数名 success: (res) => { const imageUrl = JSON.parse(res.data).data.url; // 解析上传后的图片地址 // 将图片地址赋值给data中的imageUrl变量 this.imageUrl = imageUrl; }, fail: (err) => { uni.showToast({ icon: 'none', title: '上传失败' }); console.error(err); } }); }, ``` 4. 最后将生成的图片地址赋值给data中的imageUrl变量即可: ``` data() { return { imageUrl: '' }; } ``` 以上步骤适用于在H5端使用uniapp结合uView进行拍照上传图片,希望能够帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值