Как сгенерировать qr-код с наложением изображений в Gluon? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу создать QR-код, который должен поместить логотип в центре.Я проверил библиотеку zxing и сделал это с помощью Java-приложения, прочитав этот код ( Как создать QR-код с логотипом внутри? ).Но, как я знаю, мы не можем использовать свинг в Android / IOS.Так как с этим бороться?

1 Ответ

0 голосов
/ 13 февраля 2019

Исходя из ссылки , на которую вы ссылаетесь, принятый ответ указывает на этот пост , где вы можете увидеть, что хитрость заключается в создании QR-кода, который позволяет скрыть его центральную часть, не затрагиваяего читаемость с помощью QR-сканера может быть достигнута путем увеличения ошибки level :

30% (H) коррекции ошибок, если коррекция ошибок уровня H должна приводить кQRCode, который все еще действителен, даже когда он скрыт на 30%

В качестве продолжения этого вопроса , вы можете просто включить подсказку при кодировании текста:

public Image generateQR(int width, int height) {
    File root = Services.get(StorageService.class)
            .flatMap(StorageService::getPrivateStorage)
            .orElseThrow(() -> new RuntimeException("Storage Service not found"));

    String uuid = Services.get(DeviceService.class)
            .map(DeviceService::getUuid)
            .orElse("123456789");

    MultiFormatWriter codeWriter = new MultiFormatWriter();

    // Add maximum correction
    Map<EncodeHintType, ErrorCorrectionLevel> hints = new HashMap<>();
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

    try {
        BarcodeFormat format = BarcodeFormat.QR_CODE;
        BitMatrix bitMatrix = codeWriter.encode(uuid, format, 
               width, height, hints);  // <--- add hints
        ...
        return writableImage;
    }
}

Вы получите изображение QR-кода без наложения.

Следующим шагом будет объединение этого изображения с изображением вашего логотипа без использования Swing.Но на самом деле нам не нужно этого делать: мы можем просто использовать два ImageView узла!

ImageView imageView = new ImageView();
imageView.setFitWidth(256);
imageView.setFitHeight(256);
imageView.setImage(service.generateQR(256, 256));

ImageView overlay = new ImageView(
     new Image(getClass().getResourceAsStream("/icon.png")));
overlay.setFitWidth(80);
overlay.setFitHeight(80);

StackPane combinedQR = new StackPane(imageView, overlay);
...

image

Полученный код все еще читаем.

Вы также можете поиграть с результатом, добавив эффект смешивания к изображениям, например:

overlay.setBlendMode(BlendMode.ADD);

, но это будет зависеть от того, как ваше изображение логотипа сочетается с QR.

НаконецЕсли вам все еще нужно одно объединенное изображение, вы можете создать снимок панели стека:

WritableImage snapshot = combinedQR.snapshot(new SnapshotParameters(), null);
...