捕获组更改后,使preg_match_all停止

时间:2016-01-31 15:21:19

标签: php regex width imagick

我正在尝试识别图像中彩色矩形的宽度。对于图像处理我正在使用Imagick for PHP。

我的想法是将图像转换为txt并使用正则表达式搜索此txt,以获取具有特定颜色的所有像素(#00FF00)。

以下是txt的外观示例(从第0列第83行开始摘录):

0,83: (255,255,255,1)  #FFFFFF  graya(255,1)
1,83: (255,255,255,1)  #FFFFFF  graya(255,1)
2,83: (255,255,255,1)  #FFFFFF  graya(255,1)
3,83: (0,255,0,1)  #00FF00  graya(0,1)
4,83: (0,255,0,1)  #00FF00  graya(0,1)
5,83: (0,255,0,1)  #00FF00  graya(0,1)
6,83: (255,255,255,1)  #FFFFFF  graya(255,1)
7,83: (255,255,255,1)  #FFFFFF  graya(255,1)
8,83: (255,255,255,1)  #FFFFFF  graya(255,1)
0,84: (255,255,255,1)  #FFFFFF  graya(255,1)
1,84: (255,255,255,1)  #FFFFFF  graya(255,1)
2,84: (255,255,255,1)  #FFFFFF  graya(255,1)
3,84: (0,255,0,1)  #00FF00  graya(0,1)
4,84: (0,255,0,1)  #00FF00  graya(0,1)
5,84: (0,255,0,1)  #00FF00  graya(0,1)
....

这是我的代码:

$canvasImg = new Imagick("_sources/passepartout/". $deviceName .".png");

$canvasImg->setFormat(txt);

preg_match_all("/(\\d+),(\\d+): \\(0,255,0,1\\)/is", $canvasImg, $colorMatchAll);

$firstPixelX = reset($colorMatch[1]);
$lastPixelX = end($colorMatch[1]);

$canvasWidth = $lastPixelX - $firstPixelX;

到目前为止这个工作正常,但它非常慢,因为它找到了彩色矩形中的所有像素,包括y轴的整个高度。

现在因为我只对这个#00FF00矩形的宽度感兴趣,我认为如果正则表达式只找到#00FF00的第一个像素然后通过像素行直到结束(第83行),它会更快我的例子)并在它碰到第84行时停止。

我可以对我的正则表达式进行修改吗?它可以完成我正在寻找的内容吗?

1 个答案:

答案 0 :(得分:0)

你可以使用$ imagick-> trimImage()然后使用$ imagick-> getImagePage()来获取位置,如果矩形是图像上唯一的东西,或者你可以迭代像素,并且你自己的边缘检测。

$imagick = new \Imagick(realpath($imagePath));
$imageIterator = $imagick->getPixelRegionIterator(0, 0, 
     $imagick->getImageWidth(),
     $imagick->getImageHeight(),
 );

/* Loop through pixel rows */
foreach ($imageIterator as $pixels) {
    /** @var $pixel \ImagickPixel */
    /* Loop through the pixels in the row (columns) */
    foreach ($pixels as $column => $pixel) {
        $red = $pixel->getColorValue(\Imagick::COLOR_RED);
        $green = $pixel->getColorValue(\Imagick::COLOR_GREEN);
        $blue = $pixel->getColorValue(\Imagick::COLOR_BLUE);
        //Do detection here
    }
    /* Sync the iterator, this is important to do on each iteration */
    $imageIterator->syncIterator();
}

$imageIterator->clear();