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;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |