diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml index 021c74ddc0..ba5c87c782 100644 --- a/spring-boot-modules/spring-boot-libraries/pom.xml +++ b/spring-boot-modules/spring-boot-libraries/pom.xml @@ -131,6 +131,11 @@ jcache ${caffeine.version} + + io.nayuki + qrcodegen + ${qrcodegen.version} + @@ -239,6 +244,7 @@ 8.9.0 0.10.3 3.1.8 + 1.8.0 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/BarcodesController.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/BarcodesController.java index a1318c0519..8942e93d8b 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/BarcodesController.java +++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/BarcodesController.java @@ -5,6 +5,7 @@ import com.baeldung.barcodes.generators.Barcode4jBarcodeGenerator; import com.baeldung.barcodes.generators.QRGenBarcodeGenerator; import com.baeldung.barcodes.generators.ZxingBarcodeGenerator; import com.baeldung.barcodes.generators.ZxingBarcodeGeneratorWithText; +import com.baeldung.barcodes.generators.QRCodegenGenerator; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -108,4 +109,10 @@ public class BarcodesController { private ResponseEntity okResponse(BufferedImage image) { return new ResponseEntity<>(image, HttpStatus.OK); } + + //QRCodegen + @PostMapping(value = "/qrcodegen/qrcode", produces = MediaType.IMAGE_PNG_VALUE) + public ResponseEntity qrcodegenQRCode(@RequestBody String barcode) throws Exception { + return okResponse(QRCodegenGenerator.generateQrcode(barcode)); + } } diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/QRCodegenGenerator.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/QRCodegenGenerator.java new file mode 100644 index 0000000000..55f7d0bc77 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/barcodes/generators/QRCodegenGenerator.java @@ -0,0 +1,36 @@ +package com.baeldung.barcodes.generators; + +import io.nayuki.qrcodegen.QrCode; + +import java.awt.image.BufferedImage; +import java.util.Objects; + +public class QRCodegenGenerator { + + public static BufferedImage generateQrcode(String barcodeText) throws Exception { + QrCode qrCode = QrCode.encodeText(barcodeText, QrCode.Ecc.MEDIUM); + BufferedImage img = toImage(qrCode, 4, 10); + return img; + } + + public static BufferedImage toImage(QrCode qr, int scale, int border) { + return toImage(qr, scale, border, 0xFFFFFF, 0x000000); + } + + private static BufferedImage toImage(QrCode qr, int scale, int border, int lightColor, int darkColor) { + Objects.requireNonNull(qr); + if (scale <= 0 || border < 0) + throw new IllegalArgumentException("Value out of range"); + if (border > Integer.MAX_VALUE / 2 || qr.size + border * 2L > Integer.MAX_VALUE / scale) + throw new IllegalArgumentException("Scale or border too large"); + + BufferedImage result = new BufferedImage((qr.size + border * 2) * scale, (qr.size + border * 2) * scale, BufferedImage.TYPE_INT_RGB); + for (int y = 0; y < result.getHeight(); y++) { + for (int x = 0; x < result.getWidth(); x++) { + boolean color = qr.getModule(x / scale - border, y / scale - border); + result.setRGB(x, y, color ? darkColor : lightColor); + } + } + return result; + } +}