js图片压缩上传,拖拽与放大缩小

一:html部分

       <!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title> 
        <script src="js/jquery.js"></script> 
        <script src="js/dragObject.js"></script>

       <script src="js/inputPic.js"></script>
        
        <style>
         #imgMouse {
                    position: absolute;
                    cursor: move;
                    width: 100%;
                }
        </style>        
    </head>
    <body>
        <div style="width: 100%;height: 100%;">

          <input id="browse" type="button" value="浏览" class="btn btn-primary" οnclick="$('#picInput').click();" />
            <input type="file" id="picInput" accept="image/*" οnchange="inputPic(this)" style="display:none;" />
         <img id="imgMouse" src="" alt="">
        </div>
        
        <script>
            $(function(){
                 var oImg = document.getElementById('imgMouse');
                 dragObject(oImg);
            })

            function inputPic(file) {

                     inputPic(file)

             }
        </script>
    </body>
</html>

二:js压缩部分(如果文件尺寸大于1024则压缩上传)

function inputPic(file) {
                if (!file.files || !file.files[0]) {
                    alert('请选择一个处方图片', 2);
                    return;
                }

                zipImg($('#picInput')[0].files[0], f => {
                    this.file = f;  
                    console.log(f);
                    var fileName = $('#picInput').val();
                    var reader = new FileReader();
                    reader.onload = function(evt) {
                        document.getElementById('imgMouse').src = evt.target.result;
                        document.getElementById('imgMouse').style.width = "600px";
                        document.getElementById('imgMouse').style.height = "800px";
                        document.getElementById('imgMouse').style.top = "10px";
                        document.getElementById('imgMouse').style.left = "10px";
                        image = evt.target.result;
                    }

                    this.timer = setTimeout(() => { //设置延迟执行
                        reader.readAsDataURL(file.files[0]);
                    }, 300);
                });

            }

            //压缩图片
            function zipImg(imgFile, func) {
                var that = this;
                console.time('图片压缩:' + imgFile.name);
                if (imgFile.size / 1024 > 500) { //如果文件尺寸大于1024则压缩上传
                    this.photoCompress(imgFile, {
                        quality: 0.2
                    }, function(base64Codes) {
                        var imgData = that.convertBase64UrlToBlob(base64Codes);
                        var newFile = new File([imgData], imgFile.name);
                        console.timeEnd('图片压缩:' + imgFile.name);
                        func(newFile);
                    });
                } else {
                    console.timeEnd('图片压缩:' + imgFile.name);
                    func(imgFile);
                }
            }
            /*
                       三个参数
                       file:一个是文件(类型是图片格式),
                       w:一个是文件压缩的后宽度,宽度越小,字节越小
                       objDiv:一个是容器或者回调函数
                    */
            function photoCompress(file, w, objDiv) {
                var ready = new FileReader();
                /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
                ready.readAsDataURL(file);
                var that = this;
                ready.onload = function() {
                    var re = this.result;
                    that.canvasDataURL(re, w, objDiv)
                }
            }
            
            function canvasDataURL(path, obj, callback) {
                var img = new Image();
                img.src = path;
                img.onload = function() {
                    var that = this;
                    // 默认按比例压缩
                    var w = that.width,
                        h = that.height,
                        scale = w / h;
                    w = obj.width || w;
                    h = obj.height || (w / scale);
                    var quality = 0.7; // 默认图片质量为0.7
                    //生成canvas
                    var canvas = document.createElement('canvas');
                    var ctx = canvas.getContext('2d');
                    // 创建属性节点
                    var anw = document.createAttribute("width");
                    anw.nodeValue = w;
                    var anh = document.createAttribute("height");
                    anh.nodeValue = h;
                    canvas.setAttributeNode(anw);
                    canvas.setAttributeNode(anh);
                    ctx.drawImage(that, 0, 0, w, h);
                    // 图像质量
                    if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
                        quality = obj.quality;
                    }
                    // quality值越小,所绘制出的图像越模糊
                    var base64 = canvas.toDataURL('image/jpeg', quality);
                    // 回调函数返回base64的值
                    callback(base64);
                }
            }
            
            /**
             * 将以base64的图片url数据转换为Blob
             * @param urlData
             *            用url方式表示的base64图片数据
             */
            function convertBase64UrlToBlob(urlData) {
                var arr = urlData.split(','),
                    mime = arr[0].match(/:(.*?);/)[1],
                    bstr = atob(arr[1]),
                    n = bstr.length,
                    u8arr = new Uint8Array(n);
                while (n--) {
                    u8arr[n] = bstr.charCodeAt(n);
                }
                return new Blob([u8arr], {
                    type: mime
                });
            }

三:dragObject.js部分(可放与js文件)

var ie = document.all;
var nn6 = document.getElementByIdx && !document.all;
var isdrag = false;
var y, x;
var oDragObj;
var imgObj;

function dragObject(oImg) {
    imgObj = oImg;
    function fnWheel(obj, fncc) {
        obj.onmousewheel = fn;
        if (obj.addEventListener) {
            obj.addEventListener('DOMMouseScroll', fn, false);
        }

        function fn(ev) {
            var oEvent = ev || window.event;
            var down = true;

            if (oEvent.detail) {
                down = oEvent.detail > 0
            } else {
                down = oEvent.wheelDelta < 0
            }

            if (fncc) {
                fncc.call(this, down, oEvent);
            }

            if (oEvent.preventDefault) {
                oEvent.preventDefault();
            }

            return false;
        }

    };
    fnWheel(oImg, function (down, oEvent) {

        var oldWidth = this.offsetWidth;
        var oldHeight = this.offsetHeight;
        var oldLeft = this.offsetLeft;
        var oldTop = this.offsetTop;

        var scaleX = (oEvent.clientX - oldLeft) / oldWidth; //比例
        var scaleY = (oEvent.clientY - oldTop) / oldHeight;

        if (down) {
            this.style.width = this.offsetWidth * 0.9 + "px";
            this.style.height = this.offsetHeight * 0.9 + "px";
        } else {
            this.style.width = this.offsetWidth * 1.1 + "px";
            this.style.height = this.offsetHeight * 1.1 + "px";
        }

        var newWidth = this.offsetWidth;
        var newHeight = this.offsetHeight;

        this.style.left = oldLeft - scaleX * (newWidth - oldWidth) + "px";
        this.style.top = oldTop - scaleY * (newHeight - oldHeight) + "px";
    });
}

function moveMouse(e) {
    if (isdrag) {
        oDragObj.style.top = (nn6 ? nTY + e.clientY - y : nTY + event.clientY - y) + "px";
        if ((nn6 ? nTY + e.clientY - y : nTY + event.clientY - y) > 700)
            oDragObj.style.top = "700px";
        if ((nn6 ? nTY + e.clientY - y : nTY + event.clientY - y) < -750)
            oDragObj.style.top = "-750px";

        oDragObj.style.left = (nn6 ? nTX + e.clientX - x : nTX + event.clientX - x) + "px";

        if ((nn6 ? nTX + e.clientX - x : nTX + event.clientX - x) > 350)
            oDragObj.style.left = "350px";
        if ((nn6 ? nTX + e.clientX - x : nTX + event.clientX - x) < -550)
            oDragObj.style.left = "-550px";

        return false;
    }
}

function initDrag(e) {
    var oDragHandle = nn6 ? e.target : event.srcElement;
    var topElement = "HTML";
    while (oDragHandle.tagName != topElement && oDragHandle.id != imgObj.id) {
        oDragHandle = nn6 ? oDragHandle.parentNode : oDragHandle.parentElement;
    }
    if (oDragHandle.id == imgObj.id) {
        isdrag = true;
        oDragObj = oDragHandle;
        nTY = parseInt(oDragObj.style.top + 0);
        y = nn6 ? e.clientY : event.clientY;
        nTX = parseInt(oDragObj.style.left + 0);
        x = nn6 ? e.clientX : event.clientX;
        document.onmousemove = moveMouse;
        return false;
    }
}
document.onmousedown = initDrag;
document.onmouseup = new Function("isdrag=false");

就这么简单可以随意放大缩小与拖拽了,看见好的东西随手记录以备后用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值