| @ -0,0 +1,111 @@ | |||||
| <template> | |||||
| <view style="position: fixed; top: 100vh;"> | |||||
| <image :src="imageUrl" @load="crop" @error="afterLoadImg" /> | |||||
| <canvas class="canvas" canvas-id="canvas" style="width: 500px; height: 400px;"></canvas> | |||||
| </view> | |||||
| </template> | |||||
| <script> | |||||
| import utils from '@/utils/utils.js' | |||||
| export default { | |||||
| data() { | |||||
| return { | |||||
| imageUrl: null, | |||||
| } | |||||
| }, | |||||
| methods: { | |||||
| afterLoadImg() { | |||||
| uni.hideLoading() | |||||
| }, | |||||
| cutImgShare(imgUrl, w, h, that) { | |||||
| console.log('--imgUrl', imgUrl) | |||||
| return new Promise((resolve, reject) => { | |||||
| uni.getImageInfo({ | |||||
| src: imgUrl, | |||||
| success(res) { | |||||
| try { | |||||
| const context = uni.createCanvasContext('canvas', that); | |||||
| console.log('--context', context) | |||||
| let sWidth = w | |||||
| let sHeight = h | |||||
| let sx = 0 | |||||
| let sy = 0; | |||||
| let dWidth = 500 | |||||
| let dHeight = 400 | |||||
| console.log('--w', w, '--h', h) | |||||
| if (w <= h) { | |||||
| sHeight = Math.floor(sWidth / 5 * 4); | |||||
| sy = Math.floor((h - sHeight) / 2) | |||||
| } else { | |||||
| sWidth = Math.floor(sHeight / 4 * 5); | |||||
| sx = Math.floor((w - sWidth) / 2) | |||||
| } | |||||
| console.log('--sx', sx, '--sy', sy, '--sWidth', sWidth, '--sHeight', sHeight) | |||||
| context.drawImage(res.path, sx, sy, sWidth, sHeight, 0, 0, dWidth, dHeight); | |||||
| context.draw(true, setTimeout(() => { | |||||
| uni.canvasToTempFilePath({ | |||||
| canvasId: 'canvas', | |||||
| fileType: 'jpg', | |||||
| success: (res) => { | |||||
| console.log(res.tempFilePath) | |||||
| resolve(res.tempFilePath); | |||||
| }, | |||||
| fail(err) { | |||||
| console.log(err); | |||||
| reject(err) | |||||
| } | |||||
| }, that); | |||||
| }, 200)); | |||||
| } catch (err) { | |||||
| reject(err) | |||||
| } | |||||
| }, | |||||
| fail(err) { | |||||
| console.log('获取图片信息失败', err); | |||||
| reject(err) | |||||
| } | |||||
| }); | |||||
| }); | |||||
| }, | |||||
| set(imageUrl) { | |||||
| console.log('--set', imageUrl) | |||||
| this.imageUrl = imageUrl | |||||
| uni.showLoading({ | |||||
| title: '上传中...' | |||||
| }) | |||||
| }, | |||||
| async crop(e) { | |||||
| console.log('--crop', e) | |||||
| let that = this | |||||
| try { | |||||
| const { width, height } = e.target | |||||
| let fileUrl = await this.cutImgShare(this.imageUrl, width, height, that) | |||||
| this.$Oss.ossUpload(fileUrl).then(url => { | |||||
| console.log('--shareImg', url) | |||||
| this.$emit('change', url) | |||||
| }) | |||||
| } catch (err) { | |||||
| console.log('--err', err) | |||||
| this.$emit('change', this.imageUrl) | |||||
| } | |||||
| this.afterLoadImg() | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style> | |||||
| </style> | |||||