uni-app canvas渲染的奇怪bug
uni-app canvas渲染的奇怪bug
操作步骤:
- 页面中使用uview的u-upload组件,u-upload组件中添加hpy-watermark插件,uview-ui版本1.8.3。页面的u-upload组件在打开页面时预加载了图片,用u-upload自带的deleteItem方法删除图片,再次通过组件选择图片,则报错。
预期结果:
- 预期是再次选择图片也能正确加载,并且能通过hpy-watermark插件得到水印。
实际结果:
- 实际代码报错:[object DOMException] at view.umd.min.js:1。
- 利用edge查看页面元素,edge报错:Failed to execute ‘drawImage’ on ‘CanvasRenderingContext2D’: The image argument is a canvas element with a width or height of 0。
bug描述:
- 这个bug情景比较特殊,我的页面使用了uview中的u-upload组件,并于u-upload组件中添加了hpy-watermark水印插件。如果页面在打开时已经预先于u-upload中加载了图片,那么如果用remove方法删去图片,则hpy-watermark水印会提示报错。如果u-upload中没有图片则一切正常。
- hpy-watermark插件的原理是利用一个不可见的canvas加载图片并画上水印,然后保存为临时图片返回给u-upload。其内容很简单:
<template> <view class="watermark-content"> <canvas :canvas-id="canvasId" id="watermarkCanvas" :style="{ width: `${computedWidth}px`, height: `${computedHeight}px` }"></canvas> </view> </template>
- 利用edge浏览器的edge://inspect/命令查看页面元素,会发现canvas元素经过渲染变成了uni-canvas元素,uni-canvas元素的子元素则是一个canvas,hpy-watermark插件实际是在这个子元素内进行绘制。当页面加载的u-upload中存在图片时,删去图片,uni-canvas元素的宽高改变不再能传导到canvas中,即便使用了this.$forceUpdate()也无济于事。
- 在Hbuilder中的报错非常笼统,只有:[object DOMException] at view.umd.min.js:1。
- 而在利用edge浏览器的edge://inspect/命令查看页面元素,则能看到报错的一些详情如图所示。
- hpy-watermark插件于u-upload组件中的使用方法参看:https://blog.csdn.net/qq_34378032/article/details/124025348
更多关于uni-app canvas渲染的奇怪bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html
1 回复
更多关于uni-app canvas渲染的奇怪bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在处理uni-app中canvas渲染的奇怪bug时,通常我们需要先确认几个关键点:canvas的版本兼容性、绘图的代码逻辑、以及可能的性能瓶颈。以下是一个简化的代码案例,旨在展示如何在uni-app中使用canvas,并附带一些调试技巧,帮助你定位和解决可能的渲染问题。
代码示例
<template>
<view>
<canvas canvas-id="myCanvas" style="width: 300px; height: 300px;"></canvas>
</view>
</template>
<script>
export default {
onLoad() {
this.drawCanvas();
},
methods: {
drawCanvas() {
const ctx = uni.createCanvasContext('myCanvas');
// 绘制矩形
ctx.setFillStyle('red');
ctx.fillRect(10, 10, 150, 75);
// 绘制圆形
ctx.beginPath();
ctx.arc(100, 100, 50, 0, 2 * Math.PI);
ctx.setFillStyle('blue');
ctx.fill();
// 绘制文本
ctx.setFontSize(20);
ctx.setFillStyle('black');
ctx.fillText('Hello, Canvas!', 50, 200);
// 绘制图像(假设有一张base64图片)
// 注意:实际开发中,图片需要确保已加载完成,可以使用uni.getImageInfo先获取图片信息
// const imgSrc = 'data:image/png;base64,...'; // 替换为实际的base64数据
// ctx.drawImage(imgSrc, 20, 20, 50, 50);
ctx.draw(false, () => {
console.log('Canvas drawing completed.');
});
}
}
}
</script>
<style>
/* 样式可根据需要调整 */
</style>
调试技巧
- 控制台日志:使用
console.log
在绘图的关键步骤打印信息,帮助确认代码执行流程。 - 版本兼容性:检查uni-app和底层canvas库的版本,确保没有已知的bug影响。
- 性能分析:如果渲染缓慢或出现卡顿,考虑使用性能分析工具(如Chrome DevTools的性能面板)检查渲染帧率和内存使用情况。
- 错误捕捉:在
ctx.draw()
的回调中添加try...catch
块,捕捉并处理可能的异常。 - 简化测试:逐步简化绘图代码,从最简单的图形开始,逐步添加复杂性,以确定问题出现的具体位置。
通过上述代码和调试技巧,你应该能够更有效地定位和解决uni-app中canvas渲染的奇怪bug。如果问题依旧存在,建议查阅官方文档或社区论坛,看看是否有其他开发者遇到并解决了类似的问题。