addQrCodeAsImage method

Future<void> addQrCodeAsImage(
  1. String data, {
  2. int size = 280,
  3. bool raster = true,
})

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) {
      if (kDebugMode) print('Error: QR ByteData is null');
      return;
    }

    final Uint8List qrBytes = byteData.buffer.asUint8List();
    final Image? decoded = decodeImage(qrBytes);
    if (decoded == null) {
      if (kDebugMode) 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) {
    if (kDebugMode) print('Error in addQrCodeAsImage: $e');
  }
}