html5拖拽和缩小图片的解决方案
比如说,这样的场景:
要拖拽文件到绿色区域中,然后产生这样的效果:
这里,绿色框是图片尺寸的一半,即:绿色框长宽为512×384,图片大小为1024×768。
需要用到如下技术要点:
- html5拖拽文件的支持
- html5对文件读取的支持
- 读取到的图片是对二进制数据的base64编码,可在img标签中直接显示
- 使用canvas,在其中显示img
- canvas的内容通过html5支持的函数导出为base64编码的图片信息
上面示例的代码,html:
<!DOCTYPE html>
<html>
<head>
<title>云楼书编辑器</title>
<meta charset=”UTF-8″/><script type=”text/javascript” src=’js/jquery/jquery-1.7.1.min.js’></script>
<script type=”text/javascript” src=”js/jquery-ui/jquery-ui-1.8.18.custom.min.js”></script>
<script type=”text/javascript” src=’js/underscore/underscore-min.js’></script><script type=”text/javascript” src=’js/app.js’></script>
<link rel=”stylesheet” href=”css/main.css” type=”text/css”>
<link type=”text/css” href=”js/jquery-ui/css/smoothness/jquery-ui-1.8.18.custom.css” rel=”stylesheet” />
</head>
<body>
<div class=”app”>
<div class=”workSpace”>
<div class=”toolBar”>
<button class=”toolBarItem toolBarTextItem”>文本</button>
<button class=”toolBarItem toolBarMediaItem”>媒体</button>
</div>
<div class=”editArea”>
</div>
</div>
</div>
<script>
initApp();
</script>
</body>
</html>
这里用到了jQuery,jQuery ui,但是没有用到underscore。
css代码:
@CHARSET “utf-8″;
@IMPORT url(“layout_main.css”);
body{
background: rgba(0,0,0,0.1);
margin: 0;
}.app{
margin: 0 auto;
width: 1024px;
height: 768px;
background: rgb(240, 240, 240);
}.workSpace{
background: rgba(255,255,255,1);
width: 1024px;
height: 768px;
position: absolute;
}.toolBar{
background: rgb(224, 224, 224);
width: 1024px;
height: 40px;
position: absolute;
vertical-align:middle;
}.editArea{
background: rgb(255, 255, 255);
top: 40px;
width: 1024px;
height: 728px;
position: absolute;
}.toolBarItem{
height: 34px;
margin: 3px;
}.textArea{
height: 100px;
width: 100px;
position: absolute;
background: rgb(255, 249, 178);
}.mediaArea{
height: 384px;
width: 512px;
position: absolute;
background: rgb(212, 255, 176);
}
js代码:
function initApp() {
//点击文本按钮,创建新的文本框
$(‘.toolBarTextItem’).click(function () {
var block = $(‘<div class=”ui-resizable textArea”></div>’);
block.appendTo($(‘.editArea’).first());
block.resizable().draggable();//可改变尺寸,可拖拽
});//点击媒体按钮,创建新的媒体框
$(‘.toolBarMediaItem’).click(function () {
var block = $(‘<div class=”ui-resizable mediaArea”></div>’);
block.appendTo($(‘.editArea’).first());
block.resizable().draggable();//可改变尺寸,可拖拽block.on(‘dragover drop’, function (e) {//处理文件拖拽和释放事件
e.stopPropagation();
e.preventDefault();
var b = e.target;
if (e.type == ‘drop’) {//处理文件释放
console.log(‘drop file:’ + e.type);
var files = e.originalEvent.dataTransfer.files;//获取文件列表for (var i = 0; i < files.length; i++) {
var file = files[i];
console.log(‘file:’ + file.type);
if (file.type.match(‘image.*’)) {//如果是图片文件
console.log(‘file.name:’ + file.name);
var reader = new FileReader();//创建文件读取器
reader.onload = (function (theFile) {//当读取到文件后的函数
return function (e) {
console.log(‘on load’);
var canvas=$(‘<canvas></canvas>’);//创建canvas
canvas[0].width=1024/2;
canvas[0].height=768/2;
canvas.appendTo($(b));var image = new Image();//创建图片,图片内容是拖拽文件
image.src=e.target.result;var context=canvas[0].getContext(’2d’);//图片写入canvas
context.drawImage(image,0,0,image.width*.5,image.height*.5);var newImage=new Image();//创建新图片,内容来源于canvas
newImage.src=canvas[0].toDataURL(‘image/jpeg’);
$(newImage).appendTo($(b));canvas.remove();//删除canvas
};
})(file);reader.readAsDataURL(file);
console.log(‘read file’);
}
}
}
});
});
}
经过测试,在chrome下和firefox下可以执行,safari当前版本5.1不支持FileReader,无法执行。另外Opera 11.61也不能执行,不支持文件拖拽api。
源代码可见: https://github.com/MarshalW/BookEditor/tree/v0.1