在项目需求要求下,了解到用HTML5调用摄像头来实现拍照功能,今天就把大致的实现过程写下来。
由于系统前端是用angular7 来开发的,下面我就展示如何在angular环境使用Camera API调用。
引用一下官方的说明:
通过Camera API,你可以使用手机的摄像头拍照,然后把拍到的照片发送给当前网页.这些操作主要是通过一个input元素来实现的,其中该元素的type属性必须为"file",accept属性要允许图片格式,这样才能知道这个文件选择框是用来选择图片的.
HTML页面
<button id="picture" (click)="picture()">拍照</button><input type="file" capture="camera" (change)="changeImg($event)"accept="image/*" id="cameraInput" style="display: none" name="cameraInput"><p><img src="" alt="" id="show-picture"></p>
当用户激活这个HTML元素的时候,系统会呈现给用户一个选择界面,其中一个选项是选择本地的图片文件,另一个选项是要通过摄像头直接 拍摄照片作为所选文件.如果用户选择了摄像头,则会进入手机的拍照模式.拍照结束后,,用户可以选择确定还是放弃.如果接受了,则该照片会作为所选文件发 送给那个<input type="file">元素,同时触发该元素的onchange事件.
TS代码
这里我是为了系统方便,将调用封装成公共的方法注册到service中
xxx.service.ts
import { Injectable } from '@angular/core';@Injectable({providedIn: 'root'})export class CameraService {constructor(){}//传入参数 1.需要展示照片的dom元素,2.eventtakePicture(showPictureSrc,event) {var files = event.target.files, file;if (files && files.length > 0) {file = files[0];console.log(file)try {var fileReader = new FileReader();fileReader.onload = (event) => {// showPictureSrc.src = event.target.result;showPictureSrc.src = (event.target as any).result;};fileReader.readAsDataURL(file);}catch (e) {console.log(e.error)}}}}
原因:因为fileReader.readAsDataURL会将图片转换成base64编码,再通过FileReader对象的onload方法返回回来,但是TypeScript编译器不知道返回的是一个什么类型,event.target默认是"EventTarget"类型,而result是"string"类型,所以会报错
解决方法:showPictureSrc.src = (event.target as any).result;
TS主文件调用方法
import { Component, OnInit } from '@angular/core';import { NzMessageService } from 'ng-zorro-antd';// 引入serviceimport {CameraService} from './services/camera.service'@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css']})export class AppComponent implements OnInit {showPicture;constructor(private message: NzMessageService,private camera: CameraService) { }ngOnInit() {this.showPicture = document.getElementById('show-picture');}// 点击拍照按钮 触发相应的拍照或者相册选择文件事件picture() {let that = this;var cameraInput = document.getElementById('cameraInput');var a=document.createEvent("MouseEvents");a.initEvent("click", true, true);//绑定操作cameraInput.dispatchEvent(a);}//调用封装的方法 注意参数 1 传入需要展示的image的dom元素changeImg(event) {const that = this;that.showPicture.style.display = 'block';that.camera.takePicture(that.showPicture,event);}//如果需要将图片传给后台, 参数src给接口就可以了submitImg() {console.log(this.showPicture.src);}}
大功告成了!
兼容性问题

测试效果还OK,可能会存在上述兼容性问题,如果要实现拍照蒙版,只能在图片获取到页面后再截取图片,无法实现给调用的本机摄像界面添加蒙版取景框。




