您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關微信小程序中如何實現canvas裁剪圖片功能的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
小程序miniso的一個發布內容截圖功能,話不多,先上代碼
wxml文件:
<view class="cut-1-1 t-c {{cutSelect == 1? 'cut-select':''}}" data-cut="1" bindtap="selectCutType">1:1</view> <view class="cut-3-4 t-c {{cutSelect == 2? 'cut-select':''}}" data-cut="2" bindtap="selectCutType">3:4</view>
<block wx:for="{{imgList}}" wx:key="{{index}}" > <swiper-item> <scroll-view scroll-top="{{topNum}}" scroll-y class="imgFile {{cutSelect == 1?'view-1-1':'view-3-4'}}" bindscroll="endTou"> <image src='{{item}}' mode="widthFix"></image> </scroll-view > </swiper-item> </block>
<canvas wx:for="{{imgList}}" wx:for-index="i" canvas-id="myCanvas_{{i}}" ></canvas>
這里是對多張圖片進行統一處理,用戶選了哪種截圖比例,所有圖片用統一規格裁剪。
因為簡單,不提供縮放和左右移動,所以只能裁剪豎長圖,不支持橫長圖裁剪。
topNum用于scroll-view的reset處理
wxss文件
.view-1-1 { width: 750rpx; height: 750rpx; overflow: hidden; } .view-3-4 { width: 750rpx; height: 750rpx; padding: 0 94rpx; box-sizing: border-box; overflow: hidden; } canvas { position: absolute; /* display: none; */ left: -999rpx; z-index: 0; }
裁剪比例的樣式,1:1裁剪使用750rpx,3:4使用padding進行視覺上的拉長
接下來就是重要的代碼部分了
js文件
cutPic() { const _this = this if (this.data.cutting) { return } let promiseList = [], ctx = [] _this.data.imgList.forEach((v, i) => { promiseList.push(_this.draw(ctx, v, i)) }) wx.showLoading({ title: '截取中...', icon: 'none' }) this.setData({ cutting: true }) Promise.all(promiseList).then((arr) => { wx.setStorageSync("interimImagesList", _this.data.imgFileList) _this.uploadPic() }, err => { }) },
使用微信自帶api,wx.chooseImage將圖片保存在imgList數組里,因為裁剪圖片用canvas處理會有一定的延遲,所以使用promise進行異步處理
//獲取豎向滑動坐標 endTou(e) { const _this = this let y = 'y[' + (_this.data.currentIndex - 1) + '].top' _this.setData({ [y]: e.detail.scrollTop }) },
定義的y數組用于記錄每張圖片截取的位置。
//繪制 draw(ctx, v, i) { const _this = this let width, height return new Promise((resolve, reject) => { ctx[i] = wx.createCanvasContext(`myCanvas_${i}`) wx.getImageInfo({ src: v, success: function (res) { width = 'width[' + i + ']' height = 'height[' + i + ']' var str = res.height / res.width;//圖片的寬高比 _this.setData({ [width]: 375, [height]: 375 * str }, () => { ctx[i].drawImage(v, 0, 0, _this.data.width[i], _this.data.height[i]) ctx[i].draw(false, () => { setTimeout(() => { wx.canvasToTempFilePath({//調用方法,開始截取 x: 0, y: _this.data.y[i] ? _this.data.cutSelect == 1 ? _this.data.y[i].top : _this.data.y[i].top / 0.75 : 0, width: 375, height: _this.data.cutSelect == 1 ? 375 : 500, destWidth: 375, destHeight: _this.data.cutSelect == 1 ? 375 : 500, canvasId: 'myCanvas_' + i, success: function (res) { resolve(res.tempFilePath) console.info('canvas', res.tempFilePath) let img = 'imgFileList[' + i + ']' _this.setData({ [img]: res.tempFilePath }) }, fail: function (err) { reject(err) console.info(err) } }) }, 1000) // 渲染時間 }) }) } }) }) },
渲染圖片最重要的一步是獲得寬高比,所以在canvas繪制之前使用getImageInfo獲取到圖片信息,var str=res.height/res.width獲得高寬比例。
canvas繪制圖片是需要時間,所以setTime了個1秒,不然截出來的圖是失敗的。這里也可以使用遞歸的方式來繪制
canvas 代碼就不給出了,可以自己搜一下。
感謝各位的閱讀!關于“微信小程序中如何實現canvas裁剪圖片功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。