1. Зачем писать эту статью
Недавно мне нужно сгенерировать QR-код для проекта, чтобы пользователи могли прыгать.После поиска я обнаружил, что в Интернете используется код под названиемphpqrcode
расширение, вgithub
Искал в интернете и обнаружил, что автор этого проекта не поддерживал его 6 лет назад, и статьи Baidu тоже такие же.Вы копируете мои, а я копирую ваши, так что я долженgithub
Посмотрите, есть ли что-нибудь лучше оPHP
Расширение для генерации QR-кода, а затем нашел проект с именемqr-code
Расширение чувствует себя хорошо, автор занимается обслуживанием, и использование также простое и удобное. Итак, вот описание установки и использования этого расширения для облегчения вашей разработки.
qr-code
Проектgithub
Адрес:qr-code
2. Установите qr-код
Здесь мы проходимcomposer
установить расширение,composer
Сейчас его можно считать относительно популярным инструментом управления пакетами, если он прав.composer
Если вы мало что знаете об этом, вы можете прочитать мою предыдущую статью:
"Установка и использование php-composer"
Моя среда — Linux, мы вводим следующую команду для установки расширения:
composer require endroid/qr-code
Когда расширение установлено, мы можем начать следующие операции.
3. Сгенерируйте QR-код
Для начала нам нужно ввести в проектqr-code
файл класса,composer
В основном черезpsr-4 "命名空间": "路径"
способ автозагрузки, его расположение находится в корневом каталоге расширенияcomposer.json
в файле.
Хорошо, теперь мы представляемqr-code
class и попробуйте вывести простой QR-код.
use Endroid\QrCode\QrCode;
// $content 一般为url地址 当然也可以是文字内容
$content = 'http://www.baidu.com?rand=' . rand(1000, 9999);
$qrCode = new QrCode($content);
// 指定内容类型
header('Content-Type: '.$qrCode->getContentType());
// 输出二维码
echo $qrCode->writeString();
Ну а при указании типа контента QR-код будет выводиться прямо на странице
Так как же такой QR-код прямого вывода можно применить к проекту?html
середина<img>
теги, например:
<img src="http://localhost:8080/projecttest/qrtest?id=1234" alt="这是一个二维码" />
Таким образом, QR-код может отображаться в любом месте страницы. Конечно, мы также можем сохранить его в файл, чтобы сгенерировать картинку в любом формате, например:
$qrCode->writeFile(__DIR__ . '/qrcode.png');
Таким образом, мы можем отображать QR-код на странице в соответствии с путем изображения.
4. Простые файлы примеров и введение общих параметров
Здесь я публикую простой файл обработки класса и представляю егоqr-code
Некоторые часто используемые параметры.
файл класса:
namespace '命名空间';
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\LabelAlignment;
use Endroid\QrCode\QrCode;
class QrcodeComponent
{
protected $_qr;
protected $_encoding = 'UTF-8';
protected $_size = 300;
protected $_logo = false;
protected $_logo_url = '';
protected $_logo_size = 80;
protected $_title = false;
protected $_title_content = '';
protected $_generate = 'display'; // display-直接显示 writefile-写入文件
const MARGIN = 10;
const WRITE_NAME = 'png';
const FOREGROUND_COLOR = ['r' => 0, 'g' => 0, 'b' => 0, 'a' => 0];
const BACKGROUND_COLOR = ['r' => 255, 'g' => 255, 'b' => 255, 'a' => 0];
public function __construct($config) {
isset($config['generate']) && $this->_generate = $config['generate'];
isset($config['encoding']) && $this->_encoding = $config['encoding'];
isset($config['size']) && $this->_size = $config['size'];
isset($config['display']) && $this->_size = $config['size'];
isset($config['logo']) && $this->_logo = $config['logo'];
isset($config['logo_url']) && $this->_logo_url = $config['logo_url'];
isset($config['logo_size']) && $this->_logo_size = $config['logo_size'];
isset($config['title']) && $this->_title = $config['title'];
isset($config['title_content']) && $this->_title_content = $config['title_content'];
}
/**
* 生成二维码
* @param $content 需要写入的内容
* @return array | page input
*/
public function create($content) {
$this->_qr = new QrCode($content);
$this->_qr->setSize($this->_size);
$this->_qr->setWriterByName(self::WRITE_NAME);
$this->_qr->setMargin(self::MARGIN);
$this->_qr->setEncoding($this->_encoding);
$this->_qr->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH);
$this->_qr->setForegroundColor(self::FOREGROUND_COLOR);
$this->_qr->setBackgroundColor(self::BACKGROUND_COLOR);
if ($this->_title) {
$this->_qr->setLabel($this->_title_content, 16, '字体地址', LabelAlignment::CENTER);
}
if ($this->_logo) {
$this->_qr->setLogoPath($this->_logo_url);
$this->_qr->setLogoWidth($this->_logo_size);
$this->_qr->setRoundBlockSize(true);
}
$this->_qr->setValidateResult(false);
if ($this->_generate == 'display') {
// 前端调用 例:<img src="http://localhost/qr.php?url=base64_url_string">
header('Content-Type: ' . $this->_qr->getContentType());
return $this->_qr->writeString();
} else if ($this->_generate == 'writefile') {
return $this->_qr->writeString();
} else {
return ['success' => false, 'message' => 'the generate type not found', 'data' => ''];
}
}
/**
* 生成文件
* @param $file_name 目录文件 例: /tmp
* @return array
*/
public function generateImg($file_name) {
$file_path = $file_name . DS . uniqid() . '.' . self::WRITE_NAME;
if (!file_exists($file_name)) {
mkdir($file_name, 0777, true);
}
try {
$this->_qr->writeFile($file_path);
$data = [
'url' => $file_path,
'ext' => self::WRITE_NAME,
];
return ['success' => true, 'message' => 'write qrimg success', 'data' => $data];
} catch (Exception $e) {
return ['success' => false, 'message' => $e->getMessage(), 'data' => ''];
}
}
}
Инструкции:
use '命名空间';
$qr_url = 'http://www.baidu.com?id=' . rand(1000, 9999);
$file_name = '/tmp';
// 直接输出
$qr_code = new QrcodeComponent();
$qr_img = qr_code->create($qr_url);
echo $qr_img;
// 生成文件
$config = [
'generate' => 'writefile',
];
$qr_code = new QrcodeComponent($config);
$qr_img = $qr_code->create($qr_url);
$rs = $qr_code->generateImg($file_name);
print_r($rs);
Объяснение общих параметров:
setSize
- Размер QR-кода в пикселяхsetWriterByName
- Суффикс записываемого файлаsetMargin
- Содержимое QR-кода относится к внешнему полю всего изображения.setEncoding
- тип кодированияsetErrorCorrectionLevel
- Уровень отказоустойчивости, разделенный на четыре уровня: L, M, Q, HsetForegroundColor
-
цвет переднего планаsetBackgroundColor
- фоновый цветsetLabel
- Этикетка с QR-кодомsetLogoPath
- Путь к логотипу QR-кодаsetLogoWidth
- Размер логотипа QR-кода в px