裂变星小程序-25.03.04
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.8 KiB

  1. <template>
  2. <view style="position: fixed; top: 100vh;">
  3. <image :src="imageUrl" @load="crop" @error="afterLoadImg" />
  4. <canvas class="canvas" canvas-id="canvas" style="width: 500px; height: 400px;"></canvas>
  5. </view>
  6. </template>
  7. <script>
  8. import utils from '@/utils/utils.js'
  9. export default {
  10. data() {
  11. return {
  12. imageUrl: null,
  13. }
  14. },
  15. methods: {
  16. afterLoadImg() {
  17. uni.hideLoading()
  18. },
  19. cutImgShare(imgUrl, w, h, that) {
  20. console.log('--imgUrl', imgUrl)
  21. return new Promise((resolve, reject) => {
  22. uni.getImageInfo({
  23. src: imgUrl,
  24. success(res) {
  25. try {
  26. const context = uni.createCanvasContext('canvas', that);
  27. console.log('--context', context)
  28. let sWidth = w
  29. let sHeight = h
  30. let sx = 0
  31. let sy = 0;
  32. let dWidth = 500
  33. let dHeight = 400
  34. console.log('--w', w, '--h', h)
  35. if (w <= h) {
  36. sHeight = Math.floor(sWidth / 5 * 4);
  37. sy = Math.floor((h - sHeight) / 2)
  38. } else {
  39. sWidth = Math.floor(sHeight / 4 * 5);
  40. sx = Math.floor((w - sWidth) / 2)
  41. }
  42. console.log('--sx', sx, '--sy', sy, '--sWidth', sWidth, '--sHeight', sHeight)
  43. context.drawImage(res.path, sx, sy, sWidth, sHeight, 0, 0, dWidth, dHeight);
  44. context.draw(true, setTimeout(() => {
  45. uni.canvasToTempFilePath({
  46. canvasId: 'canvas',
  47. fileType: 'jpg',
  48. success: (res) => {
  49. console.log(res.tempFilePath)
  50. resolve(res.tempFilePath);
  51. },
  52. fail(err) {
  53. console.log(err);
  54. reject(err)
  55. }
  56. }, that);
  57. }, 200));
  58. } catch (err) {
  59. reject(err)
  60. }
  61. },
  62. fail(err) {
  63. console.log('获取图片信息失败', err);
  64. reject(err)
  65. }
  66. });
  67. });
  68. },
  69. set(imageUrl) {
  70. console.log('--set', imageUrl)
  71. this.imageUrl = imageUrl
  72. uni.showLoading({
  73. title: '上传中...'
  74. })
  75. },
  76. async crop(e) {
  77. console.log('--crop', e)
  78. let that = this
  79. try {
  80. const { width, height } = e.target
  81. let fileUrl = await this.cutImgShare(this.imageUrl, width, height, that)
  82. this.$Oss.ossUpload(fileUrl).then(url => {
  83. console.log('--shareImg', url)
  84. this.$emit('change', url)
  85. })
  86. } catch (err) {
  87. console.log('--err', err)
  88. this.$emit('change', this.imageUrl)
  89. }
  90. this.afterLoadImg()
  91. },
  92. },
  93. }
  94. </script>
  95. <style>
  96. </style>