1. 程式人生 > >jquery圖片裁剪外掛cropper

jquery圖片裁剪外掛cropper

在專案中,需要多上傳的圖片按照比例和尺寸進行裁剪,這類場景在一些CMS系統中是比較常見的,尤其是大部分的文章現在要適配PC、Mobile兩種平臺,文章的封面圖等便需要按照尺寸做裁剪,以便於應用到不同的場景和平臺上。

專案是放在github上

在頁面中引入cropper.css和copper.js

 <div class="cut-container" style="width: 750px;height: 400px;margin:20px 30px;border:dashed #cacaca 1px;">
 </div>

 <script>
    $img.cropper({
        aspectRatio:picScale.width/picScale.height,
        autoCrop:false
, //minCropBoxWidth:216, //minCropBoxHeight:144, zoomable:false, scalable:false, rotatable:false, //autoCropArea:0.01, ready:function(){ $img.cropper('crop'); $img.cropper('setData',{ width:picScale.bWidth, height:picScale.bHeight }); } }); $img.on('cropmove'
,function(e){ var data=$img.cropper('getData'); if(data.width<picScale.width||data.height<picScale.height){ e.preventDefault(); } }); $img.on('cropend',function(e){ var data=$img.cropper('getData'); if(data.width<picScale.width||data.height<picScale.height){ $img.cropper('setData'
,{ width:picScale.width, height:picScale.height}); } });
</script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

這裡有幾個引數需要注意下: 
aspectRatio:設定擷取的結果圖片是寬高比例,例如16:9、3:4或者1:1等 
minCropBoxWidth和minCropBoxHeight:擷取框的最小寬度和最小高度,說擷取框是因為這個是相對於頁面的,也就是真是的頁面畫素,而不是相對於圖片的 
zoomable、scalable、rotatable:這幾個都是圖片控制的屬性,從字面也比較好理解 
autoCropArea:這裡是一個比例值,設定預設情況下,擷取的內容相對於圖片的面積,0.8代表整個圖片的80%都處於擷取框內。

因為autoCropArea的原因,當你上傳不同尺寸的圖片時,也為介面顯示大小不一樣,擷取框的也大小不一。如果你需要一個視覺上固定大小的擷取框,這種情況下,是做不到的。

另外,minCropBoxWidth和minCropBoxHeight也是相對於頁面的畫素,所以你無法設定預設要擷取最小畫素,例如我們像需要擷取個400x400素的圖片,如果我們上傳的是高畫素的大圖,因為頁面級400畫素,涵蓋的圖片實際上的畫素,可能會遠大於400畫素。

針對於這種情況,我通過ready事件和cropmove、cropend事件進行了處理,程式碼中被註釋的是最初無效的方式,將autoCrop設定為false,通過程式碼的方式進行擷取框的設定,通過$img.cropper(‘setData’,params)便可以直接設定擷取框的寬高,令人驚喜的是這裡的寬高是相對於圖片的畫素控制,設定的畫素值就是最終擷取後圖片的畫素。

這種情況很便利,但是為了實現最小尺寸或者最大尺寸限制,便需要註冊兩個額外的事件,在cropmove通過$img.cropper(‘getData’)獲取width和height資訊,判斷相關限制,如果超過,則通過preventDefault()取消事件響應,但是這種情況不太精準,無法準備模擬到臨界狀態,有可能一次move事件,就超過臨界值的,這種情況下,也因為這個判斷,無法恢復到臨界狀態以內,所以在通過cropend事件,對於超出臨界狀態的情況,強制設定到臨界狀態。

以上是截圖處理部分,另外在後期上傳的時候,可以通過form表單的方式進行(另外一種是通過將圖片轉化為Base64編碼),這裡通過$img.cropper(“getCroppedCanvas”)獲取到canvas並呼叫其toBlob方法將資料轉化為二進位制用來構造FormData。

<script>
$img.cropper("getCroppedCanvas").toBlob(function(blob){
    var formData=new FormData();
    formData.append('files',blob,file.name);

    $.ajax({
        method:"post",
        url: urlConfig.upload, //用於檔案上傳的伺服器端請求地址
        data: formData,
        processData: false,
        contentType: false,
        success:function(result){
            //do something
        }
    });
});
</script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17