Генерация QR-кода в PHP

Вопрос генерации QR-кодов в PHP достаточно освещён, есть много библиотек, одной из них является «PHP QR Code» – быстрый и легкий класс, рассмотрим его применение совместно с графической библиотекой GD.

Вывод в браузер:

require_once __DIR__ . '/phpqrcode/qrlib.php';
QRcode::png('https://snipp.ru/');
PHP

Сохранение в файл:

require_once __DIR__ . '/phpqrcode/qrlib.php';
QRcode::png('https://snipp.ru/', __DIR__ . '/qr.png');
PHP
Сгенерированный QR-код с базовыми настройками
QRcode::png($text, $outfile, $level, $size, $margin, $saveandprint);
PHP

$text – текст, который будет закодирован в изображении.

$outfile – куда сохранить файл, false – вывести в браузер.

$level – уровень коррекции ошибок:

Значение Уровень Процент восстановления
L Низкий (по умолчанию) 7%
M Средний 15%
Q Четверть 25%
H Высокий 30%
L
Уровень коррекции ошибок - L
M
Уровень коррекции ошибок - M
Q
Уровень коррекции ошибок - Q
H
Уровень коррекции ошибок - H

$size – размер «пикселя», по умолчанию 3px.

4px
Размер «пикселя» - 4px
6px
Размер «пикселя» - 6px
8px
Размер «пикселя» - 8px

$margin – отступ от краев, задаётся в единицах, указанных в $size.

$saveandprint – если true, то изображение одновременно сохранится в файле $outfile и выведется в браузер.

1

Для мобильных устройств, в данных можно использовать «протоколы приложений», тем самым при распознавании QR-кода сразу открыть нужное приложение, например набрать телефонный номер, написать письмо, открыть диалог в WhatsApp или Viber и т.д.

Набрать номер телефона:

$text = 'tel:+7903xxxxxxx';
QRcode::png($text);
PHP

Написать SMS:

$text = 'sms:+7903xxxxxxx';
QRcode::png($text);
PHP

Добавить контакт:

$name = 'Иван Иванов';
$phone = '+7903xxxxxxx';
	
$text  = 'BEGIN:VCARD' . "\n";
$text .= 'FN:' . $name . "\n";
$text .= 'TEL;WORK;VOICE:' . $phone . "\n";
$text .= 'END:VCARD';

QRcode::png($text);
PHP

Email:

$text = 'mailto:mail@example.com?subject=Тема письма';
QRcode::png($text);
PHP

Мессенджеры:

Подробнее о протоколах в статье «Ссылки на мессенджеры с сайта».

/* WhatsApp */
$text = 'whatsapp://send?phone=+7903xxxxxxx';
QRcode::png($text);

/* Viber */
$text = 'viber://chat?number=+7903xxxxxxx';
QRcode::png($text);

/* Skype */
$text = 'skype://логин?call';
QRcode::png($text);
PHP
2
require_once __DIR__ . '/phpqrcode/qrlib.php';

/* Генерация QR-кода во временный файл */
QRcode::png('QR-код сгенерированный в PHP', __DIR__ . '/tmp.png', 'M', 6, 2);

/* Замена белых пикселей на прозрачный */
$im = imagecreatefrompng(__DIR__ . '/tmp.png');
$width = imagesx($im);
$height = imagesy($im);

$bg_color = imageColorAllocate($im, 0, 0, 0);
imagecolortransparent ($im, $bg_color);

for ($x = 0; $x < $width; $x++) {
	for ($y = 0; $y < $height; $y++) {
		$color = imagecolorat($im, $x, $y);
		if ($color == 0) {
			imageSetPixel($im, $x, $y, $bg_color);
		}
	}
}

/* Вывод в браузер */
header('Content-Type: image/x-png');
imagepng($im);
PHP
3
require_once __DIR__ . '/phpqrcode/qrlib.php';

/* Генерация QR-кода во временный файл */
QRcode::png('QR-код сгенерированный в PHP - Snipp.ru', __DIR__ . '/tmp.png', 'M', 6, 2);

$im = imagecreatefrompng(__DIR__ . '/tmp.png');
$width = imagesx($im);
$height = imagesy($im);

/* Цвет фона в RGB */
$bg_color = imageColorAllocate($im, 255, 145, 43);

for ($x = 0; $x < $width; $x++) {
	for ($y = 0; $y < $height; $y++) {
		$color = imagecolorat($im, $x, $y);
		if ($color == 0) {
			imageSetPixel($im, $x, $y, $bg_color);
		}
	}
}

/* Вывод в браузер */
header('Content-Type: image/x-png');
imagepng($im);
PHP
4
require_once __DIR__ . '/phpqrcode/qrlib.php';

/* Генерация QR-кода во временный файл */
QRcode::png('QR-код сгенерированный в PHP - Snipp.ru', __DIR__ . '/tmp.png', 'M', 6, 2);

$im = imagecreatefrompng(__DIR__ . '/tmp.png');
$width = imagesx($im);
$height = imagesy($im);

/* Цвет в RGB */
$fg_color = imageColorAllocate($im, 0, 133, 178);

for ($x = 0; $x < $width; $x++) {
	for ($y = 0; $y < $height; $y++) {
		$color = imagecolorat($im, $x, $y);
		if ($color == 1) {
			imageSetPixel($im, $x, $y, $fg_color);
		}
	}
}

/* Вывод в браузер */
header('Content-Type: image/x-png');
imagepng($im);
PHP
5
require_once __DIR__ . '/phpqrcode/qrlib.php';

/* Генерация QR-кода во временный файл */
QRcode::png('QR-код сгенерированный в PHP - Snipp.ru', __DIR__ . '/tmp.png', 'M', 6, 2);

$im = imagecreatefrompng(__DIR__ . '/tmp.png');
imagefilter($im, IMG_FILTER_NEGATE);

/* Вывод в браузер */
header('Content-Type: image/x-png');
imagepng($im);
PHP
6

Если у QR-кода поднять уровень коррекции ошибок до максимального, то можно спокойно вставить логотип без потери читаемости.

Phpqrcode генерирует изображение в формате PNG-8, поэтому потребуется преобразовать его в PNG-24, чтобы избежать потерю цветов у логотипа.

require_once __DIR__ . '/phpqrcode/qrlib.php';

/* Генерация QR-кода во временный файл */
QRcode::png('QR-код сгенерированный в PHP - Snipp.ru', __DIR__ . '/tmp.png', 'H', 6, 2);


/* Конвертация PNG8 в PNG24 */
$im = imagecreatefrompng(__DIR__ . '/tmp.png');

$width = imagesx($im);
$height = imagesy($im);

$dst = imagecreatetruecolor($width, $height);
imagecopy($dst, $im, 0, 0, 0, 0, $width, $height);
imagedestroy($im);

/* Наложение логотипа */
$logo = imagecreatefrompng(__DIR__ . '/logo.png');
$logo_width = imagesx($logo);
$logo_height = imagesy($logo);

$new_width = $width / 3;
$new_height = $logo_height / ($logo_width / $new_width);

$x = ceil(($width - $new_width) / 2);
$y = ceil(($height - $new_height) / 2);

imagecopyresampled($dst, $logo, $x, $y, 0, 0, $new_width, $new_height, $logo_width, $logo_height);

/* Вывод в браузер */
header('Content-Type: image/x-png');
imagepng($dst);
PHP
7

Пример работы библиотеки «PHP QR Code»:

8

https://github.com/t0k4rt/phpqrcode

Улучшенная версия «PHP QR Code» с возможностью задать цвета пикселей и фона.

$back_color = 0xFFFF00;
$fore_color = 0xFF00FF;
QRcode::png('Example text', false, 'h', 20, 1, false, $back_color, $fore_color);
PHP

https://github.com/chillerlan/php-qrcode

PHP-библиотека на основе реализации, требуется PHP 7.4+ и Composer.

$data = 'Example text';
echo '<img src="'.(new QRCode)->render($data).'" alt="QR Code" />';
PHP
08.04.2020, обновлено 11.03.2024
74130

Комментарии 9

Владимир Кулаксизов Владимир Кулаксизов
27 января 2021 в 18:52
Все бы ничего, да он не воспринимает кириллицу. Как с этим быть? Если русские символы он просто знаки вопросов ставит.
Snipp.ru Snipp.ru
3 февраля 2021 в 16:44
Библиотека кириллицу поддерживает, скорее всего не настроена кодировка (должна быть UTF-8).
Артем Сергеевич Артем Сергеевич
12 сентября 2023 в 07:33
$name = 'Тестов Тест Тестович';
$phone = '+79001111111';
$email = 'example@example.com';
	
$text  = 'BEGIN:VCARD' . "\n";
$text .= 'FN;CHARSET=UTF-8:' . $name . "\n";
$text .= 'TEL;WORK;VOICE:' . $phone . "\n";
$text .= 'EMAIL:' . $email . "\n";
$text .= 'END:VCARD';
Abu Bakr Abu Bakr
9 марта 2021 в 07:27
а как сделать url? а то на телефоне "копировать текст" написано
Иван Кулагин Иван Кулагин
31 октября 2022 в 21:35
Всем привет! у меня получается лишь белый квадратик 16*16. Подскажите, что не так?
php 5.6
GD Version 2.3.0
Artem Yukhimenko Artem Yukhimenko
6 сентября 2023 в 16:03
Как генерированный штрихкод и вставить в страницу, а то открывает просто страницу с QR кодом.
Артем Сергеевич Артем Сергеевич
12 сентября 2023 в 07:43
Сначала формируете скрипт отдающий QR (либо статичный либо с принимающими извне данными через переменные $_GET, $_POST и.т.д.)
и просто вставляете это в страницу стандартным образом:
<img src="https://www.example.ru/tmp/test/phpqrcode.php">

, чтобы добавить комментарий.

Другие публикации

Как вывести штрих-код на сайте
Чтобы вывести штрих-код на сайте или при печати достаточно подключить специальный шрифт. Но среди большого количества нужно выбрать именно тот шрифт, который успешно будет считываться сканером...
13554
-1
Печать HTML страниц
Очень часто разработчики забывают про печатную версию сайта, поэтому можно встретить такой результат на бумаге...
66500
+9
Мануал по созданию и форматированию excel файлов в PHPExcel
К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной...
141524
+36
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
70975
+35
Изображения WebP в GD PHP
WebP – формат сжатия изображений, разработанный Google. Имеет более меньший размер файла по сравнению с JPG, но не поддерживается продуктами Apple.
20414
+8
Примеры использования cURL в PHP
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
242610
+22