Создайте QR-код с отсутствующим пикселем

Для проекта нас попросили воссоздать тот же QR-код, что и в PDF-файле, который мы получили.

Мне удалось сделать почти то же самое, но я не могу найти решение. Вот QR-код, который нам нужно восстановить (я добавил красные стрелки).

QR-код, который я должен воспроизвести

Вы видите, что почти каждый раз пиксель меньше, а в другом месте больше пикселя. Вот мой QR-код, за исключением того, что я не скучаю по пикселям.

QR-код, который я сгенерировал

Я использую библиотеку boofcv и вот мой код

QrCode qr = new QrCodeEncoder().setError(QrCode.ErrorLevel.M).setMask(QrCodeMaskPattern.M111).setVersion(1).addBytes("E-ALPZNUP").fixate();
    QrCodeGeneratorImage render = new QrCodeGeneratorImage(42);
    render.render(qr);
    BufferedImage buffimage = ConvertBufferedImage.convertTo(render.getGray(),null);

Если у кого-то есть такое же решение с другой библиотекой, я могу его взять.

2 ответа

Я знаю, что не мое дело беспокоиться о том, почему у вас такое требование генерировать точно такой же QR-код, но я предполагаю, что "лишние" и "недостающие" пиксели исходного изображения обусловлены кодировкой изображения в формате JPEG. Я знаю, что это в PNG, но, возможно, после генерации он был закодирован в JPEG, а затем обратно в PNG. Там, где пиксель появляется, нет никакого шаблона, поэтому должно быть что-то случайное или нечеткое, которое добавляет его к первому изображению. В качестве альтернативы, это какая-то подпись, которую они добавляют к оригинальному QR, чтобы идентифицировать, что она была законно сгенерирована определенным органом.

С точки зрения чтения, они оба абсолютно одинаковы, и оба QR-кода будут обеспечивать одинаковый вывод.

Вы можете попробовать Free Spire.Barcode для Java и следующий код:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.spire.barcode.BarCodeGenerator;
import com.spire.barcode.BarCodeType;
import com.spire.barcode.BarcodeSettings;
import com.spire.barcode.QRCodeECL;
import com.sun.javafx.print.Units;

public class QR_Code {

    public static void main(String[] args) throws IOException {

        //create an instance of BarcodeSetteings
        BarcodeSettings settings = new BarcodeSettings();
        //set barcode type
        settings.setType(BarCodeType.QR_CODE);
        //set barcode data
        settings.setData("ABC 123456789");
        //set dispaly text
        settings.setData2D("ABC 123456789");
        //show text on bottom
        settings.setShowTextOnBottom(true);
        //set the border invisible
        settings.hasBorder(false);
        //set width of the barcode module
        settings.setX(2);
        //set the error correction level
        settings.setQRCodeECL(QRCodeECL.M);    
        //create BarCodeGenerator object based on settings
        BarCodeGenerator barCodeGenerator = new BarCodeGenerator(settings);
        //generate image data and store in BufferedImage instance
        BufferedImage bufferedImage = barCodeGenerator.generateImage();
        //save to image
        ImageIO.write(bufferedImage,"png",new File("QR_CODE.png"));
        System.out.println("Complete!");
    }    
}

Копирование кода из Generate QR Code в Java

Другие вопросы по тегам