国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue 實現剪裁圖片并上傳服務器功能

2019-11-19 14:15:54
字體:
來源:轉載
供稿:網友

預覽鏈接點擊預覽

效果圖如下所示,大家感覺不錯,請參考實現代碼。

 

需求

  • [x] 預覽:根據選擇圖像大小自適應填充左側裁剪區域
  • [x] 裁剪:移動裁剪框右側預覽區域可實時預覽
  • [x] 上傳&清空:點擊確認上傳裁剪圖片,點擊取消按鈕清空圖像
  • [ ] 裁剪框可調節大小

實現步驟

methods:funName() - 對應源碼中methods中的funName方法

data:dataName - 對應源碼中data中的dataName數據

1. 圖片選擇與讀取

  • 選擇圖片 :(methods:selectPic) 使用 input[type="file"] 彈出選擇圖片框,js 主動觸發點擊事件;
  • 讀取圖片 : (methods:readImage) 創建圖片對象,使用createObjectURL顯示圖片。 objectURL = URL.createObjectURL(blob) ;

2. 在canvas中展示圖片

需要掌握的 canvas 相關知識:

  1. 清空畫布 ctx.clearRect(x,y,width,height) ;
  2. 填充矩形 ctx.fillRect(x,y,width,height) ;
  3. 繪制圓弧 ctx.arc(x,y,r,startAngle,endAngle,counterclockwise) ; 繪制矩形 ctx.rect(x,y,width,height);
  4. 繪制圖像drawImage

 

# 語法 ctx.drawImage(image, dx, dy); ctx.drawImage(image, dx, dy, dWidth, dHeight); ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); # 參數 image    # 繪制的元素(可以為HTMLImageElement,HTMLVideoElement,或者 HTMLCanvasElement。) dx,dy    # 目標畫布(destination canvas)左上角的坐標 dWidth,dHeight  # 目標畫布(destination canvas)上繪制圖像寬高 sx,sy    # 源畫布(source canvase)左上角的坐標 sWidth,sHeight  # 源畫布(source canvase)選擇的圖像寬高

5.剪裁圖片 ctx.clip() ;

具體步驟:

  • 計算canvas寬高 :(methods:calcCropperSize) 根據圖片大小,計算canvas寬高(data:cropperCanvasSize),以致圖片能夠在裁剪區域自適應展示,并確定裁剪的左上角位置(data:cropperLocation)。
  • 繪制左側裁剪區域圖像 :(methods:renderCropperImg)

裁剪區域vue data示意圖:

 

  • 繪制右側預覽圖片 :(methods:renderPreviewImg)

3. 移動裁剪框

知識點: onmousedown、onmousemove、onmouseup

具體實現:

methods:drag()

記錄鼠標坐標,鼠標移動根據偏移量計算圓心位置。

canvas.onmousedown = e => {  let [lastX, lastY] = [e.offsetX, e.offsetY];  self.movement = true;  canvas.onmousemove = e => {   self.circleCenter = {   X:    self.cropperCanvasSize.width > 2 * self.slectRadius    ? self.circleCenter.X + (e.offsetX - lastX)    : self.cropperCanvasSize.width / 2,   Y:    self.cropperCanvasSize.height > 2 * self.slectRadius    ? self.circleCenter.Y + (e.offsetY - lastY)    : self.cropperCanvasSize.height / 2   };   self.renderCropperImg();   [lastX, lastY] = [e.offsetX, e.offsetY];  };  canvas.onmouseup = e => {   self.movement = false;   canvas.onmousemove = null;   canvas.onmouseup = null;  };  };

4. 上傳圖片至服務器

知識點:

具體實現:

methods:upload()this.$refs.preview.toBlob((blob)=> {  const url = URL.createObjectURL(blob);  const formData = new FormData();  formData.append(this.uploadProps.name, blob, `${Date.now()}.png`);  if(this.data){   Object.keys(this.uploadProps.data).forEach(key => {    formData.append(key, this.uploadProps.data[key]);   });  }  const request = new XMLHttpRequest();  request.open("POST", this.uploadProps.action, true);  request.send(formData);  request.onreadystatechange = () => {   if (request.readyState === 4 && request.status === 200) {    // ...   }  };  });

總結

以上所述是小編給大家介紹的vue 實現剪裁圖片并上傳服務器功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 横山县| 商河县| 平和县| 临朐县| 罗甸县| 梁山县| 普定县| 绍兴市| 普格县| 哈尔滨市| 左贡县| 屏东市| 灵石县| 永年县| 泽州县| 珲春市| 沐川县| 东平县| 乐至县| 临江市| 鄯善县| 仁寿县| 贵德县| 沾化县| 卓尼县| 福清市| 大荔县| 沛县| 谷城县| 永平县| 大名县| 澎湖县| 柯坪县| 合作市| 长宁区| 法库县| 光泽县| 新泰市| 庆云县| 抚松县| 城口县|