Skip to content

Styled QR & Barcode generation library for Compose Multiplatform and Jetpack Compose

License

Notifications You must be signed in to change notification settings

alexzhirkevich/qrose

Repository files navigation

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?

  • Lightweight - doesn't contain any dependencies except of compose.ui;
  • Flexible - high customization ability that is open for extension;
  • Efficient - declare and render codes synchronously right from the composition in 60+ fps;
  • Scalable - no raster bitmaps, only scalable vector graphics;
  • Multiplatform - supports all the targets supported by Compose Multiplatform.
  • Multiformat - multiple formats supported: QR, UPC, EAN, Code 128/93/39, Codabar, ITF.

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 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)