image-processing javascript node.js puppeteer

javascript - 如何遍历木偶创建的屏幕快照图像的像素颜色并绘制矩形和sa

发布于 2020-04-09 10:32:26

我是JavaScript / Node.js和图像处理的新手,我想获取人偶屏幕截图的输出(最好是在内存中),然后能够遍历图像中每个像素的颜色,然后围绕特定图片(x,y,宽度,高度),然后使用Node.js将带有矩形突出显示的图片保存到文件中。

我从p中得到的是

返回:<Promise<string|Buffer>>承诺将捕获的屏幕快照解析为缓冲区或base64字符串(取决于编码的值)。

我读到可以使用puppeteer创建画布对象来执行此操作,但是我不确定这种解决方案,尤其是检索像素颜色时。我不知道是否应该为该软件包或其他软件包使用像PureImage这样的软件包。

查看更多

提问者
Ibrahim
被浏览
54
Ibrahim 2020-02-06 01:12

这是我的代码。

  1. 处理Puppeteer拍摄的base64屏幕截图。
  2. 创建一个图像元素。
  3. 等待图像加载事件。
  4. 将图像的src属性设置为屏幕截图。
  5. 创建未附加到DOM的画布,并向其写入图像。
  6. 在画布上描边两个矩形。
  7. 返回画布数据。

async function (rectangle1, rectangle2, screenshot) {
        let screenshotHighlighted = await driver.page.evaluate(async function (rectangle1, rectangle2, screenshot) {
            let image = new Image();
            let imgLoadPromise = async function(){ return new Promise((resolve, reject) => {
                image.onload = () => {console.log('loaded'); return resolve};
                image.onerror = reject;
            });}
            image.src = 'data:image/png;base64,' + screenshot;
            await imgLoadPromise;
            let canvas = document.createElement("CANVAS");
            let context = canvas.getContext("2d");
            canvas.width = image.naturalWidth;
            canvas.height = image.naturalHeight;
            context.drawImage(image, 0, 0);
            //solid black and dashed red
            context.strokeStyle = "black";
            context.strokeRect(rectangle1.minX, rectangle1.minY, rectangle1.width, rectangle1.height);
            context.setLineDash([5, 10]);
            context.strokeStyle = "red";
            context.strokeRect(rectangle1.minX, rectangle1.minY, rectangle1.width, rectangle1.height);
            context.setLineDash([]);
            //solid black and dashed yellow
            context.strokeStyle = "black";
            context.strokeRect(rectangle2.minX, rectangle2.minY, rectangle2.width, rectangle2.height);
            context.setLineDash([5, 10]);
            context.strokeStyle = "yellow";
            context.strokeRect(rectangle2.minX, rectangle2.minY, rectangle2.width, rectangle2.height);
            return canvas.toDataURL();
        }, rectangle1, rectangle2, screenshot);
        return screenshotHighlighted;
    }

将文件保存在Node.JS中

fs.writeFile(path.join(directory,imageFileName),highlightedScreenshot.split(',')[1], 'base64', 
  function(err) {
        if(err) {
                    console.log('ERROR IN SAVING IMAGE');
                    console.log(err);
                } 
            });

可以在以下答案中找到遍历HTML画布的像素

从HTML画布获取像素