123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674 |
- // components/yeyouzi-cropper/yeyouzi-cropper.js
- let success;
- let fail;
- Component({
- /**
- * 组件的属性列表
- */
- properties: {
- },
- /**
- * 组件的初始数据
- */
- data: {
- canvas: '',
- ctx: '',
- dpr: '',
- x1: 0,
- y1: 0,
- x2: 0,
- y2: 0,
- k1: 0,
- m1: 0,
- k2: 0,
- m2: 0,
- cutMove: false,
- endCut: {
- x: 0,
- y: 0
- },
- movePoint: '0',
- img: {
- path: '',
- width: 0,
- height: 0,
- type: 1 // 1:横向 2:纵向
- },
- imageWidth: 0,
- imageHeight: 0,
- imageLeft: 0,
- imageTop: 0,
- imgRotate: 0,
- imgMirror: 0,
- originWidthShow: 0.5,
- originHeightShow: 0.5,
- imgMove: false,
- imgStart: {
- x: 0,
- y: 0,
- left: 0,
- top: 0,
- distance: 0,
- width: 0,
- height: 0,
- cutImg: ''
- },
- imgScale: false,
- cutImg: {
- path: '',
- x: 0,
- y: 0,
- width: 0,
- height: 0
- }
- },
- /**
- * 组件的方法列表
- */
- methods: {
- /**
- * 公有方法
- */
- //初始化
- init(param){
- success = param.success
- fail = param.fail
- var that = this;
- this.setData({
- img: {
- path: param.imgPath
- }
- })
- const query = wx.createSelectorQuery().in(this)
- query.select('#cutCanvas')
- .fields({node: true, size: true})
- .exec((res) => {
- const canvas = res[0].node
- const ctx = canvas.getContext('2d')
- const dpr = wx.getSystemInfoSync().pixelRatio
- canvas.width = res[0].width * dpr
- canvas.height = res[0].height * dpr
- ctx.scale(dpr,dpr)
- var x1 = canvas.width * 0.15 / dpr;
- var y1 = (canvas.height - canvas.width * 0.7) / 2 / dpr;
- var x2 = x1 + canvas.width * 0.7 / dpr;
- var y2 = y1 + canvas.width * 0.7 / dpr;
- var k1 = (y2 -y1) / (x2 - x1);
- var m1 = (x2 * y1 - x1 * y2) / (x2 - x1)
- var k2 = (y1 - y2) / (x2 -x1);
- var m2 = (x2 * y2 - x1 * y1) / (x2 - x1);
- that.setData({
- canvas: canvas,
- ctx: ctx,
- dpr: dpr,
- x1: x1,
- y1: y1,
- x2: x2,
- y2: y2,
- k1: k1,
- m1: m1,
- k2: k2,
- m2: m2
- })
- this._drawCut(x1, y1, x2, y2)
- wx.getImageInfo({
- src: param.imgPath,
- success(img){
- var width = '';
- var height = '';
- var type = 0;
- var x = '';var y = '';var d = '';
- if(img.width > img.height){
- height = that.data.y2 - that.data.y1;
- width = (img.width * height) / img.height
- type = 1
- d = img.height
- x = (img.width - d) / 2
- y = 0
- }else{
- width = that.data.x2 - that.data.x1;
- height = (img.height * width) / img.width
- type = 2
- d = img.width
- x = 0
- y = (img.height - d) / 2
- }
- that.setData({
- img: {
- path: param.imgPath,
- width: img.width,
- height: img.height,
- type: type
- },
- cutImg: {
- x: x,
- y: y,
- width: d,
- height: d
- },
- imageWidth: ((x2 - x1) / d) * img.width,
- imageHeight: ((y2 - y1) / d) * img.height,
- imageLeft: x1 - ((x2 - x1) / d) * x,
- imageTop: y1 - ((y2 - y1) / d) * y,
- imgRotate: 0
- })
- }
- })
- })
-
- },
- /**
- * 私有方法
- */
- _drawCut(x1, y1, x2, y2){
- var ctx = this.data.ctx;
- var canvas = this.data.canvas;
- ctx.clearRect(0, 0, canvas.width, canvas.height)
- ctx.globalAlpha = '0.5'
- ctx.fillStyle = '#000000'
- ctx.fillRect(0, 0, canvas.width, canvas.height)
- ctx.strokeStyle = '#ffffff'
- ctx.lineWidth = '3'
- ctx.lineCap = 'square'
- ctx.globalAlpha = '1'
- ctx.strokeRect(x1, y1, x2 - x1, y2 - y1)
- ctx.fillStyle = '#ffffff'
- ctx.fillRect(x1 - 5, y1 - 5, 20, 20)//左上角 1
- ctx.fillRect(x2 - 15, y1 - 5, 20, 20)//右上角 2
- ctx.fillRect(x1 - 5, y2 - 15, 20, 20)//左下角 3
- ctx.fillRect(x2 - 15, y2 - 15, 20 , 20)//右下角 4
- ctx.clearRect(x1, y1, x2 - x1, y2 -y1)
- },
- _touchStart(e){
- //裁剪框是否移动
- var flag = false;
- var point = '0'
- if(e.touches[0].x >= this.data.x1 - 10 && this.data.x1 + 10 >= e.touches[0].x){
- if(e.touches[0].y >= this.data.y1 - 10 && this.data.y1 + 10 >= e.touches[0].y){
- flag = true; point = '1';
- this.setData({
- endCut:{
- x: this.data.x1,
- y: this.data.y1
- }
- })
- }else if(e.touches[0].y >= this.data.y2 - 10 && this.data.y2 + 10 >= e.touches[0].y){
- flag = true; point = '3';
- this.setData({
- endCut:{
- x: this.data.x1,
- y: this.data.y2
- }
- })
- }
- }else if(e.touches[0].x >= this.data.x2 - 10 && this.data.x2 + 10 >= e.touches[0].x){
- if(e.touches[0].y >= this.data.y1 - 10 && this.data.y1 + 10 >= e.touches[0].y){
- flag = true; point = '2'
- this.setData({
- endCut:{
- x: this.data.x2,
- y: this.data.y1
- }
- })
- }else if(e.touches[0].y >= this.data.y2 - 10 && this.data.y2 + 10 >= e.touches[0].y){
- flag = true; point = '4'
- this.setData({
- endCut:{
- x: this.data.x2,
- y: this.data.y2
- }
- })
- }
- }
- this.setData({
- cutMove: flag,
- movePoint: point
- })
- //图片是否移动
- if(e.touches[0].x >= this.data.x1 + 10 && this.data.x2 - 10 >= e.touches[0].x){
- if(e.touches[0].y >= this.data.y1 + 10 && this.data.y2 - 10 >= e.touches[0].y){
- if(e.touches.length == 1){
- this.setData({
- imgMove: true,
- imgStart: {
- x: e.touches[0].x,
- y: e.touches[0].y,
- left: this.data.imageLeft,
- top: this.data.imageTop
- },
- imgScale: false
- })
- }else if(e.touches.length == 2){
- this.setData({
- imgMove: false,
- imgStart: {
- distance: Math.sqrt(Math.pow(e.touches[1].x - e.touches[0].x, 2) + Math.pow(e.touches[1].y - e.touches[0].y, 2)),
- width: this.data.imageWidth,
- height: this.data.imageHeight,
- cutImg: this.data.cutImg
- },
- imgScale: true
- })
- }
- }
- }
- },
- _touchMove(e){
- if(this.data.cutMove){
- var x1;var y1;var x2;var y2;
- if(this.data.movePoint == '1'){
- x1 = e.touches[0].x
- y1 = this.data.k1 * x1 + this.data.m1
- x2 = this.data.x2
- y2 = this.data.y2
- if(x1 > x2 -100){
- x1 = x2 - 100
- y1 = this.data.k1 * x1 + this.data.m1
- }else if(x1 < this.data.x1){
- x1 = this.data.x1
- y1 = this.data.k1 * x1 + this.data.m1
- }
- this.setData({
- endCut:{
- x: x1,
- y: y1
- }
- })
- }else if(this.data.movePoint == '2'){
- x2 = e.touches[0].x
- y1 = this.data.k2 * x2 + this.data.m2
- x1 = this.data.x1
- y2 = this.data.y2
- if(x2 > this.data.x2){
- x2 = this.data.x2
- y1 = this.data.y1
- }else if(x2 < this.data.x1 + 100){
- x2 = this.data.x1 + 100
- y1 = this.data.k2 * x2 + this.data.m2
- }
- this.setData({
- endCut:{
- x: x2,
- y: y1
- }
- })
- }else if(this.data.movePoint == '3'){
- x1 = e.touches[0].x
- y2 = this.data.k2 * x1 + this.data.m2
- x2 = this.data.x2
- y1 = this.data.y1
- if(x1 > x2 - 100){
- x1 = x2 - 100
- y2 = this.data.k2 * x1 + this.data.m2
- }else if(x1 < this.data.x1){
- x1 = this.data.x1
- y2 = this.data.y2
- }
- this.setData({
- endCut:{
- x: x1,
- y: y2
- }
- })
- }else if(this.data.movePoint == '4'){
- x2 = e.touches[0].x
- y2 = this.data.k1 * x2 + this.data.m1
- x1 = this.data.x1
- y1 = this.data.y1
- if(x2 > this.data.x2){
- x2 = this.data.x2
- y2 = this.data.k1 * x2 + this.data.m1
- }else if(x2 < x1 + 100){
- x2 = x1 + 100
- y2 = this.data.k1 * x2 + this.data.m1
- }
- this.setData({
- endCut:{
- x: x2,
- y: y2
- }
- })
- }
- this._drawCut(x1, y1, x2, y2)
- }else if(this.data.imgMove){
- var dx = this.data.imgStart.x - e.touches[0].x
- var dy = this.data.imgStart.y - e.touches[0].y
- var rotate = this.data.imgRotate
- var left = this.data.imgStart.left - dx
- var top = this.data.imgStart.top - dy
- if(this.data.imgMirror == 180){
- dx = -dx
- rotate = -rotate
- }
- var tx = dx * Math.cos(rotate * Math.PI / 180) + dy * Math.sin(rotate * Math.PI / 180)
- var ty = dy * Math.cos(rotate * Math.PI / 180) - dx * Math.sin(rotate * Math.PI / 180)
- var x = (tx + this.data.originWidthShow * this.data.imageWidth) / this.data.imageWidth * this.data.img.width - this.data.cutImg.width / 2
- var y = (ty + this.data.originHeightShow * this.data.imageHeight) / this.data.imageHeight * this.data.img.height - this.data.cutImg.height / 2
- this.setData({
- cutImg: {
- width: this.data.cutImg.width,
- height: this.data.cutImg.height,
- x: x,
- y: y
- },
- imageLeft: left,
- imageTop: top,
- })
- }else if(this.data.imgScale){
- var nowDistance = Math.sqrt(Math.pow(e.touches[1].x - e.touches[0].x, 2) + Math.pow(e.touches[1].y - e.touches[0].y, 2))
- var m = nowDistance / this.data.imgStart.distance
- var width = this.data.imgStart.width * m
- var height = this.data.imgStart.height * m
- if(this.data.img.type == 1){
- height = height < this.data.y2 - this.data.y1 ? this.data.y2 - this.data.y1 : height
- height = height > (this.data.y2 - this.data.y1)*10 ? (this.data.y2 - this.data.y1)*10 : height
- width = (height * this.data.img.width) / this.data.img.height
- }else{
- width = width < this.data.x2 - this.data.x1 ? this.data.x2 - this.data.x1 : width
- width = width > (this.data.x2 - this.data.x1)*10 ? (this.data.x2 - this.data.x1)*10 : width
- height = (width * this.data.img.height) / this.data.img.width
- }
- var n = width / this.data.imgStart.width
- var cut = {
- x: this.data.imgStart.cutImg.x + ((n - 1) / (2 * n)) * this.data.imgStart.cutImg.width,
- y: this.data.imgStart.cutImg.y + ((n - 1) / (2 * n)) * this.data.imgStart.cutImg.height,
- width: this.data.imgStart.cutImg.width / n,
- height: this.data.imgStart.cutImg.height / n
- }
- var left = this.data.x1 - ((this.data.x2 - this.data.x1) / cut.width) * cut.x
- left = left > this.data.x1 ? this.data.x1 : left
- left = left < this.data.x2 - this.data.imageWidth ? this.data.x2 - this.data.imageWidth :left
- var top = this.data.y1 - ((this.data.y2 - this.data.y1) / cut.height) * cut.y
- top = top > this.data.y1 ? this.data.y1 : top
- top = top < this.data.y2 - this.data.imageHeight ? this.data.y2 - this.data.imageHeight : top
- this.setData({
- imageLeft: left,
- imageTop: top,
- imageWidth: width,
- imageHeight: height,
- cutImg: {
- x: cut.x,
- y: cut.y,
- width: cut.width,
- height: cut.height
- },
- })
- }
- },
- _touchEnd(e){
- if(this.data.cutMove){
- var dx;var dy;var d;
- var movePoint = this.data.movePoint
- if(movePoint % 2 == 0){
- d = ((this.data.endCut.x - this.data.x1) * this.data.cutImg.width) / (this.data.x2 - this.data.x1)
- if(this.data.imgMirror == 180){
- dx = -(this.data.endCut.x - this.data.x2) / this.data.imageWidth * this.data.img.width /2
- if(movePoint == '2'){
- dy = (this.data.endCut.y - this.data.y1) / this.data.imageHeight * this.data.img.height /2
- }else{
- dy = (this.data.endCut.y - this.data.y2) / this.data.imageHeight * this.data.img.height /2
- }
- }else{
- dx = (this.data.endCut.x - this.data.x2) / this.data.imageWidth * this.data.img.width /2
- if(movePoint == '2'){
- dy = (this.data.endCut.y - this.data.y1) / this.data.imageHeight * this.data.img.height /2
- }else{
- dy = (this.data.endCut.y - this.data.y2) / this.data.imageHeight * this.data.img.height /2
- }
- }
- }else{
- d = ((this.data.x2 - this.data.endCut.x) * this.data.cutImg.width) / (this.data.x2 - this.data.x1)
- if(this.data.imgMirror == 180){
- dx = -(this.data.endCut.x - this.data.x1) / this.data.imageWidth * this.data.img.width /2
- if(movePoint == '1'){
- dy = (this.data.endCut.y - this.data.y1) / this.data.imageHeight * this.data.img.height /2
- }else{
- dy = (this.data.endCut.y - this.data.y2) / this.data.imageHeight * this.data.img.height /2
- }
- }else{
- dx = (this.data.endCut.x - this.data.x1) / this.data.imageWidth * this.data.img.width /2
- if(movePoint == '1'){
- dy = (this.data.endCut.y - this.data.y1) / this.data.imageHeight * this.data.img.height /2
- }else{
- dy = (this.data.endCut.y - this.data.y2) / this.data.imageHeight * this.data.img.height /2
- }
- }
- }
- var rotate = this.data.imgMirror == 180 ? -this.data.imgRotate : this.data.imgRotate
- var x = ((dx * Math.cos(rotate * Math.PI / 180) + dy * Math.sin(rotate * Math.PI / 180)) + this.data.originWidthShow * this.data.img.width) - d / 2
- var y = ((dy * Math.cos(rotate * Math.PI / 180) - dx * Math.sin(rotate * Math.PI / 180)) + this.data.originHeightShow * this.data.img.height) - d / 2
- this.setData({
- cutImg:{
- x: x,
- y: y,
- width: d,
- height: d
- },
- imageWidth: ((this.data.x2 - this.data.x1) / d) * this.data.img.width,
- imageHeight: ((this.data.y2 - this.data.y1) / d) * this.data.img.height,
- imageLeft: this.data.x1 - ((this.data.x2 - this.data.x1) / d) * x,
- imageTop: this.data.y1 - ((this.data.y2 - this.data.y1) / d) * y,
-
- })
- this._drawCut(this.data.x1,this.data.y1,this.data.x2,this.data.y2)
- }
- if(this.data.imgMove){
- var left = this.data.x1 - ((this.data.x2 - this.data.x1) / this.data.cutImg.width) * this.data.cutImg.x
- var top = this.data.y1 - ((this.data.y2 - this.data.y1) / this.data.cutImg.height) * this.data.cutImg.y
- this.setData({
- imageLeft: left,
- imageTop: top,
- })
- }
- this.setData({
- originWidthShow: (this.data.cutImg.x + this.data.cutImg.width / 2) / this.data.img.width,
- originHeightShow: (this.data.cutImg.y + this.data.cutImg.height / 2) / this.data.img.height,
- cutMove: false,
- movePoint: '0',
- imgMove: false,
- imgScale: false
- })
- },
- _rotateChange(e){
- this.setData({
- imgRotate: e.detail.value
- })
- },
- _rotateNinety(){
- var r = this.data.imgRotate + 90 > 180 ? this.data.imgRotate - 270 : this.data.imgRotate + 90
- this.setData({
- imgRotate: r
- })
- },
- _imageMirror(){
- var m = this.data.imgMirror == 180 ? 0 : 180
- this.setData({
- imgMirror: m,
- })
- },
- _imgRestore(){
- this.setData({
- canvas: '',
- ctx: '',
- x1: 0,
- y1: 0,
- x2: 0,
- y2: 0,
- k1: 0,
- m1: 0,
- k2: 0,
- m2: 0,
- cutMove: false,
- endCut: {
- x: 0,
- y: 0
- },
- movePoint: '0',
- imageWidth: 0,
- imageHeight: 0,
- imageLeft: 0,
- imageTop: 0,
- imgRotate: 0,
- imgMirror: 0,
- originWidthShow: 0.5,
- originHeightShow: 0.5,
- imgMove: false,
- imgStart: {
- x: 0,
- y: 0,
- left: 0,
- top: 0,
- distance: 0,
- width: 0,
- height: 0,
- cutx: 0,
- cuty: 0
- },
- imgScale: false,
- cutImg: {
- path: '',
- x: 0,
- y: 0,
- width: 0,
- height: 0
- }
- })
- this.init(this.data.img.path)
- },
- _cancelCut(){
- this._restoreData()
- if(fail){
- fail('cancel')
- }
- },
- _confirmCut(){
- wx.showLoading({
- title: '裁剪中...',
- mask: true
- })
- var that = this
- const query = wx.createSelectorQuery().in(this)
- query.select('#imgCanvas')
- .fields({node: true, size: true})
- .exec((res) => {
- const canvas = res[0].node
- const ctx = canvas.getContext('2d')
- canvas.width = that.data.cutImg.width
- canvas.height = that.data.cutImg.height
- ctx.translate(canvas.width / 2, canvas.height / 2)
- ctx.rotate((that.data.imgRotate >= 0 ? that.data.imgRotate : that.data.imgRotate + 360) * Math.PI / 180)
- if(that.data.imgMirror == 180){
- ctx.scale(-1, 1); //左右镜像翻转
- }
- const img = canvas.createImage()
- img.src = that.data.img.path
- img.onload = () => {
- ctx.drawImage(img, 0, 0, that.data.img.width, that.data.img.height, -(that.data.cutImg.x+canvas.width/2), -(that.data.cutImg.y+canvas.height/2), that.data.img.width, that.data.img.height)
- wx.canvasToTempFilePath({
- canvas: canvas,
- success(img){
- success(img.tempFilePath)
- that._restoreData()
- wx.hideLoading({
- success: (res) => {},
- })
- },
- fail(){
- wx.hideLoading({
- success: (res) => {
- wx.showToast({
- title: '裁剪失败',
- icon: 'error'
- })
- if(fail){
- fail('fail')
- }
- },
- })
- }
- })
-
- }
- })
-
- },
-
- _restoreData(){
- this.setData({
- canvas: '',
- ctx: '',
- x1: 0,
- y1: 0,
- x2: 0,
- y2: 0,
- k1: 0,
- m1: 0,
- k2: 0,
- m2: 0,
- cutMove: false,
- endCut: {
- x: 0,
- y: 0
- },
- movePoint: '0',
- img: {
- path: '',
- width: 0,
- height: 0,
- type: 1 // 1:横向 2:纵向
- },
- imageWidth: 0,
- imageHeight: 0,
- imageLeft: 0,
- imageTop: 0,
- imgRotate: 0,
- imgMirror: 0,
- originWidthShow: 0.5,
- originHeightShow: 0.5,
- imgMove: false,
- imgStart: {
- x: 0,
- y: 0,
- left: 0,
- top: 0,
- distance: 0,
- width: 0,
- height: 0,
- cutx: 0,
- cuty: 0
- },
- imgScale: false,
- cutImg: {
- path: '',
- x: 0,
- y: 0,
- width: 0,
- height: 0
- }
- })
- },
- }
- })
|