Создайте 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