【转】小程序图片裁剪组件
最近開始做微信小程序項目,其中有需要圖片裁剪的功能。
微信小程序擁有許多方便的API,相機相冊調用作為移動端使用頻率最高的API之一,小程序做了非常好的封裝,使用上也非常舒服。然而,翻遍了整篇小程序開發(fā)文檔,仍然沒能找到裁剪相關的描述。難道小程序官方?jīng)]考慮過為小程序提供一個裁剪API嗎。
裁剪API是沒找到,優(yōu)秀的開源的第三方裁剪組件還是能找到一些的,試用了幾個,跟自己預期的裁剪方法不太一樣,之前做過一段時間的原生開發(fā),Android系統(tǒng)自帶就有一個不錯的裁剪方法,我想能不能做一個防Android系統(tǒng)裁剪的小程序組件呢?
好在小程序提供了一個canvas畫布組件,提供了非常豐富的API,可以在畫布中繪制圖片,并將畫布中的圖形輸出,這個組件正合適用來做裁剪功能,事實上,其他一些第三方裁剪組件,也正是基于這個畫布組件來制作的。
自己動手豐衣足食,開始自己造輪子。
那么,來吧,放預覽圖。
使用說明
核心邏輯寫在組件中,在需要剪裁的頁面引入組件即可。同時禁用頁面彈動(ios端頁面默認有頁面彈動屬性,需要禁用)。
{
"usingComponents": {
"cropper":"/pages/cropper/cropper"
},
"disableScroll": true
}
頁面布局部分
<!--pages/cropper/cropper-sample.wxml--> <view class='body'> <!-- 裁剪組件 --> <cropper id='cropper' class='stage'></cropper> <!-- 取消 和 確認 按鈕,并綁定事件 --> <view class='bar'> <view class='btn btn-cancel' bindtap='fnCancel'>取消</view> <view class='btn btn-submit' bindtap='fnSubmit'>確定</view> </view> </view>
頁面樣式
page{
height: 100%;
box-sizing: border-box;
}
.body{
height: 100%;
display: flex;
flex-direction: column;
}
.stage{
flex-grow: 1;
}
.bar{
height: 80rpx;
padding: 36rpx;
display: flex;
flex-direction: row;
background-color: black;
}
.btn{
position: relative;
flex-grow: 1;
border: 2rpx solid grey;
line-height: 80rpx;
text-align: center;
color: white;
font-size: 32rpx;
}
.btn-cancel{
border-top-left-radius: 40rpx;
border-bottom-left-radius: 40rpx;
}
.btn-submit{
border-top-right-radius: 40rpx;
border-bottom-right-radius: 40rpx;
}
漂亮的布局有了,接著就可以再js里愉快的裁剪圖片了。
再頁面加載回調中,對組件進行初始化。
imagePath必填,其他參數(shù)都有默認值,都是可選的。
裁剪的寬高比是可以約束的,只需要設置aspectRatio屬性,就可以約束裁剪的寬高比。在裁剪用戶頭像時,需要裁剪正方形圖片時,aspectRatio屬性便會變的非常有用,此時,設置aspectRatio為1,就可以裁剪出正方形的圖片。
onLoad: function (options) {
cropper = this.selectComponent('#cropper');
cropper.fnInit({
imagePath:'/assets/test.jpg', //*必填
debug: true, //可選。是否啟用調試,默認值為false。true:打印過程日志;false:關閉過程日志
outputFileType: 'jpg', //可選。目標文件的類型。默認值為jpg,jpg:輸出jpg格式圖片;png:輸出png格式圖片
quality: 1, //可選。圖片的質量。默認值為1,即最高質量。目前僅對 jpg 有效。取值范圍為 (0, 1],不在范圍內時當作 1.0 處理。
aspectRatio: 1.25, //可選。裁剪的寬高比,默認null,即不限制剪裁寬高比。aspectRatio需大于0
minBoxWidthRatio: 0.2, //可選。最小剪裁尺寸與原圖尺寸的比率,默認0.15,即寬度最小剪裁到原圖的0.15寬。
minBoxHeightRatio: 0.2, //可選。同minBoxWidthRatio,當設置aspectRatio時,minBoxHeight值設置無效。minBoxHeight值由minBoxWidth 和 aspectRatio自動計算得到。
initialBoxWidthRatio: 0.6, //可選。剪裁框初始大小比率。默認值0.6,即剪裁框默認寬度為圖片寬度的0.6倍。
initialBoxHeightRatio: 0.6 //可選。同initialBoxWidthRatio,當設置aspectRatio時,initialBoxHeightRatio值設置無效。initialBoxHeightRatio值由initialBoxWidthRatio 和 aspectRatio自動計算得到。
});
}
canvas畫布裁剪邏輯已經(jīng)封裝好,只需要調用組件的fnCrop方法便可以完成裁剪。
fnSubmit:function(){
//do crop
cropper.fnCrop({
//剪裁成功的回調
success:function(res){
//生成文件的臨時路徑
console.log(res.tempFilePath);
wx.previewImage({
urls: [res.tempFilePath],
})
}
});
}
組件源碼 和 裁剪demo 放在github:
https://github.com/light-wind/wx-cropper
from:https://blog.csdn.net/u011054919/article/details/91136038
總結
以上是生活随笔為你收集整理的【转】小程序图片裁剪组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP(四)——性能优化
- 下一篇: kaggle使用笔记