评论

canvas.createImage()方法创建的image标签设置src报错

canvas.createImage()方法创建的image标签设置src报错

const imgObj = canvas.createImage()

imgObj.src = path

控制台会报错: Cannot read property 'nodeId' of undefined

真的是巨坑啊

问题原因是:canvas为响应式变量,因此出现该问题


解决方案1:

如果使用reactive声明的可以使用toRaw转成非相应变量
注意:toRaw不能转换ref声明的变量,请将ref声明删除


解决方案2:

将img.src = path改写为 img.srcset = path


最后一次编辑于  10-25  
点赞 1
收藏
评论

3 个评论

  • 神经蛙
    神经蛙
    10-31

    // 在自定义的绘图方法drawImage中,一定要重新用createSelectorQuery选择出画布节点实例canvas,然后使用里面的上下文ctx绘图。

    // 1、不能用暴露到外部的响应式变量canvas.value.createImage()创建图片,应该是由于canvas.value=res[0].node赋值会导致一些原生方法createImage()失真(cloneDeep也不行,具体原因未查)。TypeError: Cannot read property 'createImage' of undefined,TypeError: Cannot read property 'nodeId' of undefined。

    // 2、即使unref(canvas).createImage()可以创建图片,使用image.srcset = imgSrc可以在开发者工具画图,但部分真机运行会静默失败。

    // 3、如果尝试其他响应式变量方法,只要image.src = imgSrc赋值不报错, 基本上真机也可以画出来。


    //  行不通:

    //  image = unref(canvas).createImage()

    //  image.onload = ()=>{ ctx.value.drawImage(image,x,y,w,h)}

    //  image.srcset = img 

    // 可行:

    	const drawImage = function(img, x, y, w, h) {
    		return new Promise((resolve, reject) => {
    			// console.log(canvas.value)
    			// console.log(ctx.value)
    			const query = uni.createSelectorQuery().in(app.proxy)
    			query.select('#myCanvas').fields({
    				node: true,
    				size: true
    			}).exec((res) => {
    				const canvas = res[0].node
    				const ctx = res[0].node.getContext('2d')
    				const image = canvas.createImage()
    				image.onload = () => {
    					ctx.drawImage(image, x, y, w, h)
    					resolve(true)
    				}
    				image.onerror = (err) => {
    					resolve(false)
    				}
    				image.src = img
    			})
    		})
    	}
    
    10-31
    赞同
    回复
  • 神经蛙
    神经蛙
    10-30

    2D=>ctx.value.drawImage(image,sx,sy,sw,sh)

    interface mixin CanvasDrawImage {

    // drawing images

    undefined drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy);

    undefined drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);

    undefined drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);

    };

    --------------------------------------

    typedef (HTMLOrSVGImageElement or

    HTMLVideoElement or

    HTMLCanvasElement or

    ImageBitmap or

    OffscreenCanvas or

    VideoFrame) CanvasImageSource;

    10-30
    赞同
    回复
  • 周
    10-29

    谢谢,新手忙活一下午没看出问题,改了三种方案都一直报错,多亏找到你

    10-29
    赞同
    回复
登录 后发表内容