Генератор QR-кодов на Kotlin: библиотека ZXing и советы по реализации

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Генератор 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)

Для добавления логотипа

Рекомендаций