Sogar durch Setzen von EncodeHintType.MARGIN
auf kann der Algorithmus, der die QRCode "Punkt" -Matrix in Pixeldaten umwandelt, einen kleinen Spielraum erzeugen (der Algorithmus erzwingt eine konstante Anzahl von Pixeln pro Punkt, also ist die Randpixelgröße der Rest von die ganzzahlige Teilung der Pixelgröße durch QR-Code Punktgröße).
Sie können diese "Punkt-zu-Pixel" -Erzeugung jedoch vollständig umgehen: Sie berechnen die QRCode-Punktmatrix direkt, indem Sie die öffentliche Klasse com.google.zxing.qrcode.encoder.Encoder
aufrufen und das Pixelbild selbst generieren. Code unten:
// Step 1 - generate the QRCode dot array
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(1);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
QRCode qrCode = Encoder.encode(what, ErrorCorrectionLevel.L, hints);
// Step 2 - create a BufferedImage out of this array
int width = qrCode.getMatrix().getWidth();
int height = qrCode.getMatrix().getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int[] rgbArray = new int[width * height];
int i = 0;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
rgbArray[i] = qrCode.getMatrix().get(x, y) > 0 ? 0xFFFFFF : 0x000000;
i++;
} }
image.setRGB(0, 0, width, height, rgbArray, 0, width);
Die Umwandlung des BufferedImage
zu PNG-Daten werden als Übung dem Leser überlassen. Sie können das Bild auch skalieren, indem Sie eine feste Anzahl von Pixeln pro Punkt festlegen.
Es ist normalerweise so optimiert, dass die generierte Bildgröße so klein wie möglich ist. Wenn Sie sich darauf verlassen, dass der Client das Bild skaliert (ohne Unschärfe), benötigen Sie nicht mehr als 1 Pixel pro Punkt.
Ich nehme an, ich werde mich dann damit befassen. Vielen Dank. –
Ich kann aus Erfahrung bestätigen, dass ein Code ohne Ruhezone meistens nicht gescannt wird. – Nathan
Rechts. Ich kann nicht für andere Decoder sprechen, aber zxing verwendet Heuristiken, um QR-Codes zu erkennen, die davon ausgehen, dass es eine Ruhezone gibt. Die Heuristiken gehen nicht davon aus, dass die Ruhezone vier Module breit ist, was die Spezifikation sagt, aber wenn sie nicht da ist oder zu eng ist, ist es wahrscheinlich, dass die Erfolgsrate der Zxing-Decodierung sehr wahrscheinlich abnehmen wird. – smparkes