Add pure barcode support to web app and command line

git-svn-id: https://zxing.googlecode.com/svn/trunk@1228 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
srowen 2010-03-01 12:09:43 +00:00
parent 1a12e1d03e
commit aa8ad02e16
2 changed files with 58 additions and 24 deletions

View file

@ -18,13 +18,10 @@ package com.google.zxing.client.j2se;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap; import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource; import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader; import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException; import com.google.zxing.NotFoundException;
import com.google.zxing.ReaderException;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.google.zxing.client.result.ParsedResult; import com.google.zxing.client.result.ParsedResult;
import com.google.zxing.client.result.ResultParser; import com.google.zxing.client.result.ResultParser;
@ -69,12 +66,15 @@ public final class CommandLineRunner {
} }
boolean tryHarder = false; boolean tryHarder = false;
boolean pureBarcode = false;
boolean productsOnly = false; boolean productsOnly = false;
boolean dumpResults = false; boolean dumpResults = false;
boolean dumpBlackPoint = false; boolean dumpBlackPoint = false;
for (String arg : args) { for (String arg : args) {
if ("--try_harder".equals(arg)) { if ("--try_harder".equals(arg)) {
tryHarder = true; tryHarder = true;
} else if ("--pure_barcode".equals(arg)) {
pureBarcode = true;
} else if ("--products_only".equals(arg)) { } else if ("--products_only".equals(arg)) {
productsOnly = true; productsOnly = true;
} else if ("--dump_results".equals(arg)) { } else if ("--dump_results".equals(arg)) {
@ -88,7 +88,7 @@ public final class CommandLineRunner {
} }
} }
Hashtable<DecodeHintType, Object> hints = buildHints(tryHarder, productsOnly); Hashtable<DecodeHintType, Object> hints = buildHints(tryHarder, pureBarcode, productsOnly);
for (String arg : args) { for (String arg : args) {
if (!arg.startsWith("--")) { if (!arg.startsWith("--")) {
decodeOneArgument(arg, hints, dumpResults, dumpBlackPoint); decodeOneArgument(arg, hints, dumpResults, dumpBlackPoint);
@ -98,6 +98,7 @@ public final class CommandLineRunner {
// Manually turn on all formats, even those not yet considered production quality. // Manually turn on all formats, even those not yet considered production quality.
private static Hashtable<DecodeHintType, Object> buildHints(boolean tryHarder, private static Hashtable<DecodeHintType, Object> buildHints(boolean tryHarder,
boolean pureBarcode,
boolean productsOnly) { boolean productsOnly) {
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(3); Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(3);
Vector<BarcodeFormat> vector = new Vector<BarcodeFormat>(8); Vector<BarcodeFormat> vector = new Vector<BarcodeFormat>(8);
@ -117,6 +118,9 @@ public final class CommandLineRunner {
if (tryHarder) { if (tryHarder) {
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
} }
if (pureBarcode) {
hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
}
return hints; return hints;
} }

View file

@ -93,6 +93,7 @@ public final class DecodeServlet extends HttpServlet {
private static final Logger log = Logger.getLogger(DecodeServlet.class.getName()); private static final Logger log = Logger.getLogger(DecodeServlet.class.getName());
static final Hashtable<DecodeHintType, Object> HINTS; static final Hashtable<DecodeHintType, Object> HINTS;
static final Hashtable<DecodeHintType, Object> HINTS_PURE;
static { static {
HINTS = new Hashtable<DecodeHintType, Object>(5); HINTS = new Hashtable<DecodeHintType, Object>(5);
@ -110,6 +111,8 @@ public final class DecodeServlet extends HttpServlet {
possibleFormats.add(BarcodeFormat.DATAMATRIX); possibleFormats.add(BarcodeFormat.DATAMATRIX);
possibleFormats.add(BarcodeFormat.PDF417); possibleFormats.add(BarcodeFormat.PDF417);
HINTS.put(DecodeHintType.POSSIBLE_FORMATS, possibleFormats); HINTS.put(DecodeHintType.POSSIBLE_FORMATS, possibleFormats);
HINTS_PURE = new Hashtable<DecodeHintType, Object>(HINTS);
HINTS_PURE.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
} }
private HttpParams params; private HttpParams params;
@ -245,6 +248,7 @@ public final class DecodeServlet extends HttpServlet {
private static void processStream(InputStream is, ServletRequest request, private static void processStream(InputStream is, ServletRequest request,
HttpServletResponse response) throws ServletException, IOException { HttpServletResponse response) throws ServletException, IOException {
BufferedImage image = ImageIO.read(is); BufferedImage image = ImageIO.read(is);
if (image == null) { if (image == null) {
response.sendRedirect("badimage.jspx"); response.sendRedirect("badimage.jspx");
@ -252,32 +256,42 @@ public final class DecodeServlet extends HttpServlet {
} }
Reader reader = new MultiFormatReader(); Reader reader = new MultiFormatReader();
Result result;
try {
LuminanceSource source = new BufferedImageLuminanceSource(image); LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new GlobalHistogramBinarizer(source)); BinaryBitmap bitmap = new BinaryBitmap(new GlobalHistogramBinarizer(source));
Result result = null;
ReaderException savedException = null;
try {
// Look for pure barcode
result = reader.decode(bitmap, HINTS_PURE);
} catch (ReaderException re) {
savedException = re;
}
if (result == null) {
try {
// Look for normal barcode in photo
result = reader.decode(bitmap, HINTS); result = reader.decode(bitmap, HINTS);
} catch (ReaderException re) { } catch (ReaderException re) {
savedException = re;
}
}
if (result == null) {
try { try {
// Try again with other binarizer // Try again with other binarizer
LuminanceSource source = new BufferedImageLuminanceSource(image); BinaryBitmap hybridBitmap = new BinaryBitmap(new HybridBinarizer(source));
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); result = reader.decode(hybridBitmap, HINTS);
result = reader.decode(bitmap, HINTS); } catch (ReaderException re) {
} catch (NotFoundException nfe) { savedException = re;
log.info("Not found: " + re.toString());
response.sendRedirect("notfound.jspx");
return;
} catch (FormatException fe) {
log.info("Format problem: " + re.toString());
response.sendRedirect("format.jspx");
return;
} catch (ChecksumException ce) {
log.info("Checksum problem: " + re.toString());
response.sendRedirect("format.jspx");
return;
} }
} }
if (result == null) {
handleException(savedException, response);
return;
}
if (request.getParameter("full") == null) { if (request.getParameter("full") == null) {
response.setContentType("text/plain"); response.setContentType("text/plain");
response.setCharacterEncoding("UTF8"); response.setCharacterEncoding("UTF8");
@ -313,6 +327,22 @@ public final class DecodeServlet extends HttpServlet {
} }
} }
private static void handleException(ReaderException re, HttpServletResponse response) throws IOException {
if (re instanceof NotFoundException) {
log.info("Not found: " + re);
response.sendRedirect("notfound.jspx");
} else if (re instanceof FormatException) {
log.info("Format problem: " + re);
response.sendRedirect("format.jspx");
} else if (re instanceof ChecksumException) {
log.info("Checksum problem: " + re);
response.sendRedirect("format.jspx");
} else {
log.info("Unknown problem: " + re);
response.sendRedirect("notfound.jspx");
}
}
private static boolean isSizeOK(HttpMessage getResponse) { private static boolean isSizeOK(HttpMessage getResponse) {
Header lengthHeader = getResponse.getLastHeader("Content-Length"); Header lengthHeader = getResponse.getLastHeader("Content-Length");
if (lengthHeader != null) { if (lengthHeader != null) {