Генератор QR-кодов на Kotlin с помощью ZXing
QR-коды (Quick Response) стали неотъемлемой частью современного цифрового мира. Они используются для быстрого обмена ссылками, контактными данными, Wi-Fi паролями и другой информацией. Если вы разрабатываете приложение на Kotlin — будь то для Android, серверной части (Ktor, Spring) или десктопа (Compose Desktop) — вам может потребоваться встроить функционал генерации QR-кодов. В этой статье мы рассмотрим, как создать простой и эффективный генератор QR-кодов на Kotlin, используя популярную библиотеку ZXing (Zebra Crossing).
Почему ZXing?
ZXing — это многофункциональная библиотека для чтения и записи штрих-кодов и QR-кодов. Она написана на Java, что делает её идеально совместимой с Kotlin. Основные преимущества:
- Поддержка различных форматов: QR-код, Data Matrix, Aztec, PDF417 и другие.
- Высокая производительность и настраиваемость.
- Активное сообщество и регулярные обновления.
- Простота интеграции в проекты Kotlin.
Подключение библиотеки
Для начала добавьте зависимость в ваш build.gradle.kts (если вы используете Gradle):
dependencies {
implementation("com.google.zxing:core:3.5.3")
implementation("com.google.zxing:javase:3.5.3") // для работы с BufferedImage
}
Если вы пишете серверное приложение на Ktor или Spring, эти зависимости подойдут. Для Android можно использовать модуль android-core, но в большинстве случаев достаточно core.
Базовый генератор QR-кода
Создадим класс QRCodeGenerator, который будет принимать текст и возвращать изображение QR-кода в виде BufferedImage.
import com.google.zxing.BarcodeFormat
import com.google.zxing.EncodeHintType
import com.google.zxing.qrcode.QRCodeWriter
import com.google.zxing.common.BitMatrix
import java.awt.image.BufferedImage
import java.util.*
class QRCodeGenerator {
fun generateQRCode(text: String, width: Int = 300, height: Int = 300): BufferedImage {
// Настройка кодировки и уровня коррекции ошибок
val hints = EnumMap<EncodeHintType, Any>(EncodeHintType::class.java).apply {
put(EncodeHintType.CHARACTER_SET, "UTF-8")
put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H) // High
put(EncodeHintType.MARGIN, 1) // Отступы вокруг QR-кода
}
val writer = QRCodeWriter()
val bitMatrix: BitMatrix = writer.encode(text, BarcodeFormat.QR_CODE, width, height, hints)
// Преобразование BitMatrix в BufferedImage
val image = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
for (x in 0 until width) {
for (y in 0 until height) {
image.setRGB(x, y, if (bitMatrix.get(x, y)) 0xFF000000.toInt() else 0xFFFFFFFF.toInt())
}
}
return image
}
}
Объяснение:
QRCodeWriter— класс ZXing, отвечающий за создание матрицы точек.BitMatrix— бинарная матрица, гдеtrueозначает черный пиксель.- Мы задаем кодировку UTF-8 и максимальный уровень коррекции ошибок (H — 30% повреждений).
- Изображение сохраняется в формате ARGB с черно-белой цветовой схемой.
Сохранение в файл (PNG)
Чтобы сохранить сгенерированный QR-код в файл, используйте javax.imageio.ImageIO:
import java.io.File
import javax.imageio.ImageIO
fun saveQRCodeToFile(text: String, filePath: String) {
val generator = QRCodeGenerator()
val image = generator.generateQRCode(text)
val outputFile = File(filePath)
ImageIO.write(image, "png", outputFile)
println("QR-код сохранен: ${outputFile.absolutePath}")
}
// Пример использования
fun main() {
saveQRCodeToFile("https://pythonlib.ru", "qrcode_pythonlib.png")
}
Дополнительные настройки
Вы можете изменить цвет QR-кода, добавить логотип или настроить размер. Например, для создания цветного QR-кода замените значения RGB:
val color = 0xFFFF5722.toInt() // Оранжевый
val backgroundColor = 0xFFFFFFFF.toInt() // Белый
image.setRGB(x, y, if (bitMatrix.get(x, y)) color else backgroundColor)
Для добавления логотипа
Также в библиотеке
Обработка изображений на C++: библиотеки CImg, OpenCV и stb_image
Работа с Excel в JavaScript (Node.js): библиотеки и примеры кода
Работа с изображениями в Swift: полное руководство для iOS и macOS
JWT токены в Go (Golang): библиотека golang-jwt и примеры использования