addQrCodeAsImage method
QR als Bild. raster true → GS v 0 (imageRaster), false → ESC * (image).
Welcher Befehl funktioniert, hängt vom Drucker ab — daher umschaltbar.
Implementation
Future<void> addQrCodeAsImage(String data, {int size = 280, bool raster = true}) async {
try {
final QrPainter painter = QrPainter(
data: data,
version: QrVersions.auto,
gapless: false,
);
final ByteData? byteData = await painter.toImageData(size.toDouble());
if (byteData == null) {
print('Error: QR ByteData is null');
return;
}
final Uint8List qrBytes = byteData.buffer.asUint8List();
final Image? decoded = decodeImage(qrBytes);
if (decoded == null) {
print('Error decoding QR image');
return;
}
// QrPainter liefert schwarze Module auf TRANSPARENTEM Grund. Der ESC/POS-
// Generator (grayscale + invert) ignoriert den Alpha-Kanal — transparente
// Pixel (RGB 0,0,0, Alpha 0) würden wie Schwarz gedruckt → komplett
// schwarzes Quadrat. Daher auf weißen Hintergrund kompositieren, mit
// weißem Rand als Ruhezone für die Scanner-Lesbarkeit.
const int quietZone = 16;
final Image img = Image(
width: decoded.width + quietZone * 2,
height: decoded.height + quietZone * 2,
);
fill(img, color: ColorRgb8(255, 255, 255));
compositeImage(img, decoded, dstX: quietZone, dstY: quietZone);
bytes.add(Uint8List.fromList(
raster ? generator.imageRaster(img) : generator.image(img),
));
myPosPaper.addImage(encodePng(img));
} catch (e) {
print('Error in addQrCodeAsImage: $e');
}
}