一、目标1:上传图片并展示(搞定)
参看一篇博客:《上传一张图片并在页面中展示》
参看阮一峰老师的开源书籍的其中章节:《FileReader 对象》
<input type="file" id="img"/><br /><br /><br />
<canvas id="canvas"></canvas>
var image;
img.onchange = function () {
let file = document.querySelector('input[type=file]').files[0] // 获取选择的文件,这里是图片类型
let reader = new FileReader()
reader.readAsDataURL(file) //读取文件并将文件以URL的形式保存在resulr属性中 base64格式
reader.onload = function(e) { // 文件读取完成时触发
let result = e.target.result // base64格式图片地址
image = new Image();
image.src = result // 设置image的地址为base64的地址
image.onload = function(){
var canvas = document.querySelector("#canvas");
var context = canvas.getContext("2d");
canvas.width = image.width; // 设置canvas的画布宽度为图片宽度
canvas.height = image.height;
context.drawImage(image, 0, 0, image.width, image.height) // 在canvas上绘制图片
//let dataUrl = canvas.toDataURL('image/jpeg', 0.92) // 0.92为压缩比,可根据需要设置,设置过小会影响图片质量
// dataUrl 为压缩后的图片资源,可将其上传到服务器
}
}
}
/* HTML 代码如下
<input type="file" onchange="previewFile()">
<img src="" height="200">
*/
function previewFile() {
var preview = document.querySelector('img');
var file = document.querySelector('input[type=file]').files[0];
var reader = new FileReader();
reader.addEventListener('load', function () {
preview.src = reader.result;
}, false);
if (file) {
reader.readAsDataURL(file);
}
}
二、目标2:将图片拖入指定的位置(搞定)
拿到拖动的信息可以参看这篇博客:《HTML5 - 通过拖拽读取图片文件》
参看 MDN 对于拖动元素处理的相关文档:《HTML 拖放 API》、《拖拽操作》
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Read Image</title>
<style>
#dropBox {
margin: 15px;
width: 250px;
height: 250px;
border: 5px dashed gray;
border-radius: 8px;
background: lightyellow;
background-size: 100%;
background-repeat: no-repeat;
text-align: center;
}
#dropBox div {
margin: 75px 45px;
color: orange;
font-size: 25px;
font-family: Verdana, Arial, sans-serif;
}
input {
margin: 15px;
}
</style>
<script>
var dropBox;
window.onload = function() {
dropBox = document.getElementById("dropBox");
dropBox.ondragenter = ignoreDrag;
dropBox.ondragover = ignoreDrag;
dropBox.ondrop = drop;
}
function ignoreDrag(e) {
//因为我们在处理拖放,所以应该确保没有其他元素会取得这个事件
e.stopPropagation();
e.preventDefault();
}
function drop(e) {
//取消事件传播及默认行为
e.stopPropagation();
e.preventDefault();
//取得拖进来的文件
var data = e.dataTransfer;
var files = data.files;
//将其传给真正的处理文件的函数
processFiles(files);
}
function processFiles(files) {
var file = files[0];
var output = document.getElementById("fileOutput");
//创建FileReader
var reader = new FileReader();
//告诉它在准备好数据之后做什么
reader.onload = function (e) {
//使用图像URL来绘制dropBox的背景
dropBox.style.backgroundImage = "url('" + e.target.result + "')";
};
//读取图片
reader.readAsDataURL(file);
}
function showFileInput() {
var fileInput = document.getElementById("fileInput");
fileInput.click();
}
</script>
</head>
<body>
<div id="dropBox">
<div>将图片拖放到此处...</div>
</div>
<input id="fileInput" type="file" onchange="processFiles(this.files)">
<img id="thumbnail">
</body>
</html>
三、目标3:预览图片并下载(搞定)
参看一篇博客:《js 将canvas生成图片下载或直接保存一张图片》
- 下载 canvas(搞定)
- 放置图片到 canvas 上(搞定)
- 根据参数原样地把图片放置到 canvas 上(搞定)
四、目标4:可调节画板的格子(搞定)
- 调节线(搞定)
- 图片随着调节线的移动而变化(搞定)
五、后续优化
目前做的非常简陋,需要做以下优化
- 重新整理数据,调整数据结构,把数据放在相对合理的位置
- 重写调节线的逻辑,现在的实现方法很 low
- 每个盒子里图片可以调节大小和位置,默认态是撑满盒子
- 优化编写每个组件,加强其功能
「@浪里淘沙的小法师」