手机 调用相机/相册 旋转压缩 上传

安装exif-js.js    ios及部分安卓机拍照后会有旋转,利用exif获取旋转角度

npm install exif-js --save

orientation值旋转角度
10度
3180度
6顺时针90度
8逆时针90度

 

下面是例子:(vue)

显示效果:

<template>
    <div>
        <span @click="fileClick">点击上传</span>

        <input
            ref="upload_file"
            id="upload_file"
            type="file"
            style="display: none;"
            accept="image/*"
            name="file"
            @change="fileChange($event)"
        />

        <img :src="masterHeader">
    </div>
</template>
<script>
import EXIF from "exif-js";
import { imgUpload } from "@/api/api";

export default {
    data() {
        return {
            imgUrl: "http://xxx",
            masterHeader: ""
        };
    },
    methods: {
        //调用相册&相机
        fileClick() {
            this.$refs.upload_file.click();
        },
        //添加获取文件信息
        fileChange(el) {
            let file = this.$refs.upload_file.files[0];
            // console.log(file);
            // console.log(this.$refs.upload_file.files[0].type)
            if (file.type.indexOf("image") == -1) {
                alert("请上传图片");
                return;
            }

            this.compress2(file);
        },
        // 旋转&压缩
        compress2(fileObj) {
            let _this = this;
            var orientation;
            var direction;
            var dir;
            var s = 1;
            let reader = new FileReader();
            reader.readAsDataURL(fileObj); // 将图片转成base64
            reader.onload = e => {
                let image = new Image(); // 新建一个img标签(还没嵌入DOM节点)
                image.src = e.target.result;

                image.onload = () => {
                    EXIF.getData(image, function() {
                        direction = EXIF.getTag(this, "Orientation");
                    });

                    let canvas = document.createElement("canvas"),
                        context = canvas.getContext("2d"),
                        data = "";

                    switch (direction) {
                        case 6: // 顺时针旋转90度
                            dir = "right";
                            break;
                        case 8: // 逆时针旋转90度
                            dir = "left";
                            break;
                        case 3: // 顺时针旋转180度
                            dir = "right";
                            s = 2;
                            break;
                        default:
                            break;
                    }

                    const MIN_STEP = 0;
                    const MAX_STEP = 3;

                    const width = canvas.width || image.width;
                    const height = canvas.height || image.height;
                    let step = 0;

                    if (dir === "right") {
                        step += s;
                        step > MAX_STEP && (step = MIN_STEP);
                    } else if (dir == "left") {
                        step -= s;
                        step < MIN_STEP && (step = MAX_STEP);
                    } else {
                        step = -1;
                    }

                    const degree = (step * 90 * Math.PI) / 180;

                    switch (step) {
                        case 1:
                            canvas.width = height;
                            canvas.height = width;
                            context.rotate(degree);
                            context.drawImage(image, 0, -height, width, height);
                            break;
                        case 2:
                            canvas.width = width;
                            canvas.height = height;
                            context.rotate(degree);
                            context.drawImage(image, -width, -height, width, height);
                            break;
                        case 3:
                            canvas.width = height;
                            canvas.height = width;
                            context.rotate(degree);
                            context.drawImage(image, -width, 0, width, height);
                            break;
                        default:
                            canvas.width = width;
                            canvas.height = height;
                            context.drawImage(image, 0, 0, width, height);
                            break;
                    }

                    // context.drawImage(image, 0, 0, imageWidth, imageHeight);
                    data = canvas.toDataURL("image/jpeg", 0.3); // 压缩完成
                    this.dataURLtoFile(data, fileObj.name);
                };
            };
        },
        // 将base64转换为文件
        dataURLtoFile(dataurl, filename) {
            var arr = dataurl.split(","),
                mime = arr[0].match(/:(.*?);/)[1],
                bstr = atob(arr[1]),
                n = bstr.length,
                u8arr = new Uint8Array(n);
            while (n--) {
                u8arr[n] = bstr.charCodeAt(n);
            }
            let file = new File([u8arr], filename, { type: mime });

            var formdata = new FormData();
            formdata.append("enctype", "multipart/form-data");
            formdata.append("name", "file");
            formdata.append("file", file);
            // Indicator.open(); // loading打开

            // 图片上传接口
            imgUpload(formdata).then(res => {
                if (res.data.state == "200") {
                    this.masterHeader = this.imgUrl + res.data.data;
                    console.log(this.masterHeader)
                }
                // Indicator.close();  // loading关闭
            })
            .catch(err => {
                // Indicator.close();  // loading关闭
            });
        }
    }
};
</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值