评论

解决微信 8.0.37 Canvas 2D 中 canvasContext.createImageData 无法绘制问题

解决安卓微信升级到 8.0.37 时,在微信小程序和微信小游戏中, Canvas 2D canvasContext.createImageData 无法绘制问题

最近安卓微信更新到 8.0.37 版本后,canvas 2D 有无法绘制问题出现;(微信小程序、微信小游戏均有出现)


微信小程序处理

1、完整代码片段:https://developers.weixin.qq.com/s/uEA9JLme7mIT

2、核心代码如下:

/**
 * 苹果能绘制,安卓(微信版本 8.0.37)不能绘制
 */
const imgData = canvasContext.createImageData(width, height)
for (var i = 0; i < imgData.data.length; i += 4) {
  imgData.data[i + 0] = 0
  imgData.data[i + 1] = 255
  imgData.data[i + 2] = 0
  imgData.data[i + 3] = 255
}
console.log('imgData >>>>>>>>>>>>>>>', imgData)
ctx.putImageData(imgData, 0, 0)


/**
 * 修改后安卓苹果都能绘制
 */
const u8Arr = new Uint8ClampedArray(width * height * 4)
for (var i = 0; i < u8Arr.length; i += 4) {
  u8Arr[i + 0] = 0
  u8Arr[i + 1] = 255
  u8Arr[i + 2] = 0
  u8Arr[i + 3] = 255
}
console.log('u8Arr >>>>>>>>>>>>>>>', u8Arr)
const imgData = canvas.createImageData(u8Arr, width, height)
console.log('imgData >>>>>>>>>>>>>>>', imgData)
canvasContext.putImageData(imgData, 0, 0)


3、备注

canvas.createImageData 方法需要三个参数:

e:Unit8ClampedArray

t:width

r:height

关于这个方法需要三个参数,官方文档没有说明,强烈建议官方补全文档,不然全靠猜;最容易使用 canvasContext.createImageData 传参形式,结果返回 null

从红色方框内可以看出,canvas.createImageData 内部也是调用 canvasContext.createImageData 实现的;现在大部分安卓手机微信升级到 8.0.37,直接调用 canvasContext.createImageData 无法绘制,需调用 canvas.createImageData 才行;官方人员还请仔细排查一下!


微信小游戏处理

1、完整代码片段:https://developers.weixin.qq.com/s/czATiLmE7sIs

2、核心代码如下:

/**
 * 苹果能绘制,安卓(微信版本 8.0.37)不能绘制
 */
const width = 100, height = 100
const imgData = canvasContext.createImageData(width, height)
for (var i = 0; i < imgData.data.length; i += 4) {
    imgData.data[i + 0] = 0
    imgData.data[i + 1] = 255
    imgData.data[i + 2] = 0
    imgData.data[i + 3] = 255
}
console.log('imgData >>>>>>>>>>>>>>>', imgData)
canvasContext.putImageData(imgData, 20, 120)

/**
 * 修改后安卓苹果都能绘制(模拟器报错,真机可以)
 */
const width = 100, height = 100
const u8Arr = new Uint8ClampedArray(width * height * 4)
for (var i = 0; i < u8Arr.length; i += 4) {
    u8Arr[i + 0] = 0
    u8Arr[i + 1] = 255
    u8Arr[i + 2] = 0
    u8Arr[i + 3] = 255
}
console.log('u8Arr >>>>>>>>>>>>>>>', u8Arr)
const imgData = wx.createImageData(u8Arr, width, height) // 基础库 2.24.6 开始支持
console.log('imgData >>>>>>>>>>>>>>>', imgData)
canvasContext.putImageData(imgData, 20, 120)


3、备注

wx.createImageData 官方文档也未说明如何传参,建议官方补全


总结

canvasContext.createImageData 方法返回的 ImageData 无法绘制问题,应该是个 Bug,请官方及时排查修复!

最后一次编辑于  2023-06-06  
点赞 12
收藏
评论

5 个评论

  • 荟
    2023-06-09

    同样的问题,小程序刚上线一个月就出现这个问题,改了个api就好了,太坑爹了吧

    2023-06-09
    赞同
    回复
  • 木头
    木头
    2023-06-09

    点赞!

    2023-06-09
    赞同
    回复
  • 穆清
    穆清
    2023-06-06

    老哥 太6了 产品经理那边突然说功能不能用了 找了半天才发现是8.0.37的问题 最后才找到你这

    2023-06-06
    赞同 1
    回复 1
    • 夏落
      夏落
      2023-06-08
      从一步步定位到问题并找到替代方法,花了一整天,说多了都是泪🤣
      2023-06-08
      1
      回复
  • GYP
    GYP
    发表于移动端
    2023-07-10
    大佬,请问如何将 wxml 里的 view 通过 canvas 保存成图片下载到本地呀?
    2023-07-10
    赞同
    回复 2
    • 夏落
      夏落
      2023-07-16
      步骤:
      1、通过 canvas 绘制出 view 展示的内容(canvas绘制参考:https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D
      2、导出画布内容为图片(方法:wx.canvasToTempFilePath)
      3、保存图片到系统相册(方法:saveImageToPhotosAlbum)
      2023-07-16
      回复
    • 初见ぃ
      初见ぃ
      2023-11-16
      大佬,绘制canvas绘制图片尺寸过大时,canvas导出成图片,安卓会报:canvasToTempFilePath:fail:create bitmap failed,ios没有问题,图片大小无法缩小,需要保留原始尺寸,这个问题要怎么解决呀?
      2023-11-16
      回复
  • 对方正在输入...
    对方正在输入...
    2023-06-09

    感谢...

    2023-06-09
    赞同
    回复
登录 后发表内容