亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-05-21 11:29:54 來源:億速云 閱讀:341 作者:小新 欄目:web開發

小編給大家分享一下vue如何實現剪裁圖片并上傳服務器功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

預覽鏈接點擊預覽

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

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

需求

  • [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

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

# 語法
 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示意圖:

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

  • 繪制右側預覽圖片 :(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. 上傳圖片至服務器

知識點:

  • FormData 對象的使用

  • canvas.toBlob() ;

  • Convert Data URI to File then append to FormData

具體實現:

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是什么

Vue是一套用于構建用戶界面的漸進式JavaScript框架,Vue與其它大型框架的區別是,使用Vue可以自底向上逐層應用,其核心庫只關注視圖層,方便與第三方庫和項目整合,且使用Vue可以采用單文件組件和Vue生態系統支持的庫開發復雜的單頁應用。

以上是“vue如何實現剪裁圖片并上傳服務器功能”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

融水| 宜川县| 宁安市| 叙永县| 安顺市| 勃利县| 深州市| 潞西市| 澄江县| 邢台市| 南昌县| 西畴县| 高雄县| 抚远县| 太湖县| 益阳市| 托克逊县| 赤城县| 凉城县| 方正县| 肥西县| 潜江市| 冷水江市| 万宁市| 琼海市| 柳江县| 梓潼县| 涟水县| 庆安县| 荥经县| 西平县| 桃园县| 靖远县| 宾阳县| 土默特左旗| 静安区| 乃东县| 伊春市| 永兴县| 德钦县| 淳化县|