一、目标1:上传图片并展示(搞定)

参看一篇博客:《上传一张图片并在页面中展示》
参看阮一峰老师的开源书籍的其中章节:《FileReader 对象》

  1. <input type="file" id="img"/><br /><br /><br />
  2. <canvas id="canvas"></canvas>
  1. var image;
  2. img.onchange = function () {
  3. let file = document.querySelector('input[type=file]').files[0] // 获取选择的文件,这里是图片类型
  4. let reader = new FileReader()
  5. reader.readAsDataURL(file) //读取文件并将文件以URL的形式保存在resulr属性中 base64格式
  6. reader.onload = function(e) { // 文件读取完成时触发
  7. let result = e.target.result // base64格式图片地址
  8. image = new Image();
  9. image.src = result // 设置image的地址为base64的地址
  10. image.onload = function(){
  11. var canvas = document.querySelector("#canvas");
  12. var context = canvas.getContext("2d");
  13. canvas.width = image.width; // 设置canvas的画布宽度为图片宽度
  14. canvas.height = image.height;
  15. context.drawImage(image, 0, 0, image.width, image.height) // 在canvas上绘制图片
  16. //let dataUrl = canvas.toDataURL('image/jpeg', 0.92) // 0.92为压缩比,可根据需要设置,设置过小会影响图片质量
  17. // dataUrl 为压缩后的图片资源,可将其上传到服务器
  18. }
  19. }
  20. }
  1. /* HTML 代码如下
  2. <input type="file" onchange="previewFile()">
  3. <img src="" height="200">
  4. */
  5. function previewFile() {
  6. var preview = document.querySelector('img');
  7. var file = document.querySelector('input[type=file]').files[0];
  8. var reader = new FileReader();
  9. reader.addEventListener('load', function () {
  10. preview.src = reader.result;
  11. }, false);
  12. if (file) {
  13. reader.readAsDataURL(file);
  14. }
  15. }

二、目标2:将图片拖入指定的位置(搞定)

拿到拖动的信息可以参看这篇博客:《HTML5 - 通过拖拽读取图片文件》
参看 MDN 对于拖动元素处理的相关文档:《HTML 拖放 API》《拖拽操作》

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Read Image</title>
  6. <style>
  7. #dropBox {
  8. margin: 15px;
  9. width: 250px;
  10. height: 250px;
  11. border: 5px dashed gray;
  12. border-radius: 8px;
  13. background: lightyellow;
  14. background-size: 100%;
  15. background-repeat: no-repeat;
  16. text-align: center;
  17. }
  18. #dropBox div {
  19. margin: 75px 45px;
  20. color: orange;
  21. font-size: 25px;
  22. font-family: Verdana, Arial, sans-serif;
  23. }
  24. input {
  25. margin: 15px;
  26. }
  27. </style>
  28. <script>
  29. var dropBox;
  30. window.onload = function() {
  31. dropBox = document.getElementById("dropBox");
  32. dropBox.ondragenter = ignoreDrag;
  33. dropBox.ondragover = ignoreDrag;
  34. dropBox.ondrop = drop;
  35. }
  36. function ignoreDrag(e) {
  37. //因为我们在处理拖放,所以应该确保没有其他元素会取得这个事件
  38. e.stopPropagation();
  39. e.preventDefault();
  40. }
  41. function drop(e) {
  42. //取消事件传播及默认行为
  43. e.stopPropagation();
  44. e.preventDefault();
  45. //取得拖进来的文件
  46. var data = e.dataTransfer;
  47. var files = data.files;
  48. //将其传给真正的处理文件的函数
  49. processFiles(files);
  50. }
  51. function processFiles(files) {
  52. var file = files[0];
  53. var output = document.getElementById("fileOutput");
  54. //创建FileReader
  55. var reader = new FileReader();
  56. //告诉它在准备好数据之后做什么
  57. reader.onload = function (e) {
  58. //使用图像URL来绘制dropBox的背景
  59. dropBox.style.backgroundImage = "url('" + e.target.result + "')";
  60. };
  61. //读取图片
  62. reader.readAsDataURL(file);
  63. }
  64. function showFileInput() {
  65. var fileInput = document.getElementById("fileInput");
  66. fileInput.click();
  67. }
  68. </script>
  69. </head>
  70. <body>
  71. <div id="dropBox">
  72. <div>将图片拖放到此处...</div>
  73. </div>
  74. <input id="fileInput" type="file" onchange="processFiles(this.files)">
  75. <img id="thumbnail">
  76. </body>
  77. </html>

三、目标3:预览图片并下载(搞定)

参看一篇博客:《js 将canvas生成图片下载或直接保存一张图片》

  • 下载 canvas(搞定)
  • 放置图片到 canvas 上(搞定)
  • 根据参数原样地把图片放置到 canvas 上(搞定)

四、目标4:可调节画板的格子(搞定)

  • 调节线(搞定)
  • 图片随着调节线的移动而变化(搞定)

五、后续优化

目前做的非常简陋,需要做以下优化

  • 重新整理数据,调整数据结构,把数据放在相对合理的位置
  • 重写调节线的逻辑,现在的实现方法很 low
  • 每个盒子里图片可以调节大小和位置,默认态是撑满盒子
  • 优化编写每个组件,加强其功能

「@浪里淘沙的小法师」