You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.2 KiB
105 lines
3.2 KiB
<?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)) {
|
|
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;
|
|
}
|
|
}
|
|
|