摘要:基于上面原因,我采用的是里面放置圖片,監(jiān)聽上面的手勢(shì),通過樣式控制圖片的旋轉(zhuǎn)縮放和移動(dòng),最后剪裁用隱藏的。
一個(gè)微信小程序圖片剪裁組件,可以通過手勢(shì)控制旋轉(zhuǎn)縮放移動(dòng),也可以點(diǎn)擊旋轉(zhuǎn)進(jìn)行90度旋轉(zhuǎn),先看下效果(視屏不知道為啥用不了,上個(gè)壓縮過度的GIF先):
圖片剪裁毫無疑問用的是canvas,但是開發(fā)過小程序的同學(xué)應(yīng)該了解小程序canvas的一些坑。比如小程序canvas的設(shè)定了畫布的大小后不能像web的canvas那樣通過css樣式來調(diào)整畫布在手機(jī)上顯示的大小、還有canvas不能設(shè)置太大因?yàn)榭赡軙?huì)在某些安卓機(jī)上導(dǎo)致小程序崩潰、canvas繪制過大的圖片會(huì)讓小程序變得非??D等等。
網(wǎng)上能找到的圖片剪裁框架大多采用在canvas上面直接繪制圖片,然后通過監(jiān)聽canvas上的用戶手勢(shì)來控制圖片移動(dòng)旋轉(zhuǎn)等,這樣截出來的圖片會(huì)出現(xiàn)模糊的問題,因?yàn)閏anvas的太小了。一種解決方法是,在頁面上再放置一個(gè)隱藏的canvas大小設(shè)為原來的兩倍或者再大一點(diǎn)也行用來作為實(shí)際剪裁圖片的canvas,當(dāng)然剪裁數(shù)據(jù)都是從第一個(gè)canvas那里來的。但是這樣還是有些小問題,就是canvas繪制大的圖片會(huì)出現(xiàn)卡頓的問題,這種方案在監(jiān)聽用戶手勢(shì)的變化的時(shí)候要不停的重新繪制canvas,卡頓變得更加嚴(yán)重,體驗(yàn)非常不好。
基于上面原因,我采用的是view里面放置圖片,監(jiān)聽view上面的手勢(shì),通過css樣式控制圖片的旋轉(zhuǎn)、縮放和移動(dòng),最后剪裁用隱藏的canvas。先看下頁面布局:
選擇圖片 旋轉(zhuǎn) 剪裁
最重要的操作是圖片在view中的位置變化如何在canvas中保持一致再剪裁出來,圖片相對(duì)與view中的左上角坐標(biāo)、圖片的長(zhǎng)度和寬度我們都是知道的,還有旋轉(zhuǎn)值通過用戶手勢(shì)變化計(jì)算出來,旋轉(zhuǎn)的時(shí)候?qū)嫴嫉闹行囊苿?dòng)到圖片的中心點(diǎn)再旋轉(zhuǎn)就行了。
let ctx = wx.createCanvasContext("imgcrop",this); let cropData = _this.data.stv; ctx.save(); // 縮放偏移值 let x = (_this.data.originImg.width - _this.data.originImg.width * cropData.scale) / 2; let y = (_this.data.originImg.height - _this.data.originImg.height * cropData.scale) / 2; //畫布中點(diǎn)坐標(biāo)轉(zhuǎn)移到圖片中心 let movex = (cropData.offsetX + x) * 2 + _this.data.originImg.width * cropData.scale; let movey = (cropData.offsetY + y) * 2 + _this.data.originImg.height * cropData.scale; ctx.translate(movex, movey); ctx.rotate(cropData.rotate * Math.PI / 180); ctx.translate(-movex, -movey); ctx.drawImage(_this.data.originImg.url, (cropData.offsetX + x) * 2, (cropData.offsetY + y) * 2, _this.data.originImg.width * 2 * cropData.scale, _this.data.originImg.height * 2 * cropData.scale); ctx.restore();
查看完整代碼請(qǐng)移步到:https://github.com/yuanwyj/Mi..., 喜歡的畫點(diǎn)個(gè)start~~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96412.html
摘要:表示不一定是原生形式的數(shù)據(jù)。接口基于,繼承了的功能并將其擴(kuò)展使其支持用戶系統(tǒng)上的文件。讀取操作完成的時(shí)候,會(huì)變成已完成,并觸發(fā)事件,同時(shí)屬性將包含一個(gè)格式的字符串編碼以表示所讀取文件的內(nèi)容。 溫馨提示:這里除了一些幼稚的小組件啥也沒有溫馨提示-續(xù):這是一個(gè)新的系列,寫一些實(shí)際開發(fā)中遇到的一些常用的功能,想法笨拙,代碼亂套 寫在前面 圖片上傳,作為web端一個(gè)常用的功能,在不同的項(xiàng)目中有...
摘要:它包含所有的圖片處理方法。由于,是基于和庫,所以使用方法會(huì)根據(jù)當(dāng)前情況,自動(dòng)選擇所需要的圖片處理庫。這里說明下,如果文字為中文,需要找一個(gè)支持中文的字體。默認(rèn)字體不支持中文,所以你寫中文,就是都是小方框。 Grafika是一個(gè)PHP圖像處理庫,是基于Imagick和GD,可以用于改變圖片大小,剪裁,比較,添加水印等等功能。還有感知哈希,高級(jí)圖像過濾,繪制貝塞爾曲線等功能,可謂非常強(qiáng)大。...
摘要:?jiǎn)⒂没蛲S梦粓D過濾。當(dāng)位圖收縮或拉伸以使其外觀平滑時(shí)使用過濾。在每個(gè)狀態(tài)變更期間,將從上到下遍歷狀態(tài)列表,并使用第一個(gè)與當(dāng)前狀態(tài)匹配的項(xiàng)目此選擇并非基于最佳匹配,而是選擇符合狀態(tài)最低條件的第一個(gè)項(xiàng)目。每個(gè)可繪制對(duì)象由單一元素內(nèi)的元素表示。 showImg(https://segmentfault.com/img/remote/1460000019975019?w=157&h=54); ...
Python語言的表達(dá)照片處理使人們常常所使用的層面,那樣我們應(yīng)該怎么實(shí)現(xiàn)圖片的裁切呢?接下來本文關(guān)鍵為大家介紹了關(guān)于用python圖片剪裁的資料,原文中根據(jù)案例編碼推薦的十分詳盡,必須的小伙伴可以借鑒一下 怎么使用python圖片剪裁 以上如圖所示,這也是1張包括了各種象棋棋子的照片。我們應(yīng)該將在其中每個(gè)棋盤都裁切出去,這時(shí)可以借助python的PIL庫成功?! ∫?、組裝PIL庫 假如...
摘要:被替換的內(nèi)容將被縮放,以在填充元素的內(nèi)容框時(shí)保持其寬高比。整個(gè)對(duì)象在填充盒子的同時(shí)保留其長(zhǎng)寬比,因此如果寬高比與框的寬高比不匹配,該對(duì)象將被添加黑邊。如果對(duì)象的寬高比與盒子的寬高比不匹配,該對(duì)象將被剪裁以適應(yīng)。圖片變形很多人祭奠出了妖魔鬼怪般的各種大法,比如使用jq來寫,或者使用css表達(dá)式來寫。今天我總結(jié)的是使用css3來寫,唯一最大缺點(diǎn)就是對(duì)一些瀏覽器版本不夠兼容。下面就是關(guān)于如何使用c...
閱讀 3095·2021-11-22 13:54
閱讀 843·2021-11-04 16:08
閱讀 4553·2021-10-11 11:09
閱讀 3609·2021-09-22 16:05
閱讀 944·2019-08-30 15:54
閱讀 402·2019-08-30 15:44
閱讀 607·2019-08-30 14:05
閱讀 1026·2019-08-30 12:46