Система QR-кодов стала очень популярной по всему миру, и может применяться в различных сферах промышленности. Возможность быстрого считывания информации оптическим методом послужила главной причиной его популярности. Даже по сравнению с традиционными штрихкодами стандарта UPC которые могут содержать менее ёмкую информацию по сравнению с QR. В данном посту вы рассмотрим возможность генерации QR-кодов на PHP.
Для генерации QR-кодов удобно использовать сторонние библиотеки, которые позволяют внедрять их в различные проекты. Одной из популярных библиотек для генерации QR-кодов является «PHP QR Code». Для работы с этой библиотекой в PHP нам так же потребуется библиотека GD, которая как правило бывает уже установлена по умолчанию на сервере.
Перед началом работы с библиотекой, скачиваем её в директорию своего проекта. Далее можем приступать к работе с ней.
Генерировать QR-коды довольно просто, достаточно подключить библиотеку, а затем обратиться к методу QRcode::png(). Созданный QR-можно сохранять в файл, либо выводить его в браузер.
Сохранение QR-кода в файл
require_once __DIR__ . '/phpqrcode/qrlib.php'; QRcode::png('https://href.kz/', __DIR__ . '/href-qr.png');
Вывод QR-кода в браузер
require_once __DIR__ . '/phpqrcode/qrlib.php'; QRcode::png('https://href.kz/');
Первый параметр – это строка которую следует записать в QR-код. Второй параметр — это путь для сохранения файла. Как вы можете заметить, отличие этих двух простых примеров в том, что в первом случае мы указываем путь к файлу для сохранения, а во втором лишь саму исходную строку.
В самом деле количество параметров, которые могут быть переданы методу гораздо больше. Давайте подробнее рассмотрим их назначение.
Синтаксис:
QRcode::png($text, $outfile, $level, $size, $margin, $saveandprint);
$text – строка для кодирования;
$outfile – путь для сохранения файла, по умолчанию false – будет вывод в браузер;
$level – уровень коррекции ошибок (L – низкий, по умолчанию, M – средний, Q – Четверть, H – Высокий);
$size – размер «точки», по умолчанию 3px;
$margin – отступ от краёв, указывается в единицах, как и в $size;
$saveandprint – если true, то одновременно будет сохранён в файл и показан в браузере.
Вот ещё одна интересная особенность использования QR кодов – это специальные ссылки для приложений в мобильных устройствах. Мы можем закодировать в QR данные, которые сообщат мобильному устройству открыть приложение и сообщить им какие-либо данные, например, такие как контактный номер телефона.
Набор номера телефона из QR
$text = 'tel:+7707xxxxxxx'; QRcode::png($text);
Форма отправки SMS на номер из QR
$text = 'sms:+7707xxxxxxx'; QRcode::png($text);
Добавление нового контакта из QR
$name = 'Отдел продаж'; $phone = '+7707xxxxxxx'; $text = 'BEGIN:VCARD' . "\n"; $text .= 'FN:' . $name . "\n"; $text .= 'TEL;WORK;VOICE:' . $phone . "\n"; $text .= 'END:VCARD'; QRcode::png($text);
Открытие почтового клиента Email из QR
$text = 'mailto:mail@example.com?subject=Тема для письма'; QRcode::png($text);
Отправка сообщения по WhatsApp
$text = 'whatsapp://send?phone=+7707xxxxxxx'; QRcode::png($text);
Дозвон по Skype
$text = 'skype://логин_контакта?call'; QRcode::png($text);
Конечно привести все примеры, которые могут сработать в мобильном приложении невозможно. Но понимая принцип формирования подобных ссылок вы можете добавлять данные и для других приложений. Теперь поговорим о том, как можно настраивать внешний вид QR-кода.
Что касается внешнего вида QR-кода, то мы можем изменять цвет фона, либо делать его прозрачным, а также менять цвет пикселей. Кроме того, есть возможность добавить в центре свой логотип. Для изменения фона изображения мы дополнительно будем использовать функции библиотеки GD.
Задаём цвет фона для QR-кода
require_once __DIR__ . '/phpqrcode/qrlib.php'; // сохраняем во временный файл QRcode::png('Содержимое QR-кода', __DIR__ . '/tmp.png', 'M', 6, 2); // создаём новое изображение из внеменного файла $im = imagecreatefrompng(__DIR__ . '/tmp.png'); $width = imagesx($im); $height = imagesy($im); // создаём цвет для изображения в RGB $bg_color = imageColorAllocate($im, 120, 100, 60); 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);
Прозрачный фон для QR-кода
Иногда бывает нужно накладывать QR-код на какой-либо другой фон, для этих задач удобно использовать прозрачный фон. Т.к. изображение мы генерируем в формате PNG, то задать прозрачный фон в PHP не так сложно.
require_once __DIR__ . '/phpqrcode/qrlib.php'; // сохраняем во временный файл QRcode::png('Содержимое QR-кода', __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);
Изменение цвета самого QR-кода
В примерах выше мы меняли цвет фона, а также делали его прозрачным. Кроме самого фона мы можем так же менять цвет самого QR-кода. Делается это аналогичным образом с небольшим отличием в коде.
require_once __DIR__ . '/phpqrcode/qrlib.php'; // сохраняем во временный файл QRcode::png('Содержимое QR-кода', __DIR__ . '/tmp.png', 'M', 6, 2); // создаём новое изображение из внеменного файла $im = imagecreatefrompng(__DIR__ . '/tmp.png'); $width = imagesx($im); $height = imagesy($im); // создаём цвет для изображения $fg_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 == 1) { imageSetPixel($im, $x, $y, $fg_color); } } } // вывод изображения в браузер header('Content-Type: image/x-png'); imagepng($im);
Добавляем логотип в QR-код
Для некоторых задач иногда требуется добавить в QR-код свой логотип, сделаем его тем самым более уникальным. С технической точки зрения, делать этого конечно не желательно, т.к. закрывая какую-то часть кода логотипом, мы усложняем его чтение. Однако, сделать это вполне реально, с учётом того, что его придётся генерировать с максимальным уровнем коррекции ошибок, дабы не потерять читаемость кода.
require_once __DIR__ . '/phpqrcode/qrlib.php'; // сохраняем во временный файл QRcode::png('Содержимое QR-кода', __DIR__ . '/tmp.png', 'H', 6, 2); // создаём новое изображение из внеменного файла $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);
Есть небольшие нюансы в коде. Т.к. библиотека генерирует файл в формате PNG-8, при склейке QR-кода и лого мы могли бы получить потерю цветов у логотипа. По этой причине, в примере PNG8 преобразуется в PNG24 чтобы избежать потери качества.