Skip to main content
 首页 » 编程设计

jQuery ADS--图像缩放与剪裁

2022年07月16日45telwanggs
HTML Code: 
<!DOCTYPE HTML> 
<html lang="en-US"> 
<head> 
    <meta charset="utf-8"> 
    <title>Image Editor Test Pages</title> 
    <style> 
        ul{ list-style: none; } 
        li { width: 400px; } 
        form { 
            margin-bottom: 1em; 
            padding-bottom: 1em; 
            border-bottom: 2px solid gray; 
        } 
        form div { 
            clear: both; 
        } 
 
        img { 
            margin: 0; 
            border: 1px solid gray; 
            padding: 4px; 
            width: 23%; 
            float: left; 
            clear: none; 
        } 
 
        fieldset { 
            float: right; 
            width: 60%; 
            margin-bottom: 1em; 
            border: 1px dotted gray; 
        } 
 
        legend { 
            font-size: 0.95em; 
        } 
 
        label { 
            display: block; 
            font-weight: bold; 
        } 
 
        .buttons { 
            text-align: center; 
        } 
 
        form.ADSImageEditorModified { 
            margin: 10px; 
            padding: 0; 
            border: 0; 
        } 
        form.ADSImageEditorModified * { 
            position: absolute; 
            left: -2000px; 
        } 
 
        form.ADSImageEditorModified img { 
            position: inherit; 
            left: auto; 
        } 
 
 
        li { 
            list-style:none; 
            margin:30px; 
            overflow:hidden; 
            zoom:1; 
        } 
        li img { 
            float:left; 
            width:270px; 
            height:400px; 
            display:inline; 
            margin-right:30px; 
        } 
    </style> 
</head> 
<body> 
<h1>Edit Your Images </h1> 
<ul> 
    <li> 
        <form method="post" action="" class="ADSImageEditor"> 
            <img id="mintImage" src="images/mint.jpg" alt=""> 
            <fieldset> 
                <legend>New Size</legend> 
                <div> 
                    <label for="newWidth">Width</label> 
                    <input id="newWidth" name="newWidth" type="text"> 
                </div> 
                <div> 
                    <label for="newHeight">Height</label> 
                    <input id="newHeight" name="newHeight" type="text"> 
                    <p>The width and height applies to the original uncropped image</p> 
                </div> 
            </fieldset> 
            <fieldset> 
                <legend>Trim Edges</legend> 
                <div> 
                    <label for="cropTop">Top</label> 
                    <input id="cropTop" name="cropTop" type="text"> 
                </div> 
                <div> 
                    <label for="cropRight">Rigt</label> 
                    <input name="cropRight" id="cropRight" type="text"> 
                </div> 
                <div> 
                    <label for="cropLeft">Left</label> 
                    <input name="cropLeft" id="cropLeft" type="text"> 
                </div> 
            </fieldset> 
            <div class="buttons"> 
                <input value="Apply" type="submit"> 
                <input value="Reset" type="reset"> 
            </div> 
        </form> 
    </li> 
    <li> 
        <form action=""  class="ADSImageEditor"> 
            <img id="babyImage" src="images/baby.jpg" alt=""> 
            <fieldset> 
                <legend>New Size</legend> 
                <div> 
                    <label for="newWidth2">Width</label> 
                    <input id="newWidth2" name="newWidth" type="text"> 
                </div> 
                <div> 
                    <label for="newHeight2">Height</label> 
                    <input name="newHeight" id="newHeight2" type="text"> 
                    <p>The width and height applies to the original uncropped image</p> 
                </div> 
            </fieldset> 
            <fieldset> 
                <legend>Trim Edges</legend> 
                <div> 
                    <label for="cropTop2">Top</label> 
                    <input id="cropTop2" name="cropTop" type="text"> 
                </div> 
                <div> 
                    <label for="cropRight2">Rigt</label> 
                    <input name="cropRight" id="cropRight2" type="text"> 
                </div> 
                <div> 
                    <label for="cropLeft2">Left</label> 
                    <input name="cropLeft" id="cropLeft2" type="text"> 
                </div> 
            </fieldset> 
            <div class="buttons"> 
                <input value="Apply" type="submit"> 
                <input value="Reset" type="reset"> 
            </div> 
        </form> 
    </li> 
</ul> 
<!-- 
<script src="../ADS.js"></script> 
<script src="../myLogger.js"></script> 
<script src="imageEditor.js"></script> 
--> 
<script src="imageEditor-test.js"></script> 
<script> 
 
</script> 
</body> 
</html> 
 
 
JS Code: 
/** 
 * mageEditor-test.js 
 * User: ldp 
 * Date: 12-12-22 
 * project: 图像缩放与剪裁 
 */ 
 
(function () { 
    if (!window.ADS) { 
        window.ADS = {}; 
    } 
 
    function addEvent(node, type, listener) { 
        if (node.addEventListener) { 
            node.addEventListener(type, listener, false); 
            return true; 
        } else if (node.attachEvent) { 
            node['e' + type + listener] = listener; 
            node[type + listener] = function () { 
                node['e' + type + listener](window.event); 
            }; 
            node.attachEvent('on' + type, node[type + listener]); 
            return true; 
        } else { 
            return false; 
        } 
    } 
 
    window.ADS.addEvent = addEvent; 
 
    function addLoadEvent(loadEvent, waitForImages) { 
        //如果等待标记是true则使用常规的添加事件的方法 
        if (waitForImages) { 
            return addEvent(window, 'load', loadEvent); 
        } 
 
        //否则使用一些不同的方式包装loadEvent()方法 
        //以便为this关键字制定正确的内容,同时确定 
        //事件不会被执行两次 
        var init = function () { 
            //如果这个函数已经被调用过了则返回 
            if (arguments.callee.done) { 
                return; 
            } 
 
            //标记这个函数以便检测它是否运行过 
            arguments.callee.done = true; 
 
            //在document的环境中运行载入事件 
            loadEvent.apply(document, arguments); 
        }; 
 
        //为DOMContentLoaded事件注册事件侦听器 
        if (document.addEventListener) { 
            document.addEventListener('DOMContentLoaded', init, false); 
        } 
 
        //对于safari,使用setInterval()函数检测 
        //document是否载入完成 
        if (/WebKit/i.test(navigator.userAgent)) { 
            var _timer = setInterval(function () { 
                if (/loaded|complete/.test(document.readyState)) { 
                    clearInterval(_timer); 
                    init(); 
                } 
            }, 10); 
        } 
 
        //对于IE(使用条件注释) 
        //附加一个在载入过程最后执行的脚本 
        //并检测该脚本是否载入完成 
        /*@cc_on @*/ 
        /*@if (@_win32) 
         document.write("<script id=_ie_onload defer src=javascript:void(0)><\/script>"); 
         var script = document.getElementById('_ie_onload'); 
         script.onreadystatechange = function(){ 
         if(this.readyState === 'complete'){ 
         init(); 
         } 
         }; 
         /*@end @*/ 
        return true; 
    } 
 
    window.ADS.addLoadEvent = addLoadEvent; 
 
    function removeEvent(node, type, listener) { 
        if (node.removeEventListener) { 
            node.removeEventListener(type, listener, false); 
            return true; 
        } else if (node.detachEvent) { 
            node.detachEvent('on' + type, node[type + listener]); 
            node[type + listener] = null; 
            return true; 
        } 
        return false; 
    } 
 
    window.ADS.removeEvent = removeEvent; 
 
    function getEvent(event) { 
        return event || window.event; 
    } 
 
    window.ADS.getEvent = getEvent; 
 
    function getPointerPositionInDocument(event) { 
        event = event || getEvent(event); 
        var x = event.pageX || (event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)); 
        var y = event.pageY || (event.clientY + (document.documentElement.scrollTop || document.body.scrollTop)); 
        return { 
            x: x, 
            y: y 
        }; 
    } 
 
    window.ADS.getPointerPositionInDocument = getPointerPositionInDocument; 
 
    function stopPropagation(event) { 
        event = event || getEvent(event); 
        if (event.stopPropagation) { 
            event.stopPropagation(); 
        } else { 
            event.cancelBubble = true; 
        } 
    } 
 
    window.ADS.stopPropagation = stopPropagation; 
 
    function preventDefault(event) { 
        event = event || getEvent(event); 
        if (event.preventDefault) { 
            event.preventDefault(); 
        } else { 
            event.returnValue = false; 
        } 
    } 
 
    window.ADS.preventDefault = preventDefault; 
 
    function getElementsByClassName(searchClass, node, tag) { 
        if (document.getElementsByClassName) { 
            var nodes = (node || document).getElementsByClassName(searchClass), 
                result = nodes; 
            if (tag !== undefined) { 
                result = []; 
                for (var i = 0; node = nodes[i]; i++) { 
                    if (tag !== '*' && node.tagName.toLowerCase() === tag.toLowerCase()) { 
                        result.push(node); 
                    } else if (tag === '*') { 
                        return nodes; 
                    } 
                } 
            } 
            return result; 
        } else { 
            node = node || document; 
            tag = tag || '*'; 
            var classes = searchClass.split(' '), 
                elements = node.getElementsByTagName(tag), 
                patterns = [], 
                returnElements = [], 
                current, 
                match; 
            var i = classes.length; 
            while (--i >= 0) { 
                patterns.push(new RegExp('(^|\\s)' + classes[i] + '(\\s|$)')); 
            } 
            var j = elements.length; 
            while (--j >= 0) { 
                current = elements[j]; 
                match = false; 
                for (var k = 0, kl = patterns.length; k < kl; k++) { 
                    match = patterns[k].test(current.className); 
                    if (!match) break; 
                } 
                if (match) { 
                    returnElements.push(current); 
                } 
            } 
            return returnElements; 
        } 
    } 
 
    window.ADS.getElementsByClassName = getElementsByClassName; 
 
    function getWinSize() { 
        var de = document.documentElement; 
        return { 
            width: (window.innerWidth || (de && de.clientWidth) || document.body.clientWidth), 
            height: (window.innerHeight || (de && de.clientHeight) || document.bodu.clientHeight) 
        }; 
    } 
 
    window.ADS.getWinSize = getWinSize; 
 
    function setStyleById(element, styles) { 
        for (var prop in styles) { 
            if (!styles.hasOwnProperty(prop)) { 
                continue; 
            } 
            if (element.style.setProperty) { 
                element.style.setProperty(uncamelize(prop, '-'), styles[prop], null); 
            } else { 
                element.style[camelize(prop)] = styles[prop]; 
            } 
        } 
        return true; 
    } 
 
    window.ADS.setStyle = setStyleById; 
    window.ADS.setStyleById = setStyleById; 
 
    function camelize(s) { 
        return s.replace(/-(\w)/g, function (strMatch, p1) {    //strMatch为正则匹配的字符 
            //p1为\w匹配的一个字符 
            return p1.toUpperCase(); 
        }); 
    } 
 
    window.ADS.camelize = camelize; 
 
    function uncamelize(property, splitChar) { 
        return property.replace(/([a-z])([A-Z])/, '$1' + splitChar + '$2').toLowerCase(); 
    } 
 
    window.ADS.uncamelize = uncamelize; 
 
 
})(); 
 
/*------------- ImageEditor   ------------------*/ 
(function () { 
    /** 
     * 返回一个对象,以所提供元素的宽度,高度 
     * 顶部边距和左侧边距作为属性 
     * @param {Element} e 
     * @return {Object} 
     */ 
    function getDimensions(e) { 
        return { 
            top: e.offsetTop, 
            left: e.offsetLeft, 
            width: e.offsetWidth, 
            height: e.offsetHeight 
        }; 
    } 
 
    /** 
     * 设置并自动匹配px单位的css属性 
     * @param {Element} e 元素 
     * @param {Object} dim 包含css属性和值的对象 
     * @param {Boolean} updateMsg 是否显示尺寸信息 
     */ 
    function setNumericStyle(e, dim, updateMsg) { 
        updateMsg = updateMsg || false; 
        var style = {}; 
        for (var i in dim) { 
            if (!dim.hasOwnProperty(i)) { 
                continue; 
            } 
            style[i] = (dim[i] || '0') + 'px'; 
        } 
        ADS.setStyle(e, style); 
        if (updateMsg) { 
            ImageEditor.elements.cropSizeDisplay.firstChild.nodeValue = dim.width + ' x ' + dim.height; 
        } 
    } 
 
    /** 
     * 构造器 
     */ 
    function ImageEditor() { 
    } 
 
    ImageEditor.info = { 
        resizeCropArea: false,      // 当为true时启动剪裁区域拖动,否则只是缩放 
        pointerStart: null,     // 记录开始时的指针x和y值 
        resizeeStart: null,     // 记录开始时黑色半透明层下的图片的偏移属性 
        cropAreaStart: null,        // 记录开始时剪裁区域的偏移属性 
        imgSrc: null        // 图片地址 
    }; 
 
    ImageEditor.elements = { 
        backdrop: null,     // 背景幕 
        editor: null,       // 编辑器 
        resizee: null,      // 图片 
        resizeeCover: null,     // 半透明黑色背景层 
        resizeHandle: null,     // 图片缩放手柄 
        cropArea: null,     // 裁剪区域层 
        resizeeClone: null,     // 裁剪区域的明亮图片 
        cropSizeDisplay: null,      // 包含裁剪尺寸信息的元素 
        cropResizeHandle: null,     // 裁剪缩放手柄 
        saveHandle: null,       // 保存手柄 
        cancelHandle: null      // 取消手柄 
    }; 
 
    // 这个方法会按照需要注册事件及修改DOM 
    // 它会在window载入时自动运行 
    ImageEditor.load = function (event) { 
        // 取得页面中所有带ADSImageEditor类名的表单元素 
        var forms = ADS.getElementsByClassName('ADSImageEditor', document, 'form'); 
        // 在符合条件的表单中查找图像 
        for (var i = 0, len = forms.length; i < len; i++) { 
            // 查找表单中的图像 
            var images = forms[i].getElementsByTagName('img'); 
            if (!images[0]) { 
                // 这个表单中不包含图像,跳过 
                continue; 
            } 
 
            // 为图像添加imageEditor.imgeClick事件 
            ADS.addEvent(images[0], 'click', ImageEditor.imageClick); 
 
            // 修改类名以便CSS按照需要修改其样式 
            forms[i].className += ' ADSImageEditorModified'; 
        } 
    }; 
 
    ImageEditor.unload = function (event) { 
        // 移除编辑及背景幕(backdrop) 
        document.body.removeChild(ImageEditor.elements.backdrop); 
        document.body.removeChild(ImageEditor.elements.editor); 
    }; 
 
    ImageEditor.imageClick = function (event) { 
        // 创建新的js Image对象 
        // 以便确定图像的宽度和高度 
        var image = new Image(); 
        // this引用被单击的图像元素 
        image.src = ImageEditor.info.imgSrc = this.src; 
 
        // 为放置背景幕和居中编辑器而取得页面大小 
        var windowSize = ADS.getWinSize(); 
 
        /* 
         Build the DOM structure and append it to the document 
         This will reproduce the following markup with size based 
         around the clicked image's size: 
 
         <div><!-- backdrop --></div> 
         <div> 
         <!-- editor --> 
         <div><!-- resize handle --></div> 
         <img src="/path/to/image.jpg"> 
         <div><!-- translucent cover --></div> 
         <div> 
         <!-- crop area --> 
         <img src="/path/to/image.jpg"> 
         <div><!-- crop size display --></div> 
         <div><!-- crop handle --></div> 
         <div><!-- save handle --></div> 
         <div><!-- cancel handle --></div> 
         </div> 
         </div> 
         */ 
 
        // 创建背景幕div,并使其撑满整个页面 
        var backdrop = document.createElement('div'); 
        backdrop.id = 'backdrop'; 
        ImageEditor.elements.backdrop = backdrop; 
        ADS.setStyle(backdrop, { 
            'width': '100%', 
            'height': '100%', 
            'position': 'absolute', 
            'background-color': 'black', 
            'opacity': 0.8, 
            'filter': 'alpha(opacity=80)', 
            'z-index': 10000 
        }); 
        setNumericStyle(backdrop, { 
            'left': 0, 
            'top': 0 
        }); 
 
        // 创建编辑器div以包含编辑工具的GUI 
        var editor = document.createElement('div'); 
        editor.id = 'editor'; 
        ImageEditor.elements.editor = editor; 
        ADS.setStyle(editor, { 
            'position': 'absolute', 
            'z-index': 10001 
        }); 
        setNumericStyle(editor, { 
            'left': Math.ceil((windowSize.width - image.width) / 2), 
            'top': Math.ceil((windowSize.height - image.height) / 2), 
            'width': image.width, 
            'height': image.height 
        }); 
 
        // 创建缩放手柄 
        var resizeHandle = document.createElement('div'); 
        resizeHandle.id = 'resizeHandle'; 
        ImageEditor.elements.resizeHandle = resizeHandle; 
        ADS.setStyle(resizeHandle, { 
            'position': 'absolute', 
            'background': 'url(interface/handles.gif) no-repeat 0 0' 
        }); 
        setNumericStyle(resizeHandle, { 
            'right': -10, 
            'bottom': -10, 
            'width': 28, 
            'height': 28 
        }); 
 
        // 创建可缩放的图像 
        var resizee = document.createElement('img'); 
        resizee.id = 'resizee'; 
        ImageEditor.elements.resizee = resizee; 
        resizee.src = ImageEditor.info.imgSrc; 
        ADS.setStyle(resizee, { 
            'position': 'absolute', 
            'margin': 0, 
            'padding': 0, 
            'border': 0 
        }); 
        setNumericStyle(resizee, { 
            'left': 0, 
            'top': 0, 
            'width': image.width, 
            'height': image.height 
        }); 
 
        // 创建半透明的蒙板(cover) 
        var resizeeCover = document.createElement('div'); 
        resizeeCover.id = 'resizeeCover'; 
        ImageEditor.elements.resizeeCover = resizeeCover; 
        ADS.setStyle(resizeeCover, { 
            'position': 'absolute', 
            'background-color': 'black', 
            'opacity': 0.8, 
            'filter': 'alpha(opacity=80)' 
        }); 
        setNumericStyle(resizeeCover, { 
            'left': 0, 
            'top': 0, 
            'width': image.width, 
            'height': image.height 
        }); 
 
        // 创建裁剪大小显示区域 
        var cropSizeDisplay = document.createElement('span'); 
        cropSizeDisplay.id = 'cropSizeDisplay'; 
        ImageEditor.elements.cropSizeDisplay = cropSizeDisplay; 
        ADS.setStyle(cropSizeDisplay, { 
            'position': 'absolute', 
            'background-color': 'black', 
            'color': 'white' 
        }); 
        setNumericStyle(cropSizeDisplay, { 
            'top': 0, 
            'left': 0, 
            'padding': 4, 
            'font-size': 12, 
            'line-height': 14 
        }); 
        cropSizeDisplay.appendChild( 
            document.createTextNode('size:') 
        ); 
 
        // 创建裁剪区域容器 
        var cropArea = document.createElement('div'); 
        cropArea.id = 'cropArea'; 
        ImageEditor.elements.cropArea = cropArea; 
        ADS.setStyle(cropArea, { 
            'position': 'absolute', 
            'overflow': 'hidden' 
        }); 
        setNumericStyle(cropArea, { 
            'left': 0, 
            'Top': 0, 
            'width': image.width, 
            'height': image.height 
        }, true); 
 
        // 在剪裁区域中创建图像的副本 
        var resizeeClone = resizee.cloneNode(false); 
        resizeeClone.id = 'resizeeClone'; 
        ImageEditor.elements.resizeeClone = resizeeClone; 
 
        // 创建裁剪缩放手柄 
        var cropResizeHandle = document.createElement('a'); 
        cropResizeHandle.id = 'cropResizeHandle'; 
        cropResizeHandle.href = 'javascript:void(0);'; 
        ImageEditor.elements.cropResizeHandle = cropResizeHandle; 
        ADS.setStyle(cropResizeHandle, { 
            'position': 'absolute', 
            'background': 'url(interface/handles.gif) no-repeat 0 0' 
        }); 
        setNumericStyle(cropResizeHandle, { 
            'right': 0, 
            'bottom': 0, 
            'width': 18, 
            'height': 18 
        }); 
 
        // 创建保存手柄 
        var saveHandle = document.createElement('a'); 
        saveHandle.id = 'saveHandle'; 
        saveHandle.href = 'javascript:void(0);'; 
        ImageEditor.elements.saveHandle = saveHandle; 
        ADS.setStyle(saveHandle, { 
            'position': 'absolute', 
            'background': 'url(interface/handles.gif) no-repeat -40px 0' 
        }); 
        setNumericStyle(saveHandle, { 
            'left': 0, 
            'bottom': 0, 
            'width': 16, 
            'height': 18 
        }); 
 
        // 创建取消缩放手柄 
        var cancelHandle = document.createElement('a'); 
        cancelHandle.id = 'cancelHandle'; 
        ImageEditor.elements.cancelHandle = cancelHandle; 
        ADS.setStyle(cancelHandle, { 
            'position': 'absolute', 
            'background': 'url(interface/handles.gif) no-repeat -29px -11px', 
            'cursor': 'pointer' 
        }); 
        setNumericStyle(cancelHandle, { 
            'right': 0, 
            'top': 0, 
            'width': 18, 
            'height': 16 
        }); 
 
        // 添加到DOM文档里 
        document.body.appendChild(backdrop); 
        document.body.appendChild(editor); 
        editor.appendChild(resizeHandle); 
        editor.appendChild(resizee); 
        editor.appendChild(resizeeCover); 
        editor.appendChild(cropArea); 
        cropArea.appendChild(resizeeClone); 
        cropArea.appendChild(cropSizeDisplay); 
        cropArea.appendChild(cropResizeHandle); 
        cropArea.appendChild(saveHandle); 
        cropArea.appendChild(cancelHandle); 
 
        // 向DOM元素添加事件 
 
        // 缩放手柄的翻转图 
        ADS.addEvent(resizeHandle, 'mouseover', function (event) { 
            ADS.setStyle(this, { 
                'background-position': '0 -29px' 
            }); 
        }); 
        ADS.addEvent(resizeHandle, 'mouseout', function (event) { 
            ADS.setStyle(this, { 
                'background-position': '0 0' 
            }); 
        }); 
 
        // 裁剪手柄的翻转图 
        ADS.addEvent(cropResizeHandle, 'mouseover', function (event) { 
            ADS.setStyle(this, { 
                'background-position': '0px -29px' 
            }); 
        }); 
        ADS.addEvent(cropResizeHandle, 'mouseout', function (event) { 
            ADS.setStyle(this, { 
                'background-position': '0px 0px' 
            }); 
        }); 
 
        // 保存手柄的翻转图 
        ADS.addEvent(saveHandle, 'mouseover', function (event) { 
            ADS.setStyle(this, { 
                'background-position': '-40px -29px' 
            }); 
        }); 
        ADS.addEvent(saveHandle, 'mouseout', function (event) { 
            ADS.setStyle(this, { 
                'background-position': '-40px 0px' 
            }); 
        }); 
 
        // 取消手柄的翻转图 
        ADS.addEvent(cancelHandle, 'mouseover', function () { 
            ADS.setStyle(this, { 
                'background-position': '-29px -40px' 
            }); 
        }); 
        ADS.addEvent(cancelHandle, 'mouseout', function () { 
            ADS.setStyle(this, { 
                'background-position': '-29px -11px' 
            }); 
        }); 
 
 
        // 启动图像缩放事件流 
        ADS.addEvent(resizeHandle, 'mousedown', ImageEditor.resizeMouseDown); 
 
        // 启动裁剪区域拖动事件流 
        ADS.addEvent(cropArea, 'mousedown', ImageEditor.cropMouseDown); 
 
        // 启动裁剪区域缩放事件流 
        ADS.addEvent(cropResizeHandle, 'mousedown', function (event) { 
            // 因为会触发上面的事件,设置标记表明启动缩放 
            ImageEditor.info.resizeCropArea = true; 
        }); 
 
        // 防止保存手柄启动裁剪拖动事件流 
        ADS.addEvent(saveHandle, 'mousedown', function (event) { 
            ADS.stopPropagation(event); 
        }); 
        // 防止取消手柄启动裁剪拖动事件流 
        ADS.addEvent(cancelHandle, 'mousedown', function (event) { 
            ADS.stopPropagation(event); 
        }); 
 
        // 在单击保存手柄或双击 
        // 裁剪区域时保存图像 
        ADS.addEvent(saveHandle, 'click', ImageEditor.saveClick); 
        ADS.addEvent(cropArea, 'dblclick', ImageEditor.saveClick); 
        // 在单击时取消改变 
        ADS.addEvent(cancelHandle, 'click', ImageEditor.cancelClick); 
 
        // 如果窗口大小改变则调正背景幕的大小 
        ADS.addEvent(window, 'resize', function (event) { 
            var windowSize = ADS.getWinSize(); 
            setNumericStyle(backdrop, { 
                'left': 0, 
                'top': 0, 
                'width': windowSize.width, 
                'height': windowSize.height 
            }); 
        }); 
    }; 
 
    ImageEditor.resizeMouseDown = function (event) { 
        // 保存当前位置的尺寸 
        ImageEditor.info.pointerStart = ADS.getPointerPositionInDocument(event); 
        ImageEditor.info.resizeeStart = getDimensions( 
            ImageEditor.elements.resizee 
        ); 
        ImageEditor.info.cropAreaStart = getDimensions( 
            ImageEditor.elements.cropArea 
        ); 
 
        // 添加其余事件以启用拖动 
        ADS.addEvent(document, 'mousemove', ImageEditor.resizeMouseMove); 
        ADS.addEvent(document, 'mouseup', ImageEditor.resizeMouseUp); 
 
        // 停止事件流 
        ADS.stopPropagation(event); 
        ADS.preventDefault(event); 
    }; 
 
    ImageEditor.resizeMouseMove = function (event) { 
        var info = ImageEditor.info; 
 
        // 取得当前鼠标指针所在位置 
        var pointer = ADS.getPointerPositionInDocument(event); 
 
        // 基于鼠标指针来计算 
        // 图像信的宽度和高度 
        var width = (info.resizeeStart.width + pointer.x - info.pointerStart.x), 
            height = (info.resizeeStart.height + pointer.y - info.pointerStart.y); 
 
        // 最小尺寸是42平方像素 
        if (width < 42) { 
            width = 42; 
        } 
        if (height < 42) { 
            height = 42; 
        } 
 
        // 计算基于原始值的百分比 
        var widthPercent = (width / info.resizeeStart.width), 
            heightPercent = (height / info.resizeeStart.height); 
 
        // 如果按下了Shift键,则按比例缩放 
        if (ADS.getEvent(event).shiftKey) { 
            if (widthPercent > heightPercent) { 
                heightPercent = widthPercent; 
                height = Math.ceil(info.resizeeStart.height * heightPercent); 
            } else { 
                widthPercent = heightPercent; 
                width = Math.ceil(info.resizeeStart.width * widthPercent); 
            } 
        } 
 
        // 计算裁剪区域的新尺寸 
        var cropWidth = Math.ceil(info.cropAreaStart.width * widthPercent), 
            cropHeight = Math.ceil(info.cropAreaStart.height * heightPercent), 
            cropLeft = Math.ceil(info.cropAreaStart.left * widthPercent), 
            cropTop = Math.ceil(info.cropAreaStart.top * heightPercent); 
 
        // 缩放对象 
        setNumericStyle( 
            ImageEditor.elements.editor, 
            { 
                'width': width, 
                'height': height 
            } 
        ); 
        setNumericStyle( 
            ImageEditor.elements.resizee, 
            { 
                'width': width, 
                'height': height 
            } 
        ); 
        setNumericStyle( 
            ImageEditor.elements.resizeeCover, 
            { 
                'width': width, 
                'height': height 
            } 
        ); 
        setNumericStyle( 
            ImageEditor.elements.resizeHandle, 
            { 
                'left': (width - 18), 
                'top': (height - 18) 
            } 
        ); 
        setNumericStyle( 
            ImageEditor.elements.cropArea, 
            { 
                'left': cropLeft, 
                'top': cropTop, 
                'width': cropWidth, 
                'height': cropHeight 
            }, 
            true 
        ); 
        setNumericStyle( 
            ImageEditor.elements.resizeeClone, 
            { 
                'left': (cropLeft * -1), 
                'top': (cropTop * -1), 
                'width': width, 
                'height': height 
            } 
        ); 
 
        // 停止事件流 
        ADS.stopPropagation(event); 
        ADS.preventDefault(event); 
    }; 
 
    ImageEditor.resizeMouseUp = function (event) { 
        // 移除事件侦听器以停止拖动 
        ADS.removeEvent(document, 'mousemove', ImageEditor.resizeMouseMove); 
        ADS.removeEvent(document, 'mouseup', ImageEditor.resizeMouseUp); 
 
        // 停止事件流 
        ADS.stopPropagation(event); 
        ADS.preventDefault(event); 
    }; 
 
    // 裁剪区域上的mousedown事件侦听器 
    ImageEditor.cropMouseDown = function (event) { 
        // 包含缩放以限制裁剪区域的移动 
        ImageEditor.info.pointerStart = ADS.getPointerPositionInDocument(event); 
        ImageEditor.info.cropAreaStart = getDimensions( 
            ImageEditor.elements.cropArea 
        ); 
 
        // 包含缩放以限制裁剪区域的移动 
        var resizeeStart = getDimensions( 
            ImageEditor.elements.resizee 
        ); 
        ImageEditor.info.maxX = resizeeStart.left + resizeeStart.width; 
        ImageEditor.info.maxY = resizeeStart.top + resizeeStart.height; 
 
        ADS.addEvent(document, 'mousemove', ImageEditor.cropMouseMove); 
        ADS.addEvent(document, 'mouseup', ImageEditor.cropMouseUp); 
 
        ADS.stopPropagation(event); 
        ADS.preventDefault(event); 
    }; 
 
    // 裁剪区域上的mousemove事件侦听器 
    ImageEditor.cropMouseMove = function (event) { 
        var pointer = ADS.getPointerPositionInDocument(event); 
 
        if (ImageEditor.info.resizeCropArea) { 
            // 缩放裁剪区域 
            var width = ( 
                    ImageEditor.info.cropAreaStart.width 
                        + pointer.x 
                        - ImageEditor.info.pointerStart.x 
                    ), 
                height = ( 
                    ImageEditor.info.cropAreaStart.height 
                        + pointer.y 
                        - ImageEditor.info.pointerStart.y 
                    ); 
 
            // 如果按下了Shift键,则按比例缩放 
            // 计算基于原始值的百分比 
            var widthPercent = (width / ImageEditor.info.cropAreaStart.width), 
                heightPercent = (height / ImageEditor.info.cropAreaStart.height); 
 
            if (ADS.getEvent(event).shiftKey) { 
                if (widthPercent > heightPercent) { 
                    heightPercent = widthPercent; 
                    height = Math.ceil(ImageEditor.info.cropAreaStart.height * heightPercent); 
                } else { 
                    widthPercent = heightPercent; 
                    width = Math.ceil(ImageEditor.info.cropAreaStart.width * widthPercent); 
                } 
            } 
 
            // 检查新位置是否超出了边界 
            if (ImageEditor.info.cropAreaStart.left + width > ImageEditor.info.maxX) { 
                width = ImageEditor.info.maxX - ImageEditor.info.cropAreaStart.left; 
            } else if (width < 36) { 
                width = 36; 
            } 
            if (ImageEditor.info.cropAreaStart.top + height > ImageEditor.info.maxY) { 
                height = ImageEditor.info.maxY - ImageEditor.info.cropAreaStart.top 
            } else if (height < 36) { 
                height = 36; 
            } 
 
            setNumericStyle( 
                ImageEditor.elements.cropArea, 
                { 
                    'width': width, 
                    'height': height 
                }, 
                true 
            ); 
        } else { 
            // 移动裁剪区域 
            var left = ( 
                    ImageEditor.info.cropAreaStart.left 
                        + pointer.x 
                        - ImageEditor.info.pointerStart.x 
                    ), 
                top = ( 
                    ImageEditor.info.cropAreaStart.top 
                        + pointer.y 
                        - ImageEditor.info.pointerStart.y 
                    ); 
 
            // 检查新位置是否超出了边界 
            // 如有必要则加以限制 
            var maxLeft = ImageEditor.info.maxX - ImageEditor.info.cropAreaStart.width, 
                maxTop = ImageEditor.info.maxY - ImageEditor.info.cropAreaStart.height; 
 
            if (left < 0) { 
                left = 0; 
            } else if (left > maxLeft) { 
                left = maxLeft; 
            } 
            if (top < 0) { 
                top = 0; 
            } else if (top > maxTop) { 
                top = maxTop; 
            } 
 
            if (ADS.getEvent(event).shiftKey) { 
                // 按住shiftKey水平移动 
                    setNumericStyle( 
                        ImageEditor.elements.cropArea, 
                        { 
                            'left': left 
                        } 
                    ); 
                    setNumericStyle( 
                        ImageEditor.elements.resizeeClone, 
                        { 
                            'left': (left * -1) 
                        } 
                    ); 
 
 
            } else if(ADS.getEvent(event).ctrlKey){ 
                // 按住ctrl键垂直移动 
                setNumericStyle( 
                    ImageEditor.elements.cropArea, 
                    { 
                        'top': top 
                    } 
                ); 
                setNumericStyle( 
                    ImageEditor.elements.resizeeClone, 
                    { 
                        'top': (top * -1) 
                    } 
                ); 
            } else { 
                setNumericStyle( 
                    ImageEditor.elements.cropArea, 
                    { 
                        'left': left, 
                        'top': top 
                    } 
                ); 
                setNumericStyle( 
                    ImageEditor.elements.resizeeClone, 
                    { 
                        'left': (left * -1), 
                        'top': (top * -1) 
                    } 
                ); 
            } 
 
 
        } 
    }; 
 
    ImageEditor.cropMouseUp = function (event) { 
        // 移除所有事件 
        ImageEditor.info.resizeCropArea = false; 
 
        ADS.removeEvent(document, 'mousemove', ImageEditor.cropMouseMove); 
        ADS.addEvent(document, 'mouseup', ImageEditor.cropMouseUp); 
    }; 
 
    ImageEditor.saveClick = function (event) { 
        // 此处只是发出一个警告 
        alert('This should save the information back to the server.'); 
 
        // 如果成功则卸载编辑器 
        ImageEditor.unload(event); 
    }; 
 
    ImageEditor.cancelClick = function (event) { 
        if (confirm('Are you sure you want to cancel your changes?')) { 
            // 卸载编辑器 
            ImageEditor.unload(event); 
        } 
    }; 
 
    window.ADS.ImageEditor = ImageEditor; 
})(); 
 
ADS.addLoadEvent(ADS.ImageEditor.load);

本文参考链接:https://www.cnblogs.com/webFrontDev/archive/2012/12/23/2830180.html