alexzhirkevich / qrose

Styled QR & Barcode generation library for Compose Multiplatform and Jetpack Compose
MIT License
264 stars 6 forks source link
compose compose-multiplatform jetpack-compose kotlin kotlin-multiplatform multiplatform qr qr-code qr-code-generator qr-generator qrcode

QRose

badge-Android badge-iOS badge-JVM badge-macOS badge-web

Barcode generation library for Compose Multiplatform

Screenshot 2023-10-10 at 10 34 05

Why QRose?

Installation

Maven Central

dependencies {

    // For QR codes
    implementation("io.github.alexzhirkevich:qrose:<latest_version>")

    // For single-dimension barcodes (UPC,EAN, Code128, ...)
    implementation("io.github.alexzhirkevich:qrose-oned:<latest_version>")
}

Usage

Basic

You can create code right in composition using rememberQrCodePainter, rememberBarcodePainter. Or use QrCodePainter, BarcodePainter to create it outside of Compose.

Image(
    painter = rememberQrCodePainter("https://example.com"),
    contentDescription = "QR code referring to the example.com website"
)

Image(
    painter = rememberBarcodePainter("9780201379624", BarcodeType.EAN13),
    contentDescription = "EAN barcode for some product"
)

Design

QR codes have flexible styling options, for example:

val logoPainter : Painter = painterResource("logo.png")

val qrcodePainter : Painter = rememberQrCodePainter("https://example.com") {
    logo {
        painter = logoPainter
        padding = QrLogoPadding.Natural(.1f)
        shape = QrLogoShape.circle()
        size = 0.2f
    }

    shapes {
        ball = QrBallShape.circle()
        darkPixel = QrPixelShape.roundCorners()
        frame = QrFrameShape.roundCorners(.25f)
    }
    colors {
        dark = QrBrush.brush {
            Brush.linearGradient(
                0f to Color.Red,
                1f to Color.Blue,
                end = Offset(it, it)
            )
        }
        frame = QrBrush.solid(Color.Black)
    }
}

Or just parametrized constructor:

val qrcodePainter = rememberQrCodePainter(
    data = "https://example.com",
    shapes = QrShapes(
        darkPixel = QrPixelShape.roundCorners()
    )
)

Customize

You can create your own shapes for each QR code part, for example:

class MyCircleBallShape : QrBallShape {

    override fun Path.path(size: Float, neighbors: Neighbors): Path = apply {
        addOval(Rect(0f,0f, size, size))
    }
}

Note A path here uses [PathFillType.EvenOdd](https://developer.android.com/reference/kotlin/androidx/compose/ui/graphics/PathFillType#EvenOdd()) that cannot be changed.

Data types

QR codes can hold various payload types: Text, Wi-Fi, E-mail, vCard, etc.

QrData object can be used to perform such encodings, for example:

val wifiData : String = QrData.wifi(ssid = "My Network", psk = "12345678")

val wifiCode = rememberQrCodePainter(wifiData)

Export

QR codes can be exported to PNG, JPEG and WEBP formats using toByteArray function:


val painter : Painter = QrCodePainter(
    data = "https://example.com",
    options =  QrOptions { 
        colors {
            //...
        }
    }
)

val bytes : ByteArray = painter.toByteArray(1024, 1024, ImageFormat.PNG)