|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Zxing\Common; |
|
|
|
|
|
use Zxing\NotFoundException; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final class DefaultGridSampler extends GridSampler |
|
|
{ |
|
|
|
|
|
public function sampleGrid( |
|
|
$image, |
|
|
$dimensionX, |
|
|
$dimensionY, |
|
|
$p1ToX, $p1ToY, |
|
|
$p2ToX, $p2ToY, |
|
|
$p3ToX, $p3ToY, |
|
|
$p4ToX, $p4ToY, |
|
|
$p1FromX, $p1FromY, |
|
|
$p2FromX, $p2FromY, |
|
|
$p3FromX, $p3FromY, |
|
|
$p4FromX, $p4FromY |
|
|
) { |
|
|
|
|
|
$transform = PerspectiveTransform::quadrilateralToQuadrilateral( |
|
|
$p1ToX, $p1ToY, $p2ToX, $p2ToY, $p3ToX, $p3ToY, $p4ToX, $p4ToY, |
|
|
$p1FromX, $p1FromY, $p2FromX, $p2FromY, $p3FromX, $p3FromY, $p4FromX, $p4FromY); |
|
|
|
|
|
return $this->sampleGrid_($image, $dimensionX, $dimensionY, $transform); |
|
|
} |
|
|
|
|
|
|
|
|
public function sampleGrid_( |
|
|
$image, |
|
|
$dimensionX, |
|
|
$dimensionY, |
|
|
$transform |
|
|
) { |
|
|
if ($dimensionX <= 0 || $dimensionY <= 0) { |
|
|
throw NotFoundException::getNotFoundInstance(); |
|
|
} |
|
|
$bits = new BitMatrix($dimensionX, $dimensionY); |
|
|
$points = fill_array(0, 2 * $dimensionX, 0.0); |
|
|
for ($y = 0; $y < $dimensionY; $y++) { |
|
|
$max = count($points); |
|
|
$iValue = (float)$y + 0.5; |
|
|
for ($x = 0; $x < $max; $x += 2) { |
|
|
$points[$x] = (float)($x / 2) + 0.5; |
|
|
$points[$x + 1] = $iValue; |
|
|
} |
|
|
$transform->transformPoints($points); |
|
|
|
|
|
|
|
|
$this->checkAndNudgePoints($image, $points); |
|
|
try { |
|
|
for ($x = 0; $x < $max; $x += 2) { |
|
|
if ($image->get((int)$points[$x], (int)$points[$x + 1])) { |
|
|
|
|
|
$bits->set($x / 2, $y); |
|
|
} |
|
|
} |
|
|
} catch (\Exception $aioobe) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
throw NotFoundException::getNotFoundInstance(); |
|
|
} |
|
|
} |
|
|
|
|
|
return $bits; |
|
|
} |
|
|
} |
|
|
|