canvas實現的前端壓縮裁剪工具

最近項目中應用到canvas,見識到了canvas技術的強大,忽然想到以前用過的開源的裁減庫,大多數都是劃出一個裁剪框,將座標點和長寬傳到服務端,由後臺作裁剪,正好有空,作了個基於canvas的純前端裁剪壓縮工具,支持pc和移動端平臺。html

實現原理

  1. 使用原生的URL api 讀取本地選取的圖片文件(源文件);
  2. 使用canvas的繪圖功能(drawImage)將源圖片繪製到畫板上,兩種繪製策略:'CONTAIN'模式等比壓縮居中顯示;'COVER'模式選取長寬比相對外部container較小的一端適配。相似於background-size屬性的cover和contain;
  3. 使用鼠標事件使背景畫板可移動;
  4. 根據裁剪框大小配置在畫板中心繪製裁剪框,使其可resize;
  5. 當畫板移動或resize裁剪框時,動態繪製對應的裁剪區域;
  6. 根據質量參數,對裁剪區域使用toDataURL方法壓縮裁剪,拿到裁剪圖的base64格式,對base64進行blob化處理,最終可輸出base6四、blob和arrayBuffer格式的裁剪結果。

使用說明

對外暴露clip方法,返回一個裁剪對象。前端

const c = clip({
      container, //源文件的外包包裹框--dom
      sourceFile, //源文件--file
      outPutOpt //輸出圖片的類型和壓縮質量參數--object
      showType //畫板顯示模式--COVER CONTAIN(默認)
    })
// c.clip64:base64結果
// c.clipBlob:blob結果
// c.clipArrayBuffer:arrayBuffer結果
複製代碼

github地址git

pc demo地址es6

mobile demo地址github

結語

由於時間關係,採用es6編碼,沒有作不少的兼容性考慮,可能存在一些體驗問題。canvas

後期有空了再改進,歡迎指正。api

相關文章
相關標籤/搜索