Исходя из ссылки , на которую вы ссылаетесь, принятый ответ указывает на этот пост , где вы можете увидеть, что хитрость заключается в создании 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);
...
Полученный код все еще читаем.
Вы также можете поиграть с результатом, добавив эффект смешивания к изображениям, например:
overlay.setBlendMode(BlendMode.ADD);
, но это будет зависеть от того, как ваше изображение логотипа сочетается с QR.
НаконецЕсли вам все еще нужно одно объединенное изображение, вы можете создать снимок панели стека:
WritableImage snapshot = combinedQR.snapshot(new SnapshotParameters(), null);