Генерация 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 и выведется в браузер.

Для мобильных устройств, в данных можно использовать «протоколы приложений», тем самым при распознавании 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
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
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
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
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

Если у 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

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

t0k4rt/phpqrcode

https://github.com/t0k4rt/phpqrcode

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

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

chillerlan/php-qrcode

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

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

08.04.2020, обновлено 03.02.2021
29504

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

Владимир Кулаксизов Владимир Кулаксизов
27 января 2021 в 18:52
0
Все бы ничего, да он не воспринимает кириллицу. Как с этим быть? Если русские символы он просто знаки вопросов ставит.
Snipp.ru Snipp.ru
3 февраля 2021 в 16:44
0
Библиотека кириллицу поддерживает, скорее всего не настроена кодировка (должна быть UTF-8).
Abu Bakr Abu Bakr
9 марта 2021 в 07:27
0
а как сделать url? а то на телефоне "копировать текст" написано

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

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

Как вывести штрих-код на сайте
Чтобы вывести штрих-код на сайте или при печати достаточно подключить специальный шрифт. Но среди большого количества нужно выбрать именно тот шрифт, который успешно будет считываться сканером...
5244
+1
Печать HTML страниц
Очень часто разработчики забывают про печатную версию сайта, поэтому можно встретить такой результат на бумаге...
26781
+6
Мануал по созданию и форматированию excel файлов в PHPExcel
К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной...
68391
+22
Изображения WebP в GD PHP
WebP – формат сжатия изображений, разработанный Google. Имеет более меньший размер файла по сравнению с JPG, но не поддерживается продуктами Apple.
11597
+5
PHP-класс для создания миниатюр изображений
PHP Thumb – это библиотека, основанная на PHP GD и предназначена для создания превью изображений для каталогов, товаров...
25944
+6
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
39832
+25