莫名其妙的node-canvas,图片加载回调失败咯。

出现问题的原因

最近在用nodeJS调试node-canvas库,然后在加载图片问题时发现了一个非常莫名其妙的问题,一个有些找不到原因的问题,一时让人摸不着头脑。 代码大致的过程是这样的:

markdown 复制代码
* 先加载一张远程的图片链接,然后绘制到canvas当中
* 画布上渲染了图片以后,将绘制好的canvas保存下来(转为base64)
* 然后清空画布,重新渲染canvas 
* 将保存的图片(base64)加载到画布中

在将保存的图片(base64格式)绘制到画布时,发现图片元素无法执行加载回调函数onload,然后await就一直在等待,将程序堵塞住。

发现问题的过程

首先,经过排查发现,创建图片是正常的,如果不等待onload,直接绘制到画布上,发现是可以的(base64的加载非常快,可以认为是同步加载,不需要考虑异步的问题了),但是这样一来,问题还是没有解决, 然后去github查询,发现这个库在早期版本图片加载是同步的,后来由于使用者的反馈,在迭代了版本以后变为了异步,github.com/Automattic/...

npm库中有说明

然后在这里,这个开发者说,在给图片赋值之前,需要先声明onload函数

经过调试发现,果然如此,在编写代码的时候 如果先给图片赋值,然后在声明onload函数的话,可能会导致onload函数没有回调

解决问题的方法

如果你的图片资源是远程的,那么你先给图片赋值,然后在声明onload函数执行图片加载完成后的回调,这样不会发生问题。

要是你的图片资源是存储在内存中的,或者是加载过程非常快,几乎是同步的,那么你需要先声明onload函数,再给图片赋值

结语

因为代码量非常多,就不展示全部的代码了,大致的问题与解决方案已经在上面做了说明。

但是其实还是有问题,因为图片(base64)存储在内存中,onload函数在后面的实际操作中我发现有回调,一切看起来都正常,但是将图片绘制到画布中还是报错了,控制台打印说这个图片元素报错。然后我就重新写了一个图片创建方法,不要异步,这样代码就可以正常执行了。

好的,这个图片加载回调失败的问题就是这样的,我这里还是没有明白为什么先赋值在声明onload会导致异常,有大神能告诉我吗,谢谢大家阅读到这里。

相关推荐
郑州光合科技余经理8 分钟前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆6661 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
Dovis(誓平步青云)1 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan2 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_2 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒2 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技3 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu3 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
niyongsheng4 小时前
后端零改动,给若依换一套现代化前端
vue.js·开源·node.js
默_笙4 小时前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript