uni-app 【报Bug】content.drawimage后 getimagedata返回为空数据
uni-app 【报Bug】content.drawimage后 getimagedata返回为空数据
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | win10 专业版 | HBuilderX |
产品分类:uni-app x/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:win10 专业版
HBuilderX类型:正式
HBuilderX版本号:4.28
手机系统:Android
手机系统版本号:Android 13
手机厂商:华为
手机机型:mate60
页面类型:vue
vue版本:vue3
打包方式:云端
项目创建方式:HBuilderX
示例代码:
```javascript
uni.getImageInfo({
src: this.authorbackpic,
success: res => {
// 异步调用方式, 跨平台写法
uni.createCanvasContextAsync({
id: 'bgcolor',
component: this,
success: (context : CanvasContext) => {
this.renderingContext = context.getContext('2d')!
}
})
})
const context = this.renderingContext!
console.log('context',context)
const image = new Image(100, 100);
image.src = 'https://web-ext-storage.dcloud.net.cn/uni-app-x/hello-uniappx-qrcode.png'
image.onload = () => {
context.drawImage(image, 0, 0, 100, 100)
context.save()
let datadots = context.getImageData(0,0,100,100)
console.log('datadots',datadots)
}
console.log('-------context',context)
console.log('---',res)
}
返回数据如下
//[io.dcloud.canvas.ImageDataImpl]
{
"data":
//[io.dcloud.uts.Uint8ClampedArray]
{},
"height":
//[Int]
100,
"width":
//[Int]
100
}
为啥data是空对象呢
操作步骤:
放一个canvas控件
`<canvas ref="refbgcolor" id="bgcolor"></canvas>`
复制上面的代码放到一方法里面 点击调用就行
预期结果:
data为数组集合
实际结果:
返回空对象
bug描述:
先drawimage 然后再getimage的得到的data数据为空
1 回复
在处理uni-app中的canvas
相关操作时,drawImage
后getImageData
返回为空数据的问题,通常与绘制时机、图像加载状态以及canvas的上下文状态有关。以下是一个可能的代码示例,以及确保getImageData
能正确获取到数据的注意事项和修正方法。
示例代码
// 假设我们有一个canvas组件,id为myCanvas
const canvasId = 'myCanvas';
const ctx = uni.createCanvasContext(canvasId);
// 加载图片,并在加载完成后进行绘制和获取图像数据
uni.getImageInfo({
src: 'https://example.com/path/to/your/image.png', // 替换为你的图片路径
success: function(imageInfo) {
// 绘制图片到canvas
ctx.drawImage(imageInfo.path, 0, 0, canvasWidth, canvasHeight);
ctx.draw(false, function() {
// 确保绘制完成后再获取图像数据
uni.canvasToTempFilePath({
canvasId: canvasId,
success: function(res) {
// 这里通常不需要直接获取imageData,因为已经转为了文件路径
// 但为了演示,我们仍然尝试在绘制完成后立即获取imageData
setTimeout(() => {
try {
const imageData = ctx.getImageData(0, 0, canvasWidth, canvasHeight);
console.log('ImageData:', imageData);
} catch (error) {
console.error('Failed to get imageData:', error);
}
}, 100); // 适当延时以确保绘制完成
},
fail: function(err) {
console.error('Failed to convert canvas to temp file path:', err);
}
});
});
},
fail: function(err) {
console.error('Failed to get image info:', err);
}
});
// 注意:canvasWidth和canvasHeight需要根据你的canvas尺寸来设置
// 例如:const canvasWidth = 300; const canvasHeight = 300;
注意事项
- 确保图片加载完成:在
drawImage
之前,必须确保图片已经加载完成,使用uni.getImageInfo
来获取图片的本地路径。 - 绘制完成回调:
ctx.draw
的第二个参数是一个回调函数,它会在绘制完成后执行。确保在这个回调中调用getImageData
。 - 上下文状态:确保
ctx
的状态是正确的,没有在其他地方被修改或重置。 - 异步处理:由于图像加载和绘制都是异步操作,使用适当的延时(如
setTimeout
)或事件监听来确保操作顺序。
通过上述代码和注意事项,你应该能够解决drawImage
后getImageData
返回为空数据的问题。如果问题依旧存在,请检查canvas组件的尺寸设置、图片路径的有效性以及其他可能影响绘制和获取数据的因素。