
Lightweight, flexible barcode generation library supporting multiple formats like QR, UPC, and EAN. Offers high customization, scalable vector graphics, and export to PNG, JPEG, and WEBP formats.
QR code and barcode generation library for Compose Multiplatform
Why QRose?
compose.ui.QR, Data Matrix, Aztec, PDF417, UPC, EAN, Code 128/93/39, Codabar, ITF.[versions]
qrose="<version>"
[libraries]
# For QR codes
qrose-qr = { module = "io.github.alexzhirkevich:qrose", version.ref = "qrose" }
# For 2D matrix & stacked codes (Data Matrix, Aztec, PDF417)
qrose-matrix = { module = "io.github.alexzhirkevich:qrose-matrix", version.ref = "qrose" }
# For single-dimension barcodes (UPC, EAN, Code128, ...)
qrose-oned = { module = "io.github.alexzhirkevich:qrose-oned", version.ref = "qrose" }Encoder modules do additionally support all K/native targets and Node
# For matrix encoders without Compose (optional, included in qrose-matrix)
qrose-encoder-matrix = { module = "io.github.alexzhirkevich:qrose-encoder-matrix", version.ref = "qrose" }
# For barcode encoders without Compose (optional, included in qrose-oned)
qrose-encoder-oned = { module = "io.github.alexzhirkevich:qrose-encoder-oned", version.ref = "qrose" }You can create code right in composition using rememberQrCodePainter, rememberDataMatrixPainter, rememberAztecPainter, rememberPdf417Painter, rememberBarcodePainter.
Or use QrCodePainter, DataMatrixPainter, AztecPainter, Pdf417Painter, BarcodePainter to create it outside of Compose.
Image(
painter = rememberQrCodePainter("https://example.com"),
contentDescription = "QR code referring to the example.com website"
)
Image(
painter = rememberDataMatrixPainter("https://example.com"),
contentDescription = "Data Matrix code"
)
Image(
painter = rememberAztecPainter("https://example.com"),
contentDescription = "Aztec code"
)
Image(
painter = rememberPdf417Painter("https://example.com"),
contentDescription = "PDF417 barcode"
)
Image(
painter = rememberBarcodePainter("9780201379624", BarcodeType.EAN13),
contentDescription = "EAN barcode for some product"
)QR codes have flexible styling options, for example:
val qrcodePainter = rememberQrCodePainter(
data = "https://example.com",
ballShape = QrBallShape.circle(),
darkPixelShape = QrPixelShape.roundCorners(),
frameShape = QrFrameShape.roundCorners(.25f),
darkBrush = QrBrush.brush {
Brush.linearGradient(
0f to Color.Red,
1f to Color.Blue,
end = Offset(it, it)
)
},
frameBrush = QrBrush.solid(Color.Black),
logoPainter = rememberQrCodePainter("123"),
logoPadding = QrLogoPadding.Natural(.1f),
logoShape = QrLogoShape.circle(),
logoSize = 0.2f,
)Or with DSL constructor:
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)
}
}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.EvenOddthat cannot be changed.
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)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)Using qrose-encoder-matrix and qrose-encoder-oned modules you can get barcode bit
matrices/arrays without Compose graphical implementation.
The QroseEncoders object is used as an encoder factory for all types of codes.
You can create encoders using the extension functions, for example:
/**
* Creates a [MatrixCodeEncoder] that generates QR codes.
*/
fun QroseEncoders.QR(
errorCorrection: QrErrorCorrection = QrErrorCorrection.L,
maskPattern: QrMaskPattern = QrMaskPattern.PATTERN000
) : MatrixCodeEncoder
/**
* Creates a [BarcodeEncoder] that generates Code 128 barcodes.
*/
fun QroseEncoders.Code128(
compact : Boolean = true,
forceCodeSet : Code128Type? = null
) : BarcodeEncoderval encoder : MatrixCodeEncoder = QroseEncoders.QR()
val code : Matrix2D = encoder.encode("https://example.com")QR code and barcode generation library for Compose Multiplatform
Why QRose?
compose.ui.QR, Data Matrix, Aztec, PDF417, UPC, EAN, Code 128/93/39, Codabar, ITF.[versions]
qrose="<version>"
[libraries]
# For QR codes
qrose-qr = { module = "io.github.alexzhirkevich:qrose", version.ref = "qrose" }
# For 2D matrix & stacked codes (Data Matrix, Aztec, PDF417)
qrose-matrix = { module = "io.github.alexzhirkevich:qrose-matrix", version.ref = "qrose" }
# For single-dimension barcodes (UPC, EAN, Code128, ...)
qrose-oned = { module = "io.github.alexzhirkevich:qrose-oned", version.ref = "qrose" }Encoder modules do additionally support all K/native targets and Node
# For matrix encoders without Compose (optional, included in qrose-matrix)
qrose-encoder-matrix = { module = "io.github.alexzhirkevich:qrose-encoder-matrix", version.ref = "qrose" }
# For barcode encoders without Compose (optional, included in qrose-oned)
qrose-encoder-oned = { module = "io.github.alexzhirkevich:qrose-encoder-oned", version.ref = "qrose" }You can create code right in composition using rememberQrCodePainter, rememberDataMatrixPainter, rememberAztecPainter, rememberPdf417Painter, rememberBarcodePainter.
Or use QrCodePainter, DataMatrixPainter, AztecPainter, Pdf417Painter, BarcodePainter to create it outside of Compose.
Image(
painter = rememberQrCodePainter("https://example.com"),
contentDescription = "QR code referring to the example.com website"
)
Image(
painter = rememberDataMatrixPainter("https://example.com"),
contentDescription = "Data Matrix code"
)
Image(
painter = rememberAztecPainter("https://example.com"),
contentDescription = "Aztec code"
)
Image(
painter = rememberPdf417Painter("https://example.com"),
contentDescription = "PDF417 barcode"
)
Image(
painter = rememberBarcodePainter("9780201379624", BarcodeType.EAN13),
contentDescription = "EAN barcode for some product"
)QR codes have flexible styling options, for example:
val qrcodePainter = rememberQrCodePainter(
data = "https://example.com",
ballShape = QrBallShape.circle(),
darkPixelShape = QrPixelShape.roundCorners(),
frameShape = QrFrameShape.roundCorners(.25f),
darkBrush = QrBrush.brush {
Brush.linearGradient(
0f to Color.Red,
1f to Color.Blue,
end = Offset(it, it)
)
},
frameBrush = QrBrush.solid(Color.Black),
logoPainter = rememberQrCodePainter("123"),
logoPadding = QrLogoPadding.Natural(.1f),
logoShape = QrLogoShape.circle(),
logoSize = 0.2f,
)Or with DSL constructor:
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)
}
}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.EvenOddthat cannot be changed.
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)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)Using qrose-encoder-matrix and qrose-encoder-oned modules you can get barcode bit
matrices/arrays without Compose graphical implementation.
The QroseEncoders object is used as an encoder factory for all types of codes.
You can create encoders using the extension functions, for example:
/**
* Creates a [MatrixCodeEncoder] that generates QR codes.
*/
fun QroseEncoders.QR(
errorCorrection: QrErrorCorrection = QrErrorCorrection.L,
maskPattern: QrMaskPattern = QrMaskPattern.PATTERN000
) : MatrixCodeEncoder
/**
* Creates a [BarcodeEncoder] that generates Code 128 barcodes.
*/
fun QroseEncoders.Code128(
compact : Boolean = true,
forceCodeSet : Code128Type? = null
) : BarcodeEncoderval encoder : MatrixCodeEncoder = QroseEncoders.QR()
val code : Matrix2D = encoder.encode("https://example.com")