leafer-ui icon indicating copy to clipboard operation
leafer-ui copied to clipboard

小程序版本:Image元素的加载能不能外放加载方法以适配更多平台?

Open 826327700 opened this issue 8 months ago • 6 comments

业务是需要适配抖音小程序,目前遇到的问题是,new Image不会成功加载(甚至在网络控制台都看不到发起请求)。猜测是image内部使用了不兼容的请求api,例如wx.downloadFile或者wx.request。希望外放加载方法,让开发者自定义,例如tt.downloadFile,即可适配其他平台的小程序了。

826327700 avatar Apr 13 '25 14:04 826327700

查看源码,发现不是修改加载图片api这么简单。小程序的画布drawImage要求传入img/video标签或者canvas画布。抖音小程序的OffscreenCanvas没有createImage方法。我尝试修改源码中的loadImage方法,使用普通canvas来创建img,以临时测试手动返回一个canvas画布,发现在微信小程序中能正常渲染图片,在抖音小程序中,渲染出来的图片尺寸是对的,但是内容是一片黑色。唉,抖音小程序这阉割版真头疼....

loadImage(src) {
            return new Promise((resolve, reject) => {
				const query = uni.createSelectorQuery();
				query
				.select("#myCanvas")
				.fields({
					node: true,
				},(res)=>{
					var canvas = res.node;
					//  const img = Platform.canvas.view.createImage();
					const img =canvas.createImage();
					img.onload = () => {
                                                  // resolve(img); 直接返回img,渲染也是一片黑色
						const offcanvas = tt.createOffscreenCanvas({type: '2d'});
						offcanvas.width = img.width;
						offcanvas.height = img.height;
						const canvasCtx = offcanvas.getContext("2d");
						canvasCtx.drawImage(img, 0, 0);
						resolve(offcanvas); // 返回画布,渲染也是一片黑色,微信小程序正常。
					 };
					img.onerror = (error) => { reject(error); };
					img.src = Platform.image.getRealURL(src);
				})
				.exec((res) => {

				});

            });
        },

826327700 avatar Apr 13 '25 17:04 826327700

建议用webview组件方式跨多个小程序平台开发,原生的各平台差异大,坑太多,需要花很长时间适配,还不一定能适配的好

leaferjs avatar Apr 14 '25 01:04 leaferjs

建议用webview组件方式跨多个小程序平台开发,原生的各平台差异大,坑太多,需要花很长时间适配,还不一定能适配的好

我也想用webview啊,我都写好h5版本的业务了,后面发现抖音小程序审核时明确标明了,我们小程序所属的类目,不允许使用webview(心里再次吐槽抖音的傻逼策略)。作者大佬,还有没有别的办法可以尝试一下,比如我自己获取图片的imageData,通过putImageData的方式手动塞入数据到leafer元素?或者Canvas元素是否可以drawImage(头条的离屏canvas)

826327700 avatar Apr 14 '25 01:04 826327700

就是这种坑让人头疼,我估计是不支持绘制离屏canvas(因为你上面的那个示例变成了黑色的,说明他这块的支持就有问题)

leaferjs avatar Apr 14 '25 02:04 leaferjs

就是这种坑让人头疼,我估计是不支持绘制离屏canvas(因为你上面的那个示例变成了黑色的,说明他这块的支持就有问题)

我尝试使用Leafer的Canvas元素来绘制图片,图片已经可以绘制出来了,但是缩放会导致图片消失。我感觉这个bug应该是leafer层面的,因为抖音和微信小程序都会出现。 代码如下:

const canvas= new Canvas({
			x: 100,
			y: 100,
			width: 100,
			height: 100,
			editable: true
		})
		const { context } = canvas
		const image = skyCanvas.createImage()
		image.src = 'https://caidan-1318352346.cos.ap-guangzhou.myqcloud.com/assets/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.jpg'
		image.onload = () => {
			console.log("image",image)

			context?.drawImage(image,0,0)

			canvas.paint()
		}

		this.app.tree.add(canvas)

视频: https://caidan-1318352346.cos.ap-guangzhou.myqcloud.com/assets/leafer-miniapp.mp4

826327700 avatar Apr 14 '25 02:04 826327700

查看了一下leafer的源码,基本都是使用OffscreenCanvas作为元素底层的绘制,算了,傻屌抖音小程序的太监版OffscreenCanvas,没有offCanvas.createImage()方法,也没有offCanvas.toDataURL()方法,即便渲染出来了,图片也导出不了。

看看这傻屌政策:

Image

826327700 avatar Apr 14 '25 03:04 826327700