canvas.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { sleep } from "../utils/common"
  2. /**
  3. * canvas的一系列方法
  4. */
  5. export default class Canvas {
  6. constructor(drawPoster) {
  7. this.drawPoster = drawPoster
  8. }
  9. /**
  10. * 清空画布
  11. */
  12. clearCanvas() {
  13. const { Context } = this.drawPoster
  14. Context.clearRect(0, 0, 999999, 999999)
  15. }
  16. /**
  17. * 导出图片
  18. * @returns
  19. */
  20. exportImage() {
  21. const { exportImageDelayTime, showExportImagesTips, exportImageTips } = this.drawPoster
  22. return new Promise(async resolve => {
  23. showExportImagesTips && uni.showLoading({ title: exportImageTips })
  24. await sleep(exportImageDelayTime)
  25. // 绘制图片
  26. resolve(await this.createCanvasFilePath())
  27. })
  28. }
  29. /**
  30. * 创建canvas导出文件
  31. * @returns
  32. */
  33. createCanvasFilePath() {
  34. const { Context, canvas, canvasId, _this, is2d, exportImageStyle, dpr, showExportImagesTips, showDrawTips } = this.drawPoster
  35. let { width, height, x, y, fileType, quality, destWidth, destHeight } = exportImageStyle
  36. const params = {}
  37. if (destWidth) {
  38. params.destWidth = destWidth
  39. }
  40. if (destHeight) {
  41. params.destHeight = destHeight
  42. }
  43. if (is2d) {
  44. width = width * dpr
  45. height = height * dpr
  46. }
  47. return new Promise(resolve => {
  48. try {
  49. // #ifdef MP-TOUTIAO || MP-ALIPAY
  50. if (is2d) {
  51. const url = Context.canvas.toDataURL()
  52. resolve({
  53. success: true,
  54. data: url,
  55. msg: '绘画成功'
  56. })
  57. return
  58. } else {
  59. // #ifdef MP-TOUTIAO
  60. params.destWidth = (params.destWidth ?? width) * dpr
  61. params.destHeight = (params.destHeight ?? height) * dpr
  62. // #endif
  63. }
  64. // #endif
  65. uni.canvasToTempFilePath({
  66. canvasId,
  67. canvas,
  68. x,
  69. y,
  70. width: Math.floor(width),
  71. height: Math.floor(height),
  72. quality,
  73. fileType,
  74. ...params,
  75. success: res => {
  76. return resolve({
  77. success: true,
  78. data: res.tempFilePath,
  79. msg: '绘画成功'
  80. })
  81. },
  82. fail: err => {
  83. return resolve({
  84. success: false,
  85. msg: `导出图片失败: ${JSON.stringify(err)}`
  86. })
  87. },
  88. complete: () => {
  89. (showExportImagesTips || showDrawTips) && uni.hideLoading()
  90. }
  91. }, _this)
  92. } catch (e) {
  93. return resolve({
  94. success: false,
  95. msg: '导出图片失败: 绘画错误' + e
  96. })
  97. }
  98. })
  99. }
  100. /**
  101. * 将绘制的内容绘制到画布上
  102. * @returns
  103. */
  104. canvasDraw() {
  105. const { Context, drawDelayTime, is2d } = this.drawPoster
  106. return new Promise(async resolve => {
  107. await sleep(drawDelayTime)
  108. if (is2d) {
  109. return resolve(await this.exportImage())
  110. } else {
  111. await Context.draw(true, async () => {
  112. return resolve(await this.exportImage())
  113. })
  114. }
  115. })
  116. }
  117. /**
  118. * 排序drawArray 根据数据的zIndex进行排序,修改渲染顺序
  119. * @param { Array } drawArray 绘制内容
  120. */
  121. sortDrawArray(drawArray = []) {
  122. return drawArray.sort((after, current) => {
  123. const aZIndex = after.zIndex || 0
  124. const cZIndex = current.zIndex || 0
  125. return aZIndex - cZIndex
  126. })
  127. }
  128. }