博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决layui上传图片预览旋转90度的问题
阅读量:4106 次
发布时间:2019-05-25

本文共 3710 字,大约阅读时间需要 12 分钟。

问题:使用layui上传图片的,出现图片旋转90度

解决办法:通过EXIF.getData获取图片信息,判断图片是否旋转

 

html:

    
Title

js:

layui.use('upload', function() {    var $ = layui.jquery        , upload = layui.upload;    //普通图片上传    var uploadInst = upload.render({        elem: '#test1'        , url: '/upload/'        , before: function (obj) {            //预读本地文件示例,不支持ie8            obj.preview(function (index, file, result) {                console.log(file)                EXIF.getData(file, function() {                    //获取图片Orientation                    orient = EXIF.getTag(this, 'Orientation');                    if(orient==6){//逆时针旋转了90度                        rotateBase64Img(result,90,callback);                    }else if(orient==1){                        $('#demo1').attr('src', result); //图片链接(base64)                    }                });            });        }        , done: function (res) {            //如果上传失败            if (res.code > 0) {                return layer.msg('上传失败');            }            //上传成功        }        , error: function () {            //演示失败状态,并实现重传            var demoText = $('#demoText');            demoText.html('上传失败 重试');            demoText.find('.demo-reload').on('click', function () {                uploadInst.upload();            });        }    });    //旋转base64图片    function rotateBase64Img(src, edg, callback) {        var canvas = document.createElement("canvas");        var ctx = canvas.getContext("2d");        var imgW;//图片宽度        var imgH;//图片高度        var size;//canvas初始大小        if (edg % 90 != 0) {            console.error("旋转角度必须是90的倍数!");            throw '旋转角度必须是90的倍数!';        }        (edg < 0) && (edg = (edg % 360) + 360)        const quadrant = (edg / 90) % 4; //旋转象限        const cutCoor = {sx: 0, sy: 0, ex: 0, ey: 0}; //裁剪坐标        var image = new Image();        image.crossOrigin = "anonymous"        image.src = src;        image.onload = function () {            imgW = image.width;            imgH = image.height;            size = imgW > imgH ? imgW : imgH;            canvas.width = size * 2;            canvas.height = size * 2;            switch (quadrant) {                case 0:                    cutCoor.sx = size;                    cutCoor.sy = size;                    cutCoor.ex = size + imgW;                    cutCoor.ey = size + imgH;                    break;                case 1:                    cutCoor.sx = size - imgH;                    cutCoor.sy = size;                    cutCoor.ex = size;                    cutCoor.ey = size + imgW;                    break;                case 2:                    cutCoor.sx = size - imgW;                    cutCoor.sy = size - imgH;                    cutCoor.ex = size;                    cutCoor.ey = size;                    break;                case 3:                    cutCoor.sx = size;                    cutCoor.sy = size - imgW;                    cutCoor.ex = size + imgH;                    cutCoor.ey = size + imgW;                    break;            }            ctx.translate(size, size);            ctx.rotate(edg * Math.PI / 180);            ctx.drawImage(image, 0, 0);            var imgData = ctx.getImageData(cutCoor.sx, cutCoor.sy, cutCoor.ex, cutCoor.ey);            if (quadrant % 2 == 0) {                canvas.width = imgW;                canvas.height = imgH;            } else {                canvas.width = imgH;                canvas.height = imgW;            }            ctx.putImageData(imgData, 0, 0);            callback(canvas.toDataURL())        };    }    function callback(base64data) {        document.getElementById("demo1").src = base64data;    }});

 

转载地址:http://htssi.baihongyu.com/

你可能感兴趣的文章
7 年工作经验,面试官竟然还让我写算法题???
查看>>
被 Zoom 逼疯的歪果仁,造出了视频会议机器人,同事已笑疯丨开源
查看>>
再见,Eclipse...
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
漫话:为什么你下载小电影的时候进度总是卡在 99% 就不动了?
查看>>
我去!原来大神都是这样玩转「多线程与高并发」的...
查看>>
当你无聊时,可以玩玩 GitHub 上这个开源项目...
查看>>
B 站爆红的数学视频,竟是用这个 Python 开源项目做的!
查看>>
安利 10 个让你爽到爆的 IDEA 必备插件!
查看>>
自学编程的八大误区!克服它!
查看>>
GitHub 上的一个开源项目,可快速生成一款属于自己的手写字体!
查看>>
早知道这些免费 API,我就可以不用到处爬数据了!
查看>>
Java各种集合类的合并(数组、List、Set、Map)
查看>>
Mysql复制表以及复制数据库
查看>>
进程管理(一)
查看>>
linux 内核—进程的地址空间(1)
查看>>
存储器管理(二)
查看>>
开局一张图,学一学项目管理神器Maven!
查看>>
Android中的Binder(二)
查看>>