91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

微信小程序中如何實現canvas裁剪圖片功能

發布時間:2021-05-20 11:27:07 來源:億速云 閱讀:889 作者:小新 欄目:web開發

這篇文章給大家分享的是有關微信小程序中如何實現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裁剪圖片功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

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

AI

巴彦淖尔市| 寿光市| 杂多县| 武汉市| 彭州市| 凌云县| 紫金县| 东丰县| 西吉县| 武汉市| 开化县| 彭水| 广汉市| 介休市| 南部县| 内丘县| 田林县| 民乐县| 霸州市| 泰顺县| 民权县| 肥城市| 汝城县| 南川市| 修文县| 凌云县| 从江县| 古丈县| 绥芬河市| 中方县| 东港市| 孟村| 洛川县| 龙里县| 霍邱县| 朝阳区| 田阳县| 睢宁县| 申扎县| 江阴市| 汉阴县|