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