NodeJS中Jimp写入图片延迟,Tesseract读取旧文件问题求助
解决Jimp写入文件延迟导致Tesseract读旧图的问题
核心问题是Jimp的文件写入是异步操作,你必须确保写入完全完成后再调用Tesseract识别,硬编码延迟不可靠,要通过Promise/async await正确处理异步流程。
完整可行代码示例
const Jimp = require('jimp'); const Tesseract = require('tesseract.js'); const robot = require('robotjs'); // 用robotjs做屏幕截取,可替换为其他截图库 async function screenCaptureAndOCRWorkflow() { // 1. 截取屏幕 const screenSize = robot.getScreenSize(); const screenBitmap = robot.screen.capture(0, 0, screenSize.width, screenSize.height); // 将截图数据转为Jimp对象 const jimpImage = new Jimp(screenSize.width, screenSize.height); let pixelPos = 0; jimpImage.scan(0, 0, jimpImage.bitmap.width, jimpImage.bitmap.height, (x, y, idx) => { jimpImage.bitmap.data[idx + 2] = screenBitmap.image[pixelPos++]; jimpImage.bitmap.data[idx + 1] = screenBitmap.image[pixelPos++]; jimpImage.bitmap.data[idx] = screenBitmap.image[pixelPos++]; jimpImage.bitmap.data[idx + 3] = screenBitmap.image[pixelPos++]; }); // 2. 等待图片写入磁盘完成 await jimpImage.writeAsync('image.png'); // 使用writeAsync返回Promise,await确保写入完成 // 3. Tesseract识别图片文本 const ocrResult = await Tesseract.recognize('image.png', 'eng', { logger: msg => console.log(msg.status) // 可选,打印识别进度 }); const recognizedText = ocrResult.data.text; // 4. 搜索目标字符串并执行操作 const targetStr = '你要找的字符串'; if (recognizedText.includes(targetStr)) { console.log(`找到目标: ${targetStr}`); // 这里写找到后的操作,比如模拟点击、发送指令等 robot.keyTap('enter'); } else { console.log(`未找到目标: ${targetStr}`); // 未找到时的操作 } } // 执行流程并捕获错误 screenCaptureAndOCRWorkflow().catch(err => { console.error('流程执行出错:', err); });
关键注意事项
- 用
writeAsync代替write:Jimp的write是回调式API,writeAsync返回Promise,配合await能确保文件完全写入磁盘后再执行后续逻辑,这是解决旧图问题的核心。 - 全流程异步控制:把所有步骤放在async函数里,每个异步操作(截图处理、文件写入、OCR识别)都用
await等待完成,保证执行顺序正确。 - 放弃硬编码延迟:
setTimeout的延迟时间无法匹配不同系统的IO速度,完全不可靠,必须用异步机制等待操作完成。 - 错误捕获:在主函数末尾用
catch捕获整个流程的错误,方便定位问题。
内容的提问来源于stack exchange,提问作者Kelvin gaston
相关产品推荐
相关产品推荐

