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);