О web-разработке
и даже немного больше...

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

Система QR-кодов стала очень популярной по всему миру, и может применяться в различных сферах промышленности. Возможность быстрого считывания информации оптическим методом послужила главной причиной его популярности. Даже по сравнению с традиционными штрихкодами стандарта UPC которые могут содержать менее ёмкую информацию по сравнению с QR. В данном посту вы рассмотрим возможность генерации QR-кодов на PHP.

Что требуется для генерации QR

Для генерации 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 данные, которые сообщат мобильному устройству открыть приложение и сообщить им какие-либо данные, например, такие как контактный номер телефона.

Набор номера телефона из 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-кода

Что касается внешнего вида 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 чтобы избежать потери качества.

Опубликован: 06.02.2021 г.

См. также:

Редакторы кода для PHP
Как просмотреть время загрузки страницы в PHP?
Загрузка файлов на сервер посредством Ajax
Импорт записей из Excel в WordPress
Парсинг XML в PHP
Установка IonCube на XAMPP
Создание PDF файлов в PHP
Как сделать мобильную версию сайта на Битрикс?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта