Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. export function getCanvas({ canvasId, node = true, size = true }, vm) {
  2. return new Promise((resolve, reject) => {
  3. const query = wx.createSelectorQuery().in(vm)
  4. query.select(`#${canvasId}`)
  5. .fields({ node, size })
  6. .exec((res) => {
  7. if (!res[0]) {
  8. reject({
  9. errMsg: 'Canvas is not supported in the current environment.',
  10. })
  11. return
  12. }
  13. resolve(res[0].node)
  14. })
  15. })
  16. }
  17. export function createImage({ imageWidth, imageHeight, imageUrl }, canvas) {
  18. return new Promise((resolve, reject) => {
  19. if (typeof canvas.createImage === 'function') {
  20. const ratio = wx.getSystemInfoSync().pixelRatio
  21. const ctx = canvas.getContext('2d')
  22. const img = canvas.createImage()
  23. img.onload = () => {
  24. ctx.drawImage(
  25. img,
  26. (-imageWidth * ratio) / 2,
  27. (-imageHeight * ratio) / 2,
  28. imageWidth * ratio,
  29. imageHeight * ratio
  30. )
  31. resolve(imageUrl)
  32. }
  33. img.onerror = () => {
  34. reject({
  35. errMsg: 'Image creation failed in canvas.createImage.',
  36. })
  37. }
  38. img.src = imageUrl
  39. } else {
  40. reject({
  41. errMsg: 'Canvas.createImage is not a function.',
  42. })
  43. }
  44. })
  45. }
  46. export function toDataURL({
  47. width,
  48. height,
  49. type ='image/png',
  50. quality = 1,
  51. }, canvas) {
  52. return new Promise((resolve) => {
  53. if (typeof canvas.toDataURL === 'function') {
  54. // 基础库 2.11.0 开始支持
  55. // @see https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.toDataURL.html
  56. resolve(canvas.toDataURL(type, quality))
  57. } else if (typeof wx.canvasToTempFilePath === 'function') {
  58. const ratio = wx.getSystemInfoSync().pixelRatio
  59. wx.canvasToTempFilePath({
  60. destWidth: width * ratio,
  61. destHeight: height * ratio,
  62. canvas,
  63. fileType: type.indexOf('png') !== -1 ? 'png' : 'jpg',
  64. quality,
  65. success: (res) => resolve(res.tempFilePath),
  66. fail: () => resolve(''),
  67. })
  68. } else {
  69. resolve('')
  70. }
  71. })
  72. }
  73. export function downloadImage(imageUrl) {
  74. return new Promise((resolve, reject) => {
  75. if (
  76. /^http/.test(imageUrl) &&
  77. // @ts-ignore
  78. !/^http:\/\/tmp/.test(imageUrl)
  79. ) {
  80. wx.downloadFile({
  81. url: imageUrl,
  82. success: (res) => {
  83. if (res.statusCode === 200) {
  84. resolve(res.tempFilePath)
  85. } else {
  86. reject({ errMsg: res.errMsg })
  87. }
  88. },
  89. fail(err) {
  90. reject(err)
  91. },
  92. })
  93. } else {
  94. // 支持本地地址
  95. resolve(imageUrl)
  96. }
  97. })
  98. }