vue图片裁剪上传,canvas裁剪图片上传

  vue图片裁剪上传,canvas裁剪图片上传

  本文主要介绍Vue使用canvas实现图像压缩和上传。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。

  本文分享Vue使用canvas压缩上传图片的具体代码,供大家参考。具体内容如下。

  场景:如用户头像等。

  对于上传大尺寸图片,前端压缩不仅节省了流量,也大大提升了用户体验。

  两方面:

  1.因为上传的图片尺寸比较小,上传速度会更快,交互更流畅,网络异常导致上传失败的风险也会大大降低。

  2.很多网站的图片上传功能都会限制图片的大小,尤其是图片上传。把图像限制在5M或者2M是很常见的(但是我是用单反拍的图像,图像超过2M是很正常的,所以上传之前要对图像进行处理)。如果能在前端进行压缩,理论上就没必要限制画面大小。

  示例:

  主要技术:canvas方法使用drawImage()。(附件:canvas.toDataURL()或canvas.toBlob())

  ctx.drawImage(image,dx,dy);

  ctx.drawImage(image,dx,dy,dWidth,d height);

  ctx.drawImage(image,sx,sy,sWidth,sHeight,dx,dy,dWidth,d height);

  示例:

  //html

  输入id=文件类型=文件

  //JS

  var eleFile=document . query selector( # file );

  //压缩图片所需的一些元素和对象

  var reader=new FileReader(),img=new Image();

  //选定的文件对象

  var file=null

  //缩放图片所需的画布

  var canvas=document . createelement( canvas );

  var context=canvas . get context( 2d );

  //加载base64地址的图像后

  img.onload=function () {

  //图片的原始大小

  var originWidth=this.width

  var originHeight=this.height

  //最大大小限制

  var maxWidth=400,maxHeight=400

  //目标大小

  var targetWidth=originWidth,targetHeight=originHeight

  //图片大小超过了400x400的限制

  if(origin width max width origin height max height){

  if(origin width/origin height maxWidth/max height){

  //更宽,根据宽度定义大小

  targetWidth=maxWidth

  target height=math . round(maxWidth *(origin height/origin width));

  }否则{

  targetHeight=maxHeight

  target width=math . round(max height *(origin width/origin height));

  }

  }

  //canvas缩放图片。

  canvas.width=targetWidth

  canvas.height=targetHeight

  //清除画布

  context.clearRect(0,0,targetWidth,target height);

  //图像压缩

  context.drawImage(img,0,0,targetWidth,target height);

  //画布转换为blob并上传

  canvas.toBlob(函数(blob) {

  //图片ajax上传

  var xhr=new XMLHttpRequest();

  //文件上传成功。

  xhr . onreadystatechange=function(){

  if (xhr.status==200) {

  //xhr.responseText是返回的数据。

  }

  };

  //开始上传

  xhr.open(POST , upload.php ,true);

  xhr . send(blob);

  },file . type image/png );

  };

  //文件是base64以便知道图片的原始大小。

  reader.onload=函数(e) {

  img . src=e . target . result;

  };

  elefile . addevent listener( change ,function (event) {

  file=event . target . files[0];

  //选择的文件是图片

  if(file . type . index of( image )==0){

  reader.readAsDataURL(文件);

  }

  });

  注意:

  移动端会有图像失真,需要根据设备的dpr放大画布,然后用css强制还原。

  //获取设备dpr

  getPixelRatio:函数(上下文){

  let backing store=context . backingstorepixelrratio

  context . webkitbackingstorepixelrratio

  context . mozbackingstorepixelrratio

  context . msbackingstorepixelrratio

  语境。obackingstorepixelrratio

  语境。backingstorepixelrratio 1;

  返回(窗口。devicepixelrratio 1)/后备存储;

  }

  //大概这样

  const CTX=这个。画布。获取上下文(“2d”);

  const DPR=这个。getpixelrratio(CTX);

  这个参考文献。postimg。交叉起源=匿名;

  var旧宽度=this。画布。宽度;

  var旧高度=this。画布。身高;

  这个。画布。风格。width=旧宽度 px ;

  这个。画布。风格。高度=旧高度 px ;

  这个。画布。宽度=旧宽度* DPR;

  这个。画布。身高=老身高* DPR;

  ctx.scale(朝鲜、DPR);

  //进行正常的操作

  ctx.drawImage(这个0.0250400美元);

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: