X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=core%2Fsrc%2Fcom%2Fgoogle%2Fzxing%2Fqrcode%2FQRCodeWriter.java;h=7cf12b964523f63380f38412d46c338698630cc7;hb=e1ae919a8f18c4f0a4ae24b40bfafb4eb24b2dad;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..7cf12b96 100644 --- a/core/src/com/google/zxing/qrcode/QRCodeWriter.java +++ b/core/src/com/google/zxing/qrcode/QRCodeWriter.java @@ -17,10 +17,11 @@ 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.ByteArray; 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; @@ -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"); } @@ -55,26 +58,35 @@ public final class QRCodeWriter implements Writer { 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"); + if (hints != null) { + Integer requestedECLevel = (Integer) hints.get(EncodeHintType.ERROR_CORRECTION); + if (requestedECLevel != null) { + errorCorrectionLevel = requestedECLevel.intValue(); + } } + + QRCode code = new QRCode(); + Encoder.encode(new ByteArray(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(); + 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 * 2); + int qrHeight = inputHeight + (QUIET_ZONE_SIZE * 2); + 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;