前端图片处理

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

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>

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: PNG(Portable Network Graphics)是一种无损的位图图像格式,旨在替代GIF格式。PNG图像可以支持多种色彩空间和透明度,以及不同的图像压缩算法。 前端处理图片时,PNG格式通常用于保留透明度,例如创建圆角图片或阴影效果。此外,PNG格式还可以用于在网页上显示透明的网页标签或图标。 要处理PNG图像,您可以使用各种图像编辑软件,例如Adobe Photoshop或GIMP。您可以使用这些软件来剪裁、调整大小、更改透明度或应用其他滤镜或效果。 ### 回答2: 前端处理图片PNG的过程主要分为以下几个步骤: 1. 获取图片:首先从服务器获取图片,可以使用向服务器发送请求的方式获取图片的二进制数据。 2. 创建图片对象:通过使用Blob对象或者Data URI将获取到的图片二进制数据转换成图片对象。Blob对象可以通过URL.createObjectURL(blob)方法来创建,Data URI可以直接将图片二进制数据转换成base64编码的字符串。 3. 渲染图片:在HTML页面上,可以使用<img>标签将获取到的图片对象进行渲染,显示在页面上。设置<img>标签的src属性为之前创建的Blob对象的URL或者Data URI字符串。 4. 处理图片:如果需要对图片进行处理,可以使用HTML5中的Canvas元素来进行操作。将<img>标签中的图片绘制到Canvas上,然后使用Canvas的相关API进行图片处理,比如调整大小、裁剪、旋转等操作。 5. 导出图片:如果需要将处理后的图片导出,在Canvas上进行处理后,可以将Canvas上的内容导出为图片,通常使用Canvas的toDataURL()方法将处理后的图片转换成Data URI字符串,然后可以下载或者展示在页面上。 总结起来,前端处理图片PNG的主要步骤包括获取图片、创建图片对象、渲染图片处理图片和导出图片。通过这些步骤,前端可以实现对PNG格式的图片进行处理和展示。 ### 回答3: 在前端处理PNG图片时,首先我们需要获取图片数据,可以通过网络请求获取到图片的二进制数据。接下来,我们可以使用JavaScript的FileReader对象将图片转换为可读取的数据。 通过FileReader的readAsDataURL方法,我们可以将图片转换为Base64格式的字符串,这样我们就可以在前端进行展示或者其他操作。读取图片的代码如下所示: ```javascript function handlePNGImageStream(imageStream) { const reader = new FileReader(); reader.onload = function(event) { const base64Image = event.target.result; // 在这里可以将base64格式的图片进行展示或者其他处理 }; reader.readAsDataURL(imageStream); } // 模拟获取图片的操作 fetch('image.png') .then(response => response.blob()) .then(blob => handlePNGImageStream(blob)); ``` 在上述代码中,我们通过fetch方法模拟了获取图片的操作,然后将获取到的数据传给handlePNGImageStream函数。在handlePNGImageStream函数中,我们创建了一个FileReader对象,并设置了它的onload事件处理函数,当文件读取完成时,将触发该事件。 在事件处理函数中,我们可以通过event.target.result获取到Base64格式的图片字符串,然后可以将其展示在页面上或者进行其他操作。 总之,前端处理PNG图片主要是通过将图片转换为Base64格式的字符串来进行操作,这样便于在前端进行显示和处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值