Thinkphp使用Zxing扩展库解析二维码内容图文讲解

  <?php

  namespace Zxing;

  use ZxingCommonHybridBinarizer;

  use ZxingQrcodeQRCodeReader;

  include_once('common/customFunctions.php');

  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;

  }

  }