这篇文章有几个功能,第一个是支持拖拽,第二个是压缩,第三个是裁剪编辑,第四个是上传和上传进度显示。

1、拖拽上传

拖拽读取图片的功能主要是监听HTML5的 drag 事件,这个没什么好说的,查查API就知道怎么做的,主要在于怎么读取用户拖过来的图片并他把转成base64以在本地显示出来,代码如下:

2、压缩图片

压缩图片可以借助canvas,canvas可以很方便的实现压缩,其原理是把一张图片画到一个小的画布,然后再把这个画布的内容导出base64,就能够拿到一张被压小的图片了,修改上面代码如下

3、裁剪图片

裁剪图片,使用了一个 cropper 插件,这个插件还是挺强大的,支持裁剪、旋转、翻转,但是他并没有对图片真正的处理,只是记录了用户做了哪些变换,然后你自己再去处理,官方文档在这里,只要仔细阅读就可以上手了,

下面附上完整代码

<html lang="en"><head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <link  href="cropper.css" rel="stylesheet">
  <script src="http://code.jquery.com/jquery-2.2.4.min.js"></script>
  <script src="cropper.js"></script>
  <style>
    .box{
      width: 200px;
      height: 200px;
      border: 1px #333 dashed;
    }
    .box img{
      width: 100%;
    }
    .mini{
      width: 360px;
      height: 360px;
    }
    .btn{
      margin-top: 20px;
    }
    .small{
      width: 100px;
      height: 100px;
      overflow:hidden;
      border: 1px solid #333;
      margin: 10px;
    }
  </style>
</head>
<body>
  <h3>拖拽过来的图片</h3>
  <div class="box"><img src=""></div>
  <h3>裁剪预览图</h3>
  <div class="small"></div>
  <h3>压缩过后的图片</h3>
  <div class="mini"><img src=""></div>
  <div class="btn"><button>裁剪</button></div>
  <h4>裁剪后的图</h4>
  <div class="output"><img src=""></div>
<script>
  let cropper = ''
  let handler = {
    init: function(dom){
      dom.on('dragover', function(event){
        console.log('拖拽中')
        event.preventDefault()
      })
      dom.on('drop', function(event){
        event.preventDefault()
        let file = event.originalEvent.dataTransfer.files[0]
        console.log('拖拽结束')
        handler.handleDrop($(this), file)
      })
    },
    handleDrop: function(dom, file) {
      let $img = dom.find('img')
      handler.readImgFile(file, $img)
    },
    readImgFile: function(file, $img){
      let reader = new FileReader(file)
      console.log('显示图片')
      if(!file || file.type.split("/")[0] !== 'image') {
        alert('请选择图片')
        return
      }
      reader.readAsDataURL(file)
      reader.onload = function(event) {
        let base64 = event.target.result;
        $img.attr('src', base64)                         // 显示拖拽进来的图片
        handler.compress($img[0], 1500, file.type)
      }
    },
    compress: function(img, maxWidth, mimeType) {
      let cvs = document.createElement('canvas')
      img.onload = function(){
        let width = img.naturalWidth
        let height = img.naturalHeight
        imgRatio = width / height
        if(width > maxWidth){
          width = maxWidth
          height = width / imgRatio
        }
        cvs.width = width
        cvs.height = height
        let ctx = cvs.getContext('2d')
        ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, width, height)
        let quality = width >= 1500 ? 0.5 : width > 600 ? 0.6 : 1
        let newImageData = cvs.toDataURL(mimeType, quality)
        // let resultImg = new Image()
        // resultImg.src = newImageData
        $(".mini img").attr('src',newImageData)           // 显示压缩过的图片
        let $image = $(".mini img");
        $image.cropper({
          preview: '.small',
          viewMode: 1,
          aspectRatio: 300 /300,
          autoCropArea: 0.9,
          ready() {
            cropper = $image.data('cropper');
          },
          crop: function(event) {
            console.log(event.detail.x);
            console.log(event.detail.y);
            console.log(event.detail.width);
            console.log(event.detail.height);
            console.log(event.detail.rotate);
            console.log(event.detail.scaleX);
            console.log(event.detail.scaleY);
          }
        });
      }
    }
  }
  handler.init($('.box'))
  $('.btn button').on('click',function() {
    let result = cropper.getCroppedCanvas({
      width: 200,
      height: 200,
    })
    let imgurl = result.toDataURL("image/jpeg", 0.5);
    $(".output img").attr("src",imgurl)                    // 显示裁剪后的图片
  })
</script>
</body>
</html>

以上代码并不完美,有很多瑕疵,只供参考。

03-26 01:08