| <?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 ($this->result !== false && method_exists($this->result, 'toString')) { |
| return $this->result->toString(); |
| } |
|
|
| return $this->result; |
| } |
|
|
| public function getResult() |
| { |
| return $this->result; |
| } |
| } |
|
|