Генерация QR кода с помощью PHP: практические примеры

Раздел: Обработка изображений -> Графика

В современной веб-разработке QR коды часто используются для быстрого обмена ссылками, контактными данными или платежными реквизитами. Реализация генерации QR кода на PHP может быть выполнена разными способами. В этой статье рассматриваются основные подходы, их преимущества и возможные трудности.

Основное эффективное решение

Наиболее стабильным и функциональным вариантом считается использование библиотеки endroid/qr-code. Она поддерживает все современные форматы (PNG, SVG, EPS), гибкую настройку цвета, размера и уровня коррекции ошибок. Установка выполняется через Composer:

composer require endroid/qr-code

Php штрих код (штрих-код на php)

Пример базовой генерации и вывода изображения:

<?php
require 'vendor/autoload.php';

use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
use Endroid\QrCode\Label\LabelAlignment;
use Endroid\QrCode\Label\Font\NotoSans;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;

$builder = new Builder(
    writer: new PngWriter(),
    writerOptions: [],
    validateResult: false,
    data: 'https://example.com',
    encoding: new Encoding('UTF-8'),
    errorCorrectionLevel: new ErrorCorrectionLevelHigh(),
    size: 300,
    margin: 10,
    roundBlockSizeMode: new RoundBlockSizeModeMargin(),
);
$result = $builder->build();
header('Content-Type: '.$result->getMimeType());
echo $result->getString();

Qr кода php (qr код на php)

Код создаёт QR код со ссылкой и выводит его как PNG-картинку. Библиотека автоматически подбирает оптимальную матрицу и корректирует ошибки.

Типичные проблемы и их решение:

  • Ошибка 'Class not found' – забыли выполнить composer install или неправильно указали путь к autoload.php.
  • Изображение не отображается в браузере – проверьте, что перед header нет вывода текста (пробелов, ошибок PHP). Рекомендуется поместить код в отдельный файл без HTML.
  • Слишком большой размер QR кода для tiny URL – используйте уровень коррекции L и минимальный размер (150 пикселей).

Как сгенерировать QR код без установки сторонних библиотек?

Если нет возможности использовать Composer, можно прибегнуть к внешнему API Google Charts. Этот метод требует активного интернет-соединения, но не требует установки.

$url = 'https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=' . urlencode('https://example.com');
header('Content-Type: image/png');
readfile($url);

Скрипт просто перенаправляет поток изображения из Google. Ограничение: размер строки данных ограничен 2 КБ, и сервис может быть недоступен в некоторых регионах.

Возможные ошибки:

  • Белый экран – не включён allow_url_fopen в php.ini. Решение: используйте cURL.
  • Лимит запросов от Google – для массовой генерации лучше использовать локальную библиотеку.

Как создать кастомный QR код с логотипом и настройками?

Библиотека chillerlan/php-qrcode отличается лёгкостью и возможностью добавления изображения-логотипа поверх QR кода. Установка через Composer:

composer require chillerlan/php-qrcode

Пример с логотипом:

<?php
require 'vendor/autoload.php';

use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;

$options = new QROptions([
    'outputType' => QRCode::OUTPUT_IMAGE_PNG,
    'eccLevel' => QRCode::ECC_H,
    'scale' => 5,
    'imageBase64' => false,
    'logoSpaceWidth' => 13,
    'logoSpaceHeight' => 13,
]);

$qrcode = new QRCode($options);
$qrcode->addByteSegment('https://example.com');

// Загружаем логотип
$logo = file_get_contents('logo.png');
$qrcode->setLogo($logo, 'png');

header('Content-type: image/png');
echo $qrcode->render();

Логотип автоматически вставляется в центр, а алгоритм коррекции ошибок компенсирует потерю данных. Важно: размер логотипа не должен превышать 30% от QR кода.

Проблемы при работе с chillerlan:

  • Требуется PHP 7.4+ и расширение GD – проверьте версию и наличие модуля.
  • Неправильное отображение логотипа – убедитесь, что logo.png имеет прозрачный фон или белый цвет вокруг.

Как использовать старую библиотеку phpqrcode без Composer?

Библиотека phpqrcode (доступна на SourceForge) не требует Composer – достаточно подключить один файл. Это legacy-решение, но оно всё ещё работает.

require_once 'phpqrcode/qrlib.php';
$tempDir = 'temp/';
$fileName = 'qr.png';
$data = 'https://example.com';
$errorCorrectionLevel = 'L';
$matrixPointSize = 10;
QRcode::png($data, $tempDir.$fileName, $errorCorrectionLevel, $matrixPointSize, 2);
echo '<img src="'.$tempDir.$fileName.'">';

Функция png() создаёт файл на диске. Недостаток: библиотека не обновляется, не поддерживает логотипы и SVG.

Ошибки:

  • Библиотека выдаёт предупреждения об устаревших функциях в PHP 8 – рекомендуется использовать более современные альтернативы.
  • Отсутствие папки temp – создайте её и дайте права на запись.

Как нарисовать QR код вручную с помощью GD?

Для академического интереса можно попробовать реализовать примитивный QR код с использованием функций GD. Однако это трудоёмко и не рекомендуется для продакшена.

<?php
// Минимальная реализация – только чёрные и белые модули (без алгоритма коррекции)
$size = 21; // версия 1
$pixel = 10;
$im = imagecreatetruecolor($size*$pixel, $size*$pixel);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
imagefill($im, 0, 0, $white);

// массив битов (пример для демонстрации)
$matrix = [/*... 21x21 0/1 ...*/];

for ($y=0; $y<$size; $y++) {
    for ($x=0; $x<$size; $x++) {
        if ($matrix[$y][$x]) {
            imagefilledrectangle($im, $x*$pixel, $y*$pixel, ($x+1)*$pixel-1, ($y+1)*$pixel-1, $black);
        }
    }
}
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);

Этот код не содержит коррекции ошибок и не кодирует данные. Полноценная реализация требует много кода.

Сложности:

  • Ошибки расчёта маски и полиномов – без глубокого понимания стандарта QR код будет нечитаем.
  • Производительность – для версий 40 размер матрицы 177×177, что медленно.

Расширенные примеры использования

Генерация QR кода с разными уровнями коррекции ошибок

Уровень коррекции определяет, сколько данных можно восстановить при повреждении кода. Следующий пример демонстрирует создание четырёх вариантов одного текста:

Пример
$levels = ['L', 'M', 'Q', 'H'];
$data = 'https://example.com';
foreach ($levels as $level) {
    $options = new QROptions([
        'outputType' => QRCode::OUTPUT_IMAGE_PNG,
        'eccLevel' => $level,
        'scale' => 3,
    ]);
    $qrcode = new QRCode($options);
    $qrcode->addByteSegment($data);
    file_put_contents("level_{$level}.png", $qrcode->render());
}
Созданы файлы level_L.png, level_M.png, level_Q.png, level_H.png. Визуально они отличаются плотностью модулей – уровень H требует больше места.

Создание QR кода с встроенным логотипом и прозрачным фоном

Библиотека endroid не поддерживает логотип напрямую, но с помощью GD можно наложить изображение поверх готового QR кода.

Пример
// Генерируем QR код через endroid
$result = $builder->build();
$qrPng = $result->getString();
$qrImg = imagecreatefromstring($qrPng);
// Накладываем логотип
$logo = imagecreatefrompng('logo.png');
$qrWidth = imagesx($qrImg);
$logoWidth = imagesx($logo);
$posX = ($qrWidth - $logoWidth) / 2;
$posY = (imagesy($qrImg) - imagesy($logo)) / 2;
imagecopy($qrImg, $logo, $posX, $posY, 0, 0, $logoWidth, imagesy($logo));
header('Content-Type: image/png');
imagepng($qrImg);
На выходе – QR код с логотипом в центре. Важно: логотип не должен закрывать ключевые области (угловые метки).

Пакетная генерация QR кодов из CSV файла

Полезно при создании купонов или билетов. Предположим CSV со столбцами 'id' и 'url'.

Пример
$csv = fopen('data.csv', 'r');
while (($row = fgetcsv($csv)) !== false) {
    $id = $row[0];
    $url = $row[1];
    $qrcode = new QRCode();
    $qrcode->addByteSegment($url);
    file_put_contents("qr_{$id}.png", $qrcode->render());
}
fclose($csv);
Для каждой строки CSV создаётся отдельный PNG файл с именем qr_1.png, qr_2.png и т.д.

Изменение цвета QR кода и добавление пользовательской метки

Библиотека endroid позволяет задать цвет через цветовые классы. Также можно добавить текстовую метку под кодом.

Пример
use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Label\Label;

$builder = new Builder(
    data: 'https://example.com',
    foregroundColor: new Color(0, 128, 0), // зелёный
    backgroundColor: new Color(255, 255, 255),
    label: new Label('Сканируй меня', null, new Color(0, 0, 0)),
);
$result = $builder->build();
header('Content-Type: '.$result->getMimeType());
echo $result->getString();
QR код отображается зелёными модулями на белом фоне, под ним надпись 'Сканируй меня'.

Генерация QR кода в формате SVG для векторной печати

SVG обеспечивает масштабирование без потери качества. Используем writer SvgWriter из endroid.

Пример
use Endroid\QrCode\Writer\SvgWriter;

$builder = new Builder(
    writer: new SvgWriter(),
    data: 'https://example.com',
    size: 200,
    margin: 0,
);
$result = $builder->build();
file_put_contents('qr.svg', $result->getString());
Получен файл qr.svg, который можно открыть в любом векторном редакторе.

QR код на PHP - comments

En
Qr кода php (php)