106 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | namespace Zxing; | ||
|  | 
 | ||
|  | use Zxing\Common\HybridBinarizer; | ||
|  | use Zxing\Qrcode\QRCodeReader; | ||
|  | 
 | ||
|  | final class QrReader | ||
|  | { | ||
|  |     const SOURCE_TYPE_FILE     = 'file'; | ||
|  |     const SOURCE_TYPE_BLOB     = 'blob'; | ||
|  |     const SOURCE_TYPE_RESOURCE = 'resource'; | ||
|  | 
 | ||
|  |     private $bitmap; | ||
|  |     private $reader; | ||
|  |     private $result; | ||
|  | 
 | ||
|  |     public function __construct($imgSource, $sourceType = QrReader::SOURCE_TYPE_FILE, $useImagickIfAvailable = true) | ||
|  |     { | ||
|  |         if (!in_array($sourceType, [ | ||
|  |             self::SOURCE_TYPE_FILE, | ||
|  |             self::SOURCE_TYPE_BLOB, | ||
|  |             self::SOURCE_TYPE_RESOURCE, | ||
|  |         ], true)) { | ||
|  |             throw new \InvalidArgumentException('Invalid image source.'); | ||
|  |         } | ||
|  |         $im = null; | ||
|  |         switch ($sourceType) { | ||
|  |             case QrReader::SOURCE_TYPE_FILE: | ||
|  |                 if ($useImagickIfAvailable && extension_loaded('imagick')) { | ||
|  |                     $im = new \Imagick(); | ||
|  |                     $im->readImage($imgSource); | ||
|  |                 } else { | ||
|  |                     $image = file_get_contents($imgSource); | ||
|  |                     $im    = imagecreatefromstring($image); | ||
|  |                 } | ||
|  |                 break; | ||
|  | 
 | ||
|  |             case QrReader::SOURCE_TYPE_BLOB: | ||
|  |                 if ($useImagickIfAvailable && extension_loaded('imagick')) { | ||
|  |                     $im = new \Imagick(); | ||
|  |                     $im->readImageBlob($imgSource); | ||
|  |                 } else { | ||
|  |                     $im = imagecreatefromstring($imgSource); | ||
|  |                 } | ||
|  |                 break; | ||
|  | 
 | ||
|  |             case QrReader::SOURCE_TYPE_RESOURCE: | ||
|  |                 $im = $imgSource; | ||
|  |                 if ($useImagickIfAvailable && extension_loaded('imagick')) { | ||
|  |                     $useImagickIfAvailable = true; | ||
|  |                 } else { | ||
|  |                     $useImagickIfAvailable = false; | ||
|  |                 } | ||
|  |                 break; | ||
|  |         } | ||
|  |         if ($useImagickIfAvailable && extension_loaded('imagick')) { | ||
|  |             if (!$im instanceof \Imagick) { | ||
|  |                 throw new \InvalidArgumentException('Invalid image source.'); | ||
|  |             } | ||
|  |             $width  = $im->getImageWidth(); | ||
|  |             $height = $im->getImageHeight(); | ||
|  |             $source = new IMagickLuminanceSource($im, $width, $height); | ||
|  |         } else { | ||
|  |             if (!is_resource($im) && !is_object($im)) { | ||
|  |                 throw new \InvalidArgumentException('Invalid image source.'); | ||
|  |             } | ||
|  |             $width  = imagesx($im); | ||
|  |             $height = imagesy($im); | ||
|  |             $source = new GDLuminanceSource($im, $width, $height); | ||
|  |         } | ||
|  |         $histo        = new HybridBinarizer($source); | ||
|  |         $this->bitmap = new BinaryBitmap($histo); | ||
|  |         $this->reader = new QRCodeReader(); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function decode() | ||
|  |     { | ||
|  |         try { | ||
|  |             $this->result = $this->reader->decode($this->bitmap); | ||
|  |         } catch (NotFoundException $er) { | ||
|  |             $this->result = false; | ||
|  |         } catch (FormatException $er) { | ||
|  |             $this->result = false; | ||
|  |         } catch (ChecksumException $er) { | ||
|  |             $this->result = false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public function text() | ||
|  |     { | ||
|  |         $this->decode(); | ||
|  | 
 | ||
|  |         if (method_exists($this->result, 'toString')) { | ||
|  |             return $this->result->toString(); | ||
|  |         } | ||
|  | 
 | ||
|  |         return $this->result; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getResult() | ||
|  |     { | ||
|  |         return $this->result; | ||
|  |     } | ||
|  | } |