解决layui上传图片预览旋转90度的问题

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

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

 

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="../layui/css/layui.css"  media="all">
    <link rel="stylesheet" href="../css/showImg.css">
</head>
<body>
<div class="layui-upload">
    <button class="layui-btn" id="test1" type="button">上传图片</button>
    <div class="layui-upload-list">
        <img class="layui-upload-img" id="demo1">
        <p id="demoText"></p>
    </div>
</div>

<script src="../layui/layui.js" charset="utf-8"></script>
<script src="../js/showImg.js"></script>
<script type="text/javascript" src="../js/exif.js"></script>
</body>
</html>

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('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
            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;
    }
});

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
layui是一款基于jQuery的前端UI框架,它提供了丰富的组件和样式,方便开发者快速构建美观的网页界面。在layui中,点击图片预览可以通过使用其内置的图片预览组件实现。 要实现点击图片预览,可以按照以下步骤进行操作: 1. 引入layui库和相关样式文件。在HTML文件中,通过`<link>`标签引入layui的CSS样式文件和JS文件。 2. 创建一个包含图片的HTML元素。可以使用`<img>`标签来展示图片。 3. 给图片元素添加`lay-event`属性,并设置为`preview`。这样当点击图片时,layui会自动触发图片预览功能。 4. 初始化layui组件。在JS代码中,使用`layui.use()`方法初始化layui组件。 5. 监听图片预览事件。使用`element.on()`方法监听图片预览事件,并在回调函数中执行相应的操作。 下面是一个示例代码: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>点击图片预览</title> <link rel="stylesheet" href="path/to/layui/css/layui.css"> </head> <body> <img src="path/to/image.jpg" lay-event="preview"> <script src="path/to/jquery.js"></script> <script src="path/to/layui/layui.js"></script> <script> layui.use(['layer', 'element'], function(){ var element = layui.element; element.on('nav(preview)', function(elem){ var src = $(elem).attr('src'); // 在这里可以执行图片预览的操作,比如弹出一个大图预览窗口 layer.open({ type: 1, title: false, closeBtn: 0, area: 'auto', skin: 'layui-layer-nobg', // 没有背景色 shadeClose: true, content: '<img src="' + src + '" style="max-width:100%;">' }); }); }); </script> </body> </html> ``` 在上面的示例代码中,我们使用了`layer.open()`方法来实现图片预览的效果。当点击图片时,会弹出一个包含大图的浮层窗口。 希望以上内容能够帮助到你!如果还有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值