收藏
回答

Canvas.createImage()如果图片有缓存则不会触发image.onload

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug Canvas.createImage() 微信安卓客户端 8.0.33.2320 2.30.2

https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.createImage.html

模拟器正常,但是在真机上会出现首次加载正常,第二次则不触发image.onload函数的问题。

在手机控制台逐步打印log发现image.onload只会在首次触发,onerror未触发,表示图片地址没问题。


最后一次编辑于  2023-03-19
回答关注问题邀请回答
收藏

6 个回答

  • Alwin
    Alwin
    2023-10-30

    绘制完成后 手动将image的src属性置空。

    let img = this._elCanvas.createImage();
    img.onload=function (){
      _oContext.drawImage(img, 0, 0, _htOption.width, _htOption.height)
      success && success()
      //Fixed: android手机上只会触发一次onload
      img.src = ""
    }
    img.src = imagePath
    
    2023-10-30
    有用 4
    回复 1
    • ZQP
      ZQP
      07-23
      方案可行。
      07-23
      回复
  • null
    null
    2023-06-06

    这社区做的跟屎一样,只有机器人在重复请发下代码片段,有问题从来不解决

    2023-06-06
    有用 1
    回复 2
    • 123
      123
      2023-07-18
      有替换方案么?分享一下哈
      2023-07-18
      回复
    • 从君华
      从君华
      2023-07-28
      被你发现了
      2023-07-28
      回复
  • Reginald
    Reginald
    09-25

    跟踪一下, 截至2024-09-25问题依旧, 将image.src 设成空字串至少在OffscreenCanvas上是无效的. 用 wx.getImageInfo() 可避开问题, 但调试可知实际上用这个方法每次调用都会去下载一次图片, 缓存实际上相当于失效了, 图片大的话影响挺明显的

    09-25
    有用
    回复
  • ZQP
    ZQP
    07-23
    可以结合wx.getImageInfo先下载图片
    自己记录缓存地址,让img.src="本地缓存地址"
    然后结合一楼的方案绘制完,把src置空,img.src = ""
    应该就不需要每次从cdn下载了
    小程序api真屎问题太多
    


    07-23
    有用
    回复
  • zxl
    zxl
    2023-08-29

    图片地址加个随机数,可以暂时解决

    2023-08-29
    有用
    回复
  • 123
    123
    2023-07-18

    官方抽个时间解决一下这个问题吧,有需要的,要不然每次都要从cdn拉图片,不如本地缓存的体验好

    2023-07-18
    有用
    回复
登录 后发表内容