X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=core%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fqrcode%2FQRCodeWriter.java;h=c3f24ea98d5d0f54fb404500a01a444a41656eb5;hb=a96a22b731c6402277a70ca54ccec32088adbfbb;hp=4c5c6e21d1e834a70b508e67fc251f5d164627a3;hpb=5403af5906c8d241e99f2e879a600a9cedc90eed;p=zxing.git diff --git a/core/src/com/google/zxing/qrcode/QRCodeWriter.java b/core/src/com/google/zxing/qrcode/QRCodeWriter.java index 4c5c6e21..c3f24ea9 100644 --- a/core/src/com/google/zxing/qrcode/QRCodeWriter.java +++ b/core/src/com/google/zxing/qrcode/QRCodeWriter.java @@ -17,12 +17,13 @@ package com.google.zxing.qrcode; import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; import com.google.zxing.Writer; import com.google.zxing.WriterException; import com.google.zxing.common.ByteMatrix; -import com.google.zxing.qrcode.encoder.ByteArray; import com.google.zxing.qrcode.encoder.Encoder; import com.google.zxing.qrcode.encoder.QRCode; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import java.util.Hashtable; @@ -33,16 +34,18 @@ import java.util.Hashtable; */ public final class QRCodeWriter implements Writer { - public ByteMatrix encode(byte[] contents, BarcodeFormat format, int width, int height) + private static final int QUIET_ZONE_SIZE = 4; + + public ByteMatrix encode(String contents, BarcodeFormat format, int width, int height) throws WriterException { return encode(contents, format, width, height, null); } - public ByteMatrix encode(byte[] contents, BarcodeFormat format, int width, int height, + public ByteMatrix encode(String contents, BarcodeFormat format, int width, int height, Hashtable hints) throws WriterException { - if (contents == null || contents.length == 0) { + if (contents == null || contents.length() == 0) { throw new IllegalArgumentException("Found empty contents"); } @@ -51,30 +54,39 @@ public final class QRCodeWriter implements Writer { } if (width < 0 || height < 0) { - throw new IllegalArgumentException("Requested dimensions are too small: " + width + "x" + + throw new IllegalArgumentException("Requested dimensions are too small: " + width + 'x' + height); } - // TODO: Check hints for error correction level instead of hardcoding - int errorCorrectionLevel = QRCode.EC_LEVEL_L; - QRCode code = new QRCode(); - if (Encoder.Encode(new ByteArray(contents), errorCorrectionLevel, code)) { - return renderResult(code, width, height); - } else { - throw new WriterException("Could not generate a QR Code"); + ErrorCorrectionLevel errorCorrectionLevel = ErrorCorrectionLevel.L; + if (hints != null) { + ErrorCorrectionLevel requestedECLevel = (ErrorCorrectionLevel) hints.get(EncodeHintType.ERROR_CORRECTION); + if (requestedECLevel != null) { + errorCorrectionLevel = requestedECLevel; + } } + + QRCode code = new QRCode(); + Encoder.encode(contents, errorCorrectionLevel, code); + return renderResult(code, width, height); } // Note that the input matrix uses 0 == white, 1 == black, while the output matrix uses // 0 == black, 255 == white (i.e. an 8 bit greyscale bitmap). - private ByteMatrix renderResult(QRCode code, final int width, final int height) { - ByteMatrix input = code.matrix(); + private static ByteMatrix renderResult(QRCode code, int width, int height) { + ByteMatrix input = code.getMatrix(); int inputWidth = input.width(); int inputHeight = input.height(); - int outputWidth = Math.max(width, inputWidth); - int outputHeight = Math.max(height, inputHeight); - - int multiple = Math.min(outputWidth / inputWidth, outputHeight / inputHeight); + int qrWidth = inputWidth + (QUIET_ZONE_SIZE << 1); + int qrHeight = inputHeight + (QUIET_ZONE_SIZE << 1); + int outputWidth = Math.max(width, qrWidth); + int outputHeight = Math.max(height, qrHeight); + + int multiple = Math.min(outputWidth / qrWidth, outputHeight / qrHeight); + // Padding includes both the quiet zone and the extra white pixels to accomodate the requested + // dimensions. For example, if input is 25x25 the QR will be 33x33 including the quiet zone. + // If the requested size is 200x160, the multiple will be 4, for a QR of 132x132. These will + // handle all the padding from 100x100 (the actual QR) up to 200x160. int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; int topPadding = (outputHeight - (inputHeight * multiple)) / 2; @@ -91,7 +103,7 @@ public final class QRCodeWriter implements Writer { } // 2. Expand the QR image to the multiple - final byte[][] inputArray = input.getArray(); + byte[][] inputArray = input.getArray(); for (int y = 0; y < inputHeight; y++) { // a. Write the white pixels at the left of each row for (int x = 0; x < leftPadding; x++) {