图片压缩canvas

小松鼠喝多了 小松鼠喝多了     2022-11-08     147

关键词:

实现流程:
  • 获取<input type="file">上传的文件;
  • 使用FileReader读取图片,并新建一个Image对象将FileReader读取的图片数据放进去;
  • 使用canvas将Image对象等比缩放并写入到画布中,保存为base64格式的数据(这里使用的是FormData对象上传,其实这里已经可以直接将base64的数据通过ajax使用post方法上传到服务器,即可避免下面两个步骤);
  • 新建一个Blob对象将base64数据放入;
  • 使用FormData对象上传到第三方云储存服务器;
使用HTML原生<input type="file">上传图片,下面是踩的一些小坑:
  • accept设定上传文件的类型,这里直接用image/*,不指定具体的后缀名,否则部分安卓手机下无法上传图片;
  • 添加multiple属性可选取多张图片(本例只做选取单张图片);
  • capture="camera"属性可以调用摄像头(添加此属性在iPhone下会直接调用摄像头,而不会读取相册;且目前安卓和ios设备使用accept="image/*"均可选择使用摄像头拍照还是使用相册的图片,所以该属性可以忽略)。
<input id="imgUpload" type="file" onchange="addPic" accept="image/*" />
当input文件触发change事件后获取上传的文件
function addPic(e)
  if (typeof FileReader === ‘undefined‘) 
    return alert(‘你的浏览器不支持上传图片哟!‘);
  
  var files = e.target.files || e.dataTransfer.files;
  if(files.length > 0)
    imgResize(file[0], callback);
  

使用FileReader获取图片数据,并使用canvas压缩
  • ios手机拍照会旋转90度,这里必须判断是否ios手机做出相应处理后再上传
function imgResize(file, callback)
  var fileReader = new FileReader();
  fileReader.onload = function()
    var IMG = new Image();
    IMG.src = this.result;
    IMG.onload = function()
      var w = this.naturalWidth, h = this.naturalHeight, resizeW = 0, resizeH = 0;
      // maxSize 是压缩的设置,设置图片的最大宽度和最大高度,等比缩放,level是报错的质量,数值越小质量越低
      var maxSize = 
        width: 500,
        height: 500,
        level: 0.6
      ;
      if(w > maxSize.width || h > maxSize.height)
        var multiple = Math.max(w / maxSize.width, h / maxSize.height);
        resizeW = w / multiple;
        resizeH = w / multiple;
       else 
        // 如果图片尺寸小于最大限制,则不压缩直接上传
        return callback(file)
      
      var canvas = document.createElement(‘canvas‘),
      ctx = canvas.getContext(‘2d‘);
      if(window.navigator.userAgent.indexOf(‘iPhone‘) > 0)
        canvas.width = resizeH;
        canvas.height = resizeW;
        ctx.rorate(90 * Math.PI / 180);
        ctx.drawImage(IMG, 0, -resizeH, resizeW, resizeH);
      else
        canvas.width = resizeW;
        canvas.height = resizeH;
        ctx.drawImage(IMG, 0, 0, resizeW, resizeH);
      
      var base64 = canvas.toDataURL(‘image/jpeg‘, maxSize.level);
      convertBlob(window.atob(base64.split(‘,‘)[1]), callback);
    
  ;
  fileReader.readAsDataURL(file);

将base64的数据转换成一个Blob对象
  • 安卓手机不支持Blob构造方法
function convertBlob(base64, callback)
  var buffer = new ArrayBuffer(base64.length);
  var ubuffer = new Uint8Array(buffer);
  for (var i = 0; i < base64.length; i++) 
    ubuffer[i] = base64.charCodeAt(i)
  
  var blob;
  try 
    blob = new Blob([buffer], type: ‘image/jpg‘);
   catch (e) 
    window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
    if(e.name === ‘TypeError‘ && window.BlobBuilder)
      var blobBuilder = new BlobBuilder();
      blobBuilder.append(buffer);
      blob = blobBuilder.getBlob(‘image/jpg‘);
    
  
  callback(blob)

使用HTML5的FormData对象上传数据
function callback(fileResize)
  var data = new FormData();
  data.append(‘file‘, fileResize);
  var config = 
    headers: ‘Content-Types‘: ‘multipart/form-data‘
  ;
  // 这里用的es6语法发起请求,可以无视
  axios.post(url, data, config).then().catch(e)



链接:https://www.jianshu.com/p/4587312d2f44

canvas使用canvas压缩图片大小

...些面试,其中有一个面试题是这样的,使用canvas怎样压缩图片大小这道题给我问蒙了,因为我没用过canvas压缩图片回去查资料,发现手机端在上传图片的时候,调起相机拍照的时候超过2m了,所以用到canvas压缩,优化用户体验解... 查看详情

canvas压缩图片的大小(代码片段)

使用 signature_padcanvas库生成的图片太大。但又没有提供方法来压缩。当然这是根据你canvas的画布大小决定的,某些原因导致我的画布就得是那么大。随随便便一个图片转化为base64之后就是200kb-300kb。所以得想办法压缩。思路就... 查看详情

图片压缩canvas

...:获取<inputtype="file">上传的文件;使用FileReader读取图片,并新建一个Image对象将FileReader读取的图片数据放进去;使用canvas将Image对象等比缩放并写入到画布中,保存为base64格式的数据(这里使用的是FormData对象上传,其实这... 查看详情

微信小程序图片压缩

参考技术A微信小程序图片压缩有三种方法,一种是使用官方提供的接口wx.compressImage(Objectobject);一种是通过压缩图片的大小,利用canvas重绘来得到压缩图片;最后一种安装第三方图片压缩包。由于第一种方法网上很多人说压缩... 查看详情

前端预览图片和h5canvas压缩图片上传

思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法得到base64字符串来实现压缩。1.base64转二进制文件/***dataURLtoblob,reftohttps://gist.github.com/fupslot/5015897*@paramdataURI*@returns{Blob}*/functiondataURItoBlob(dataURI){var 查看详情

前端通过canvas实现图片压缩

在一次的项目中,需要用户上传图片,目前市场随便一个手机拍出来的照片都是好几兆,直接上传特别占用带宽,影响用户体验,所以要求对用户上传图片进行压缩后再上传;那么前端怎么实现这个功能呢?亲测可将4M图片压缩... 查看详情

图片压缩传输(代码片段)

...动不动就是5,6兆,传输速度太慢,因此压缩一下。 对图片压缩 1varcanvas=document.createElement("canvas");2varctx=canvas.getContext(‘2d‘);3//瓦片canvas4vartCanvas=document.createElement("canvas");5var 查看详情

前端js利用canvas的drawimage()对图片进行压缩

  对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验。  这种体验包括两方面:  1、由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络... 查看详情

h5压缩图片上传(filereader+canvas)

因为最近项目做一个webApp的页面,需要上传图片,总结了一下,思路如下:一、监听一个 input(type=‘file‘)的change事件,然后拿到文件的file;<inputid="img-input"class="upload-input"type="file"accept="image/*"id="imgbox"multiple/>二、把file转... 查看详情

canvas图片压缩,局部放大,像素处理(代码片段)

直接上代码:(具体看注释)需要引用jquery.min.js<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><metahttp-equi 查看详情

js压缩上传图片base64长度

im发送图片,现将图片压缩再上传1)调用 FileReader 的 reader.readAsDataURL(img);方法,在其onload事件中,将用户选择的图片读入Image对象.2)在image对象的onload事件中,通过canvas的canvas.getContext(‘2d‘) 的drawImage方法,将Image改变大... 查看详情

前端js实现canvas压缩图片并上传(代码片段)

一.上传前压缩图片的好处可以减少用户的等待时间,提升使用体验,目前手机拍摄的图片文件大小一般在几M左右,文件直接上传时会有卡顿现象。可以减少服务端的存储空间。再次回去图片资源是也可以快速的加载... 查看详情

前端js实现canvas压缩图片并上传(代码片段)

一.上传前压缩图片的好处可以减少用户的等待时间,提升使用体验,目前手机拍摄的图片文件大小一般在几M左右,文件直接上传时会有卡顿现象。可以减少服务端的存储空间。再次回去图片资源是也可以快速的加载... 查看详情

html5fileapi加canvas实现图片前端js压缩并上传(转载)

一、图片上传前端压缩的现实意义对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验。这种体验包括两方面:由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时... 查看详情

img对象,file对象,base64,canvas对象相互转换以及图片压缩

先上一张图: 以上图片是js几乎所有图片类型的转换方式了。接下来讲讲几种常用的类型转换:1、urltoImage(url,fn)会通过一个url加载所需要的图片对象,其中url参数传入图片的url,fn为回调方法,包含一个Image对象的参数,代码如... 查看详情

图片压缩上传(代码片段)

图片压缩的方法//图片压缩compressImage(file,success,error)//图片小于1M不压缩//if(file.size<Math.pow(1024,2))//returnsuccess(file);//constname=file.name;//文件名constreader=newFileReader();reader.readAsDataURL(file);reader.onload=e=>constsrc=e.target.result;constimg=newImage... 查看详情

h5相机上传图片压缩

...设置压缩后的最大宽度or高度;//2、设置压缩比例,根据图片的不同size大小,设置不同的压缩比。functioncompress(res,fileSize){//res代表上传的图片,f 查看详情

前端图片压缩优化工具conversion

参考技术Aimage-conversion是一个简单易用的JS图片转换工具,提供了多种Image、Canvas、File和dataURL之间的转换方法。另外,image-conversion可以指定大小来压缩图片。1、将图像压缩到200kb:2、以0.9的质量压缩图像image-conversion提供了多种... 查看详情