Я пытаюсь определить ширину цветного прямоугольника внутри изображения. Для обработки изображений я использую Imagick для PHP.
Идея заключалась в том, чтобы преобразовать изображение в txt и найти в этом txt регулярное выражение для всех пикселей, имеющих определенный цвет (#00FF00).
Вот пример того, как выглядит этот txt (отрывок, начинающийся со строки 83 столбца пикселей 0):
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-й строки.
Есть ли модификация, которую я мог бы внести в свое регулярное выражение, чтобы оно делало то, что я ищу?