Вопрос генерации QR-кодов в PHP достаточно освещён, есть много библиотек, одной из них является «PHP QR Code» – быстрый и легкий класс, рассмотрим его применение совместно с графической библиотекой GD.
Быстрый старт
Вывод в браузер:
Сохранение в файл:
require_once __DIR__ . '/phpqrcode/qrlib.php';
QRcode::png('https://snipp.ru/', __DIR__ . '/qr.png');
Описание параметров
$text
– текст, который будет закодирован в изображении.
$outfile
– куда сохранить файл, false
– вывести в браузер.
$level
– уровень коррекции ошибок:
Значение | Уровень | Процент восстановления |
---|---|---|
L |
Низкий (по умолчанию) | 7% |
M |
Средний | 15% |
Q |
Четверть | 25% |
H |
Высокий | 30% |
$size
– размер «пикселя», по умолчанию 3px.
$margin
– отступ от краев, задаётся в единицах, указанных в $size
.
$saveandprint
– если true
, то изображение одновременно сохранится в файле $outfile
и выведется в браузер.
Для мобильных устройств, в данных можно использовать «протоколы приложений», тем самым при распознавании QR-кода сразу открыть нужное приложение, например набрать телефонный номер, написать письмо, открыть диалог в WhatsApp или Viber и т.д.
Набрать номер телефона:
Написать SMS:
Добавить контакт:
$name = 'Иван Иванов';
$phone = '+7903xxxxxxx';
$text = 'BEGIN:VCARD' . "\n";
$text .= 'FN:' . $name . "\n";
$text .= 'TEL;WORK;VOICE:' . $phone . "\n";
$text .= 'END:VCARD';
QRcode::png($text);
Email:
Мессенджеры:
Подробнее о протоколах в статье «Ссылки на мессенджеры с сайта».
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);
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);
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);
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);
Если у 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 QR Code»:
t0k4rt/phpqrcode
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);
chillerlan/php-qrcode
https://github.com/chillerlan/php-qrcode
PHP-библиотека на основе реализации, требуется PHP 7.4+ и Composer.
и просто вставляете это в страницу стандартным образом: