canvas使用canvas压缩图片大小

teemor teemor     2023-04-08     315

关键词:

------------恢复内容开始------------

由于各种大大小小的原因,自己最近经历了一些面试,其中有一个面试题是这样的,使用canvas怎样压缩图片大小

这道题给我问蒙了,因为我没用过canvas压缩图片

回去查资料,发现手机端在上传图片的时候,调起相机拍照的时候超过2m了,所以用到canvas压缩,优化用户体验

解决方法:

1. 将图片的file文件转成baseURL

2. 创建一个image表情去接受文件获取图片的宽高和比例。

3. 创建canvas画布设置画布的大小。

4. 将图片绘制到canvas上面。

5. 对canvas进行压缩处理,获取新的baseURL

6. 将baseURL转化回文件

 

1.

/**
* @param 二进制文件流 file 
* @param 回调函数,返回base64 fn 
*/
function changeFileToBaseURL(file,fn)
  // 创建读取文件对象
      var fileReader = new FileReader();
      //如果file没定义返回null
      if(file == undefined) return fn(null);
      // 读取file文件,得到的结果为base64位
      fileReader.readAsDataURL(file);
      fileReader.onload = function()
        // 把读取到的base64
        var imgBase64Data = this.result;
        fn(imgBase64Data);
      
    

2.
/**
 * 将base64转换为文件
 * @param baseURL dataurl 
 * @param 文件名称 filename 
 * @return 文件二进制流
*/
function dataURLtoFile(dataurl, filename) 
    var arr = dataurl.split(‘,‘), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--)
        u8arr[n] = bstr.charCodeAt(n);
    
    return new File([u8arr], filename, type:mime);
 


3.

/**
* canvas压缩图片
* @param 参数obj param 
* @param 文件二进制流 param.file 必传
* @param 目标压缩大小 param.targetSize 不传初始赋值-1
* @param 输出图片宽度 param.width 不传初始赋值-1,等比缩放不用传高度
* @param 输出图片名称 param.fileName 不传初始赋值image
* @param 压缩图片程度 param.quality 不传初始赋值0.92。值范围0~1
* @param 回调函数 param.succ 必传
*/
function pressImg(param)
  //如果没有回调函数就不执行
  if(param && param.succ)
     //如果file没定义返回null
     if(param.file == undefined) return param.succ(null);
     //给参数附初始值
     param.targetSize = param.hasOwnProperty("targetSize") ? param.targetSize : -1;
     param.width = param.hasOwnProperty("width") ? param.width : -1;
     param.fileName = param.hasOwnProperty("fileName") ? param.fileName: "image";
     param.quality = param.hasOwnProperty("quality") ? param.quality : 0.92;
     var _this = this;
     // 得到文件类型
     var fileType = param.file.type;
     // console.log(fileType) //image/jpeg
     if(fileType.indexOf("image") == -1)
       console.log(‘请选择图片文件^_^‘);
       return param.succ(null);
     
     //如果当前size比目标size小,直接输出
     var size = param.file.size;
     if(param.targetSize > size)
       return param.succ(param.file);
     
     // 读取file文件,得到的结果为base64位
     changeFileToBaseURL(param.file,function(base64)
       if(base64)
         var image = new Image();
         image.src = base64;
         image.onload = function()
           // 获得长宽比例
           var scale = this.width / this.height;
           // console.log(scale);
           //创建一个canvas
           var canvas = document.createElement(‘canvas‘);
           //获取上下文
           var context = canvas.getContext(‘2d‘);
           //获取压缩后的图片宽度,如果width为-1,默认原图宽度
           canvas.width = param.width == -1 ? this.width : param.width;
           //获取压缩后的图片高度,如果width为-1,默认原图高度
           canvas.height = param.width == -1 ? this.height : parseInt(param.width / scale);
           //把图片绘制到canvas上面
           context.drawImage(image, 0, 0, canvas.width, canvas.height);
           //压缩图片,获取到新的base64Url
           var newImageData = canvas.toDataURL(fileType,param.quality);
           //将base64转化成文件流
           var resultFile = dataURLtoFile(newImageData,param.fileName);
           //判断如果targetSize有限制且压缩后的图片大小比目标大小大,就弹出错误
           if(param.targetSize != -1 && param.targetSize < resultFile.size)
             console.log("图片上传尺寸太大,请重新上传^_^");
             param.succ(null);
           else
             //返回文件流
             param.succ(resultFile);
           
         
       
     );
   
 



------------恢复内容结束------------

微信小程序图片压缩

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

图片压缩canvas

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

canvas压缩图片

//图片压缩,默认同比例压缩compressImg(URL,callback)//生成canvasletcanvas=document.createElement(‘canvas‘)letctx=canvas.getContext(‘2d‘)letimage=newImage()image.setAttribute(‘crossOrigin‘,‘anonymous‘)image.src=URLletquality=0.3image.onload=()=>canvas.width=image.width... 查看详情

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

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

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

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

canvas压缩裁切图片和格式转换的方法(代码片段)

...题。例如,获取300*300大小的头像,实现以下效果: 使用方式:<!--引入js文件--><scripttype="text/javascript"src="./compressImage.js"></script><!--input标签--><inputtype="file"id="avatar"name="avatar"accept="image/png,image/jpeg">  裁... 查看详情

canvas绘制图片

...imgData,x,y)向指定范围内绘制像素信息clip()裁剪:我么可以使用给定的方法,完成图片的一些滤镜效果。arr[i]=arr[i+1]=arr[i+2]=(arr[i]+arr[i+1]+arr[i+2])/3;createPattern(img,repeatType)创建平铺对象repeatType:平铺类型repeat-xrepeat-yrepeatno-repeat 查看详情

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

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

canvas前端压缩图片

参考网上的用法,下面是利用canvas进行的图片压缩<!DOCTYPEhtml><html><head><metacharset="utf-8"><metacontent="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"name="viewport 查看详情

js压缩上传图片base64长度

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

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

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

前端图片压缩优化工具conversion

...taURL之间的转换方法。另外,image-conversion可以指定大小来压缩图片。1、将图像压缩到200kb:2、以0.9的质量压缩图像image-conversion提供了多种方法来实现Image、Canvas、File和dataURL之间的转换,如下:1、imagetoCanvas(image[,config])Promise(Canv... 查看详情

HTML5 Canvas 调整图片大小 点击放大

...415:00:23【问题描述】:我在画布中有一张地图图像,我想使用HTML5和jQuery像谷歌地图界面一样使用它。我想执行以下操作:•Doubleclickonpaninwithoutchangingthesizeofthecontainingdiv•Clickonabuildin 查看详情

前端通过canvas实现图片压缩

...占用带宽,影响用户体验,所以要求对用户上传图片进行压缩后再上传;那么前端怎么实现这个功能呢?亲测可将4M图片压缩至100kb左右,代码如下:<inputid="file"type="file"><scripttype="text/javascript">vareleFile=docum 查看详情

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

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

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

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

pythonreportlab库之canvas

...Pythonreportlab库之helloworld》中我们演示了简单Demo,在Demo中使用Canvas对象。本篇文章将简单介绍一下Canvas对象,首先我先来看看Canvas的构造函数filename参数控制最终PDF文件的名称pagesize参数有width和height两个参数,canvas默认的大小是... 查看详情

使用canvas进行图像编辑

前面的话  本文将分为几个小功能的形式来详细介绍canvas图像编辑 缩放  下面是一张分析图,假设默认情况下,图片和canvas宽高相同。图片的缩放(scale)范围为0.5到3,缩放时改变的是图片的大小和图片的坐标位置W(宽)=can... 查看详情