94 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| /*
 | |
| * Copyright 2007 ZXing authors
 | |
| *
 | |
| * Licensed under the Apache License, Version 2.0 (the "License");
 | |
| * you may not use this file except in compliance with the License.
 | |
| * You may obtain a copy of the License at
 | |
| *
 | |
| *      http://www.apache.org/licenses/LICENSE-2.0
 | |
| *
 | |
| * Unless required by applicable law or agreed to in writing, software
 | |
| * distributed under the License is distributed on an "AS IS" BASIS,
 | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| * See the License for the specific language governing permissions and
 | |
| * limitations under the License.
 | |
| */
 | |
| 
 | |
| namespace Zxing\Common;
 | |
| 
 | |
| use Zxing\NotFoundException;
 | |
| 
 | |
| /**
 | |
|  * @author Sean Owen
 | |
|  */
 | |
| final class DefaultGridSampler extends GridSampler
 | |
| {
 | |
| //@Override
 | |
|     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);
 | |
|     }
 | |
| 
 | |
| //@Override
 | |
|     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);
 | |
| // Quick check to see if points transformed to something inside the image;
 | |
| // sufficient to check the endpoints
 | |
|             $this->checkAndNudgePoints($image, $points);
 | |
|             try {
 | |
|                 for ($x = 0; $x < $max; $x += 2) {
 | |
|                     if ($image->get((int)$points[$x], (int)$points[$x + 1])) {
 | |
| // Black(-ish) pixel
 | |
|                         $bits->set($x / 2, $y);
 | |
|                     }
 | |
|                 }
 | |
|             } catch (\Exception $aioobe) {//ArrayIndexOutOfBoundsException
 | |
| // This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting
 | |
| // transform gets "twisted" such that it maps a straight line of points to a set of points
 | |
| // whose endpoints are in bounds, but others are not. There is probably some mathematical
 | |
| // way to detect this about the transformation that I don't know yet.
 | |
| // This results in an ugly runtime exception despite our clever checks above -- can't have
 | |
| // that. We could check each point's coordinates but that feels duplicative. We settle for
 | |
| // catching and wrapping ArrayIndexOutOfBoundsException.
 | |
|                 throw NotFoundException::getNotFoundInstance();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $bits;
 | |
|     }
 | |
| }
 |