ฉันกำลังพยายามระบุความกว้างของสี่เหลี่ยมสีภายในรูปภาพ สำหรับการจัดการรูปภาพ ฉันใช้ Imagick สำหรับ PHP
แนวคิดคือการแปลงรูปภาพเป็น txt และค้นหา txt นี้ด้วย regex สำหรับพิกเซลทั้งหมดที่มีสีเฉพาะ (#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 นี้ ฉันคิดว่าคงจะเร็วกว่านี้หาก regex พบพิกเซลแรกที่เป็น #00FF00 แล้วจึงผ่านแถวพิกเซลไปจนสุด (แถว 83 ในตัวอย่างของฉัน) และหยุดทันทีที่ถึงแถวที่ 84
มีการแก้ไขใดที่ฉันสามารถทำได้กับ regex ของฉันซึ่งทำในสิ่งที่ฉันกำลังมองหาหรือไม่