亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

微信小程序之裁剪圖片成圓形的實現代碼

2020-03-21 16:09:45
字體:
來源:轉載
供稿:網友

前言

最近在開發小程序,產品經理提了一個需求,要求微信小程序換頭像,用戶剪裁圖片必須是圓形,也在github上看了一些例子,一般剪裁圖片用的都是方形,所以自己打算寫一個小組件,可以把圖片剪裁成圓形,主要思路就是使用canvas繪圖,把剪裁的圖片繪制成圓形,另外剪裁圖片的窗口還可以移動放大縮小,這個功能就用了微信組件movable-view,好了,該說的也說完了,下面咱們開始擼代碼。

movable-view組件

可移動的視圖容器,在頁面中可以拖拽滑動

會有好多個屬性,在這里不一一介紹,只說我們能用到的就可以。

我們用到的屬性主要有:

1.direction:movable-view的移動方向,屬性值有all、vertical、horizontal、none

2.scale:是否支持雙指縮放,默認縮放手勢生效區域是在movable-view內

3.scale-min 定義縮放倍數最小值

4.scale-max 定義縮放倍數最大值

5.bindchange 拖動過程中觸發的事件,event.detail = {x: x, y: y, source: source},其中source表示產生移動的原因,值可為touch(拖動)、touch-out-of-bounds(超出移動范圍)、out-of-bounds(超出移動范圍后的回彈)、friction(慣性)和空字符串(setData)

6.bindscale 縮放過程中觸發的事件,event.detail = {x: x, y: y, scale: scale},其中x和y字段在2.1.0之后開始支持返回

主要用到的就是這幾個值

另外使用movable-view的時候必須在外邊加一個movable-area的父元素,不然的話沒有移動區域。

movable-view 的可移動區域,屬性只有:

scale-area 當里面的movable-view設置為支持雙指縮放時,設置此值可將縮放手勢生效區域修改為整個movable-area,是個boolean值,默認false

截取區域的移動已經說完了,詳情請看傳送門

canvas繪圖

畫布。該組件是原生組件可以繪制圖像,分享朋友圈生成海報就經常用到這個屬性,就簡單的說下:

在wxml中必須要有canvas這個標簽,才可以繪制圖像,而且要有canvas-id屬性,代表canvas 組件的唯一標識符,
還有許多API我就不一一介紹了,底下用的API代碼當中都會用注釋。詳情請看微信小程序畫布API傳送門

代碼實現

1.首先是選擇圖片

wxml就是初始化一個按鈕點擊的時候選擇圖片,而且需要引入我們封裝的截取圖片組件,并把圖片作為參數傳進去,封裝組件方法請看我另一篇文章組件封裝

index.wxml

Tip: 必須把canvas放到引入剪裁組件的wxml中,否則繪制不成功,因為canvas是原生組件脫離在 WebView 渲染流程外。

<view class="container"> <button wx:if="{{!imgSrc}}" bindtap="getImgurl"> 選擇圖片 </button> <view class="clip-box" wx:if="{{imgSrc}}">  <ClipImg imgSrc="{{imgSrc}}"></ClipImg> </view></view><canvas canvas-id="myCanvas" style="position:absolute; width:100%;height:100%;border: 1px solid red;left: -9999px; top: -9999px;"></canvas>

index.json引入截取圖片的組件

{ "component": true, "usingComponents": {  "ClipImg": "../../component/clipImg/clipImg" }}

index.js上傳圖片顯示

const app = getApp()Page({ data: { imgSrc: '' }, //選擇圖片 getImgurl: function () { wx.chooseImage({  count: 1, // 默認9  sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認二者都有  sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機,默認二者都有  success: (res) => {  // 返回選定照片的本地文件路徑列表,tempFilePath可以作為img標簽的src屬性顯示圖片  const tempFilePaths = res.tempFilePaths;  //啟動上傳等待中...   wx.showToast({    title: '正在上傳...',    icon: 'loading',    mask: true,    duration: 1000   })   this.setData({   imgSrc: res.tempFilePaths  })  } }) }, onLoad: function () { }})

接下來就是剪裁圖片組件的封裝

首先是頁面布局,也就是clipImg.wxml

<view class="clip"> <image class="head-img" style="width:{{cropperW}}rpx;height:{{cropperH}}rpx" src="{{imageUrl}}"></image> <movable-area scale-area style="width:{{cropperW}}rpx;height:{{cropperH}}rpx">  <movable-view bindchange="move" bindscale="scale" direction="all" scale scale-min="0.5" scale-max="1.8">  </movable-view> </movable-area> <view class="btn">  <text bindtap="cancel">取消</text>  <text bindtap="getImageInfo">保存</text> </view></view>

大概就是這個樣子

微信小程序,微信小程序開發,裁剪圖片,圓形

上邊的圓就是截取就是截取框。

然后就是clipImg.js文件主要就是對圖片截取的一些操作

Component({ /** * 組件的屬性列表 */ properties: { imgSrc: {  type: 'String',  value: '' } }, /** * 組件的初始數據 * imageUrl string 初始化圖片 * cropperW string 縮小圖寬度 * cropperH string 縮小圖高度, * img_ratio string 圖片比例, * IMG_W string 原圖高度, * IMG_H string 原圖高度, * left string 圖片距離左邊距離, * top string 圖片距離上邊距離, * clipW number 默認截取框 */ data: { imageUrl: '', cropperW: '', cropperH: '', img_ratio: '', IMG_W: '', IMG_H: '', left: '', top: '', clipW: 200 }, /** * 組件的方法列表 */ methods: { //點擊取消 cancel: function () {  var myEventDetail = {} // detail對象,提供給事件監聽函數  var myEventOption = {} // 觸發事件的選項  this.triggerEvent('myevent', myEventDetail, myEventOption) }, //拖拽事件 move: function ({ detail }) {  this.setData({  left: detail.x * 2,  top: detail.y * 2  }) }, //縮放事件 scale: function ({ detail }) {  console.log(detail.scale)  this.setData({  clipW: 200 * detail.scale  }) }, //生成圖片 getImageInfo: function () {  wx.showLoading({  title: '圖片生成中...',  })  const img_ratio = this.data.img_ratio;  //要截取canvas的寬  const canvasW = (this.data.clipW / this.data.cropperW) * this.data.IMG_W  //要截取canvas的高  const canvasH = (this.data.clipW / this.data.cropperH) * this.data.IMG_H  //要截取canvas到左邊距離  const canvasL = (this.data.left / this.data.cropperW) * this.data.IMG_W  //要截取canvas到上邊距離  const canvasT = (this.data.top / this.data.cropperH) * this.data.IMG_H  // 將圖片寫入畫布  const ctx = wx.createCanvasContext('myCanvas');  //繪制圖像到畫布  ctx.save(); // 先保存狀態 已便于畫完圓再用    ctx.beginPath(); //開始繪制   ctx.clearRect(0, 0, 1000, 1000)  //先畫個圓    ctx.arc(this.data.clipW / 2, this.data.clipW / 2, this.data.clipW / 2, 0, 2 * Math.PI, false)  ctx.clip();//畫了圓 再剪切 原始畫布中剪切任意形狀和尺寸。一旦剪切了某個區域,則所有之后的繪圖都會被限制在被剪切的區域內   ctx.drawImage(this.data.imageUrl, canvasL, canvasT, canvasW, canvasH, 0, 0, this.data.clipW, this.data.clipW); // 推進去圖片    ctx.restore(); //恢復之前保存的繪圖上下文 恢復之前保存的繪圖上下午即狀態 可以繼續繪制  ctx.draw(true, () => {  // 獲取畫布要裁剪的位置和寬度   wx.canvasToTempFilePath({   x: 0,   y: 0,   width: this.data.clipW,   height: this.data.clipW,   destWidth: this.data.clipW,   destHeight: this.data.clipW,   quality: 0.5,   canvasId: 'myCanvas',   success: (res) => {   wx.hideLoading()   /**    * 截取成功后可以上傳的服務端直接調用    * wx.uploadFile();    */   //成功獲得地址的地方   wx.previewImage({    current: '', // 當前顯示圖片的http鏈接    urls: [res.tempFilePath] // 需要預覽的圖片http鏈接列表   })   }  })  }) } }, ready: function () { this.setData({  imageUrl: this.data.imgSrc[0] }) //獲取圖片寬高 wx.getImageInfo({  src: this.data.imageUrl,  success: (res) => {  console.log('圖片信息', res);  //圖片實際款高  const width = res.width;  const height = res.height;  //圖片寬高比例  const img_ratio = width / height  this.setData({   img_ratio,   IMG_W: width,   IMG_H: height,  })  if (img_ratio >= 1) {   //寬比較大,橫著顯示   this.setData({   cropperW: 750,   cropperH: 750 / img_ratio,   })  } else {   //豎著顯示   this.setData({   cropperW: 750 * img_ratio,   cropperH: 750   })  }  }  }) }})

到現在為止一個截取圖片就完成了,可能會有些問題,比如截取的圖片的框沒有居中,自己可以再次封裝這個組件,因為現在已經適合我們公司自己項目了。我們來預覽下。另外這個組件支持雙指放大截取框來截取圖片,不過微信開發者工具不能展示,自己可以把代碼下載下來,在自己手機上掃碼查看效果。

微信小程序,微信小程序開發,裁剪圖片,圓形

另外我把項目放到了github上邊,希望小哥哥小姐姐們多多點贊,多多支持,有什么疑問可以在github上問我,謝謝。點贊的小哥哥小姐姐最可愛,哈哈哈。。。

項目地址鏈接描述

推薦:

感興趣的朋友可以關注小編的微信公眾號【碼農那點事兒】,更多網頁制作特效源碼及學習干貨哦?。。?/p>

總結

以上所述是小編給大家介紹的微信小程序之裁剪圖片成圓形的實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产高清久久久久久| 91在线高清免费观看| 久久91亚洲精品中文字幕奶水| 亚洲欧美国产精品va在线观看| 亚洲欧美日韩另类| 国产伦精品一区二区三区精品视频| 成人疯狂猛交xxx| 欧美日韩国产在线播放| 国产精品网站入口| 欧美日韩国产成人| 茄子视频成人在线| 亚洲视频免费一区| 91免费高清视频| 日韩中文字幕在线播放| 国产精品丝袜久久久久久高清| 日韩一级裸体免费视频| 欧美最猛性xxxxx(亚洲精品)| 亚洲男人天堂九九视频| 在线成人免费网站| 欧美最猛性xxxxx免费| 久久精品夜夜夜夜夜久久| 午夜精品久久久久久99热| 亚洲电影免费在线观看| 91久久国产婷婷一区二区| 中文字幕精品一区二区精品| 欧美日韩国产精品一区| 色播久久人人爽人人爽人人片视av| 青青草99啪国产免费| 久久久久中文字幕2018| 国产剧情日韩欧美| 欧美极品美女视频网站在线观看免费| 国产成人一区二区在线| 日韩女优人人人人射在线视频| 久久av资源网站| 亚洲国产精品久久精品怡红院| 成人在线视频网| 中文字幕av一区中文字幕天堂| 精品国产一区二区三区久久| 亚洲精品成人免费| 日韩欧美亚洲国产一区| 国语自产精品视频在线看抢先版图片| 92国产精品久久久久首页| 91av在线看| 九九热这里只有精品免费看| 欧美另类极品videosbestfree| 欧美性猛交xxxx免费看久久久| 国产suv精品一区二区| 日韩亚洲在线观看| 日韩一区二区久久久| 国产欧美日韩最新| 欧美在线观看网站| 成人午夜两性视频| 亚洲精品久久久一区二区三区| 欧美肥老太性生活视频| 国产成人一区二区| 欧美日韩一区二区在线| 欧美最近摘花xxxx摘花| 国产日韩在线视频| 久久天天躁狠狠躁夜夜av| 中文字幕亚洲无线码在线一区| 亚洲的天堂在线中文字幕| 97国产一区二区精品久久呦| 欧美小视频在线观看| 成人疯狂猛交xxx| 日韩在线精品视频| 国产一区二区在线免费| 久久国产精品影片| 4438全国成人免费| 日韩成人av在线| 日韩av片永久免费网站| 97免费视频在线播放| 国产亚洲视频在线观看| 日韩www在线| 日韩国产中文字幕| 国产亚洲成av人片在线观看桃| yw.139尤物在线精品视频| 久久99热精品这里久久精品| 亚洲男人天堂九九视频| xx视频.9999.com| 丰满岳妇乱一区二区三区| 欧美在线xxx| 亚洲天堂av网| 国产精品视频内| 136fldh精品导航福利| 一区二区三区在线播放欧美| 日本伊人精品一区二区三区介绍| 日韩影视在线观看| 91成人天堂久久成人| 欧美午夜xxx| 亚洲成人精品在线| 国产成人精品a视频一区www| 伊人久久大香线蕉av一区二区| 国内精品久久久久伊人av| 国产视频精品自拍| 8x海外华人永久免费日韩内陆视频| 亚洲少妇中文在线| 欧洲s码亚洲m码精品一区| 91亚洲精品一区二区| 欧美亚洲另类制服自拍| 国产亚洲激情在线| 亚洲国产精品网站| 黑人巨大精品欧美一区免费视频| 97国产suv精品一区二区62| 欧美日韩免费在线| 久久精品在线播放| 日韩精品在线影院| 日本成人精品在线| 国产欧美va欧美va香蕉在| 欧美激情中文字幕乱码免费| 国产中文字幕日韩| 亚洲欧洲在线免费| 亚洲天堂网站在线观看视频| 久久五月天色综合| 91成品人片a无限观看| yellow中文字幕久久| 精品视频www| 亚洲一区二区三区成人在线视频精品| 欧美电影免费观看电视剧大全| 欧美二区乱c黑人| 国产精品va在线播放| 亚洲va欧美va国产综合久久| 青草成人免费视频| 欧美大片第1页| 欧洲永久精品大片ww免费漫画| 色天天综合狠狠色| 日韩在线视频免费观看| 欧美日韩国产va另类| 亚洲色图日韩av| 色中色综合影院手机版在线观看| 国内精品国产三级国产在线专| 黑人狂躁日本妞一区二区三区| 亚洲第一区在线| 国产一区二区三区18| 亚洲色图第一页| 国产一区二区在线免费| 欧美视频精品一区| 国产精品日韩精品| 亚洲日本欧美日韩高观看| 亚洲黄色在线观看| 欧美电影免费观看| 欧美大人香蕉在线| 国产成人一区二区三区电影| 亚洲精品欧美一区二区三区| 欧美精品久久久久久久久久| 久久亚洲电影天堂| 日韩av大片在线| 中文字幕欧美专区| 国产精品video| 中日韩午夜理伦电影免费| 国产欧亚日韩视频| 亚洲电影中文字幕| 久久免费在线观看| 97激碰免费视频| 国产精品久久久久久av福利| 国产精品96久久久久久| 精品久久久久人成| 精品无人区太爽高潮在线播放| 欧美成人中文字幕在线| 欧美午夜电影在线| 91av视频导航| 欧美在线观看www| 国产视频综合在线| www.亚洲一区| 亚洲精品xxx|