页面调用手机拍照

背景:使用到手机拍照功能,记录一下

vue 页面:

<input type="file" style="display: none" accept="image/*" capture="camera" id="face_file"
                   multiple="multiple"></input>
<div id="image" >人脸认证</div>

<input type="file" accept="image/*" ></input>

在pc上为上传图片。在手机端为调用拍照或上传相册。设置caputer="camera"后,只有拍照,无上传。multiple="multiple"为允许多传。因为input比较丑,将其隐藏,在div的点击事件中触发input的点击 $("#face_flie").click();

js方法:

$(function () {
        $('#image').click(function(){
          $('#face_file').click();
        });
        $('#face_file').change(function () {
            var sName = this.value;
            if (!sName) {
                //$('#face_file').click();
                return;
            }
            if (test(this.value) == false) {
                //$('#face_file').click();
                return;
            }
            //文件
            this.files[0];
        });
    })

绑定点击方法和变更方法。vue需要引用js.

import $ from "jquery"

npm install 方法(ps:package.json中写了依赖jquery才可以)。或者直接npm install --save jquey

如果想要调用vue的属性或者方法的话可以在vue中添加

window.vm = this;执行时机页面加载完成,mounted  
(PS:created:页面加载完成前
    mounted:页面加载完成后
    methods:方法,调用触发
    watch:监听,变动时触发
    computed:计算属性,未变化时不会执行。
)

照片后续处理:

     可以将图片放入页面,或者存到数据库,也可以base64暂时保存在页面上,随后上传。下面为以base64存在vue的字段里面

            objUrl = getObjectURL(this.files[0]);
            if (objUrl) {
                //ios 需要旋转图片
                getPhotoOrientation(this.files[0]);
                //处理图片base64和旋转
                render(objUrl, 400, 400, sName);
            }
    /**获取路径*/
    function getObjectURL(file) {
        var url = null;
        if (window.createObjectURL != undefined) { // basic
            url = window.createObjectURL(file);
        } else if (window.URL != undefined) { // mozilla(firefox)
            url = window.URL.createObjectURL(file);
        } else if (window.webkitURL != undefined) { // webkit or chrome
            url = window.webkitURL.createObjectURL(file);
        }
        return url;
    }
function render(src, MaximgW, MaximgH, sName) {
        var image = new Image();
        image.onload = function () {
            var canvas = document.getElementById('canvas');
            //检查图片拍摄效果
            //canvas.style.display="block";
            //样式自行控制 显示或隐藏
            $("#face_file").addClass("imgupload-hide");
            //图片压缩
            if (image.width > image.height) {
                imageWidth = MaximgW;
                imageHeight = MaximgH * (image.height / image.width);
            } else if (image.width < image.height) {
                imageHeight = MaximgH;
                imageWidth = MaximgW * (image.width / image.height);
            } else {
                imageWidth = MaximgW;
                imageHeight = MaximgH;
            }
            canvas.width = imageWidth;
            canvas.height = imageHeight;
            //图片放入画布
            var con = canvas.getContext('2d');
            con.clearRect(0, 0, canvas.width, canvas.height);
            //不同手机需要旋转的角度不一样
            if (orient == 6) {
                canvas.width = imageHeight;
                canvas.height = imageWidth;
                var canvas_w = Number(con.canvas.width);
                var canvas_h = Number(con.canvas.height);
                con.save(); //保存状态
                con.translate(canvas_w / 2, canvas_h / 2); //设置画布上的(0,0)位置,也就是旋转的中心点
                con.rotate(90 * Math.PI / 180); //把画布旋转90度
                // 执行Canvas的drawImage语句
                // con.drawImage(image,0,0,image.width,image.height,0,0,imageWidth,imageHeight); //把图片绘制在画布translate之前的中心点,
                con.drawImage(image, Number(0) - canvas_h / 2, Number(0) - canvas_w / 2, imageWidth, imageHeight); //把图片绘制在画布translate之前的中心点,
                // con.drawImage(image, 0,0); //把图片绘制在画布translate之前的中心点,
                con.restore(); //恢复状态
            } else if (3 == orient) {
                //3旋转180
                // angel = 180;
                con.rotate(180 * Math.PI / 180); //把画布旋转90度
                con.drawImage(image, 0, 0, image.width, image.height, 0, 0, imageWidth, imageHeight);
            } else if (8 == orient) {
                //8旋转90
                // angel = 270;
                canvas.width = imageHeight;
                canvas.height = imageWidth;
                var canvas_w = Number(con.canvas.width);
                var canvas_h = Number(con.canvas.height);
                con.save(); //保存状态
                con.translate(canvas_w / 2, canvas_h / 2); //设置画布上的(0,0)位置,也就是旋转的中心点
                con.rotate(270 * Math.PI / 180); //把画布旋转90度
                // 执行Canvas的drawImage语句
                // con.drawImage(image,0,0,image.width,image.height,0,0,imageWidth,imageHeight); //把图片绘制在画布translate之前的中心点,
                con.drawImage(image, Number(0) - canvas_h / 2, Number(0) - canvas_w / 2, imageWidth, imageHeight); //把图片绘制在画布translate之前的中心点,

                // con.drawImage(image, 0,0); //把图片绘制在画布translate之前的中心点,
                con.restore(); //恢复状态
            } else {
                // 执行Canvas的drawImage语句
                con.drawImage(image, 0, 0, image.width, image.height, 0, 0, imageWidth, imageHeight);

            }
            // //图片的base64位字符串
            base64 = canvas.toDataURL("image/png");
            // console.log(base64)
            //这里写入vue 属性
            if (vm.isStart) {
                vm.startPhoto = base64;
                vm.isStart = false;
                vm.isSave = false;
            } else {
                vm.endPhoto = base64;
                vm.isSave = false;
                vm.sub();
            }
        }
        image.src = src;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值