mirror of
https://github.com/zxing/zxing.git
synced 2025-03-05 20:48:51 -08:00
Add support encoding UPC-E format
This commit is contained in:
parent
c44ee5e587
commit
17676d064a
|
@ -26,6 +26,7 @@ import com.google.zxing.oned.EAN13Writer;
|
||||||
import com.google.zxing.oned.EAN8Writer;
|
import com.google.zxing.oned.EAN8Writer;
|
||||||
import com.google.zxing.oned.ITFWriter;
|
import com.google.zxing.oned.ITFWriter;
|
||||||
import com.google.zxing.oned.UPCAWriter;
|
import com.google.zxing.oned.UPCAWriter;
|
||||||
|
import com.google.zxing.oned.UPCEWriter;
|
||||||
import com.google.zxing.pdf417.PDF417Writer;
|
import com.google.zxing.pdf417.PDF417Writer;
|
||||||
import com.google.zxing.qrcode.QRCodeWriter;
|
import com.google.zxing.qrcode.QRCodeWriter;
|
||||||
|
|
||||||
|
@ -58,6 +59,9 @@ public final class MultiFormatWriter implements Writer {
|
||||||
case EAN_8:
|
case EAN_8:
|
||||||
writer = new EAN8Writer();
|
writer = new EAN8Writer();
|
||||||
break;
|
break;
|
||||||
|
case UPC_E:
|
||||||
|
writer = new UPCEWriter();
|
||||||
|
break;
|
||||||
case EAN_13:
|
case EAN_13:
|
||||||
writer = new EAN13Writer();
|
writer = new EAN13Writer();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -56,7 +56,10 @@ public abstract class UPCEANReader extends OneDReader {
|
||||||
* Pattern marking the middle of a UPC/EAN pattern, separating the two halves.
|
* Pattern marking the middle of a UPC/EAN pattern, separating the two halves.
|
||||||
*/
|
*/
|
||||||
static final int[] MIDDLE_PATTERN = {1, 1, 1, 1, 1};
|
static final int[] MIDDLE_PATTERN = {1, 1, 1, 1, 1};
|
||||||
|
/**
|
||||||
|
* end guard pattern.
|
||||||
|
*/
|
||||||
|
static final int[] END_PATTERN = {1, 1, 1, 1, 1, 1};
|
||||||
/**
|
/**
|
||||||
* "Odd", or "L" patterns used to encode UPC/EAN digits.
|
* "Odd", or "L" patterns used to encode UPC/EAN digits.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -29,7 +29,32 @@ import com.google.zxing.common.BitArray;
|
||||||
* @author Sean Owen
|
* @author Sean Owen
|
||||||
*/
|
*/
|
||||||
public final class UPCEReader extends UPCEANReader {
|
public final class UPCEReader extends UPCEANReader {
|
||||||
|
// For an UPC-E barcode, the final digit is represented by the parities used
|
||||||
|
// to encode the middle six digits, according to the table below.
|
||||||
|
//
|
||||||
|
// Parity of next 6 digits
|
||||||
|
// Digit 0 1 2 3 4 5
|
||||||
|
// 0 Even Even Even Odd Odd Odd
|
||||||
|
// 1 Even Even Odd Even Odd Odd
|
||||||
|
// 2 Even Even Odd Odd Even Odd
|
||||||
|
// 3 Even Even Odd Odd Odd Even
|
||||||
|
// 4 Even Odd Even Even Odd Odd
|
||||||
|
// 5 Even Odd Odd Even Even Odd
|
||||||
|
// 6 Even Odd Odd Odd Even Even
|
||||||
|
// 7 Even Odd Even Odd Even Odd
|
||||||
|
// 8 Even Odd Even Odd Odd Even
|
||||||
|
// 9 Even Odd Odd Even Odd Even
|
||||||
|
//
|
||||||
|
// The encoding is represented by the following array, which is a bit pattern
|
||||||
|
// using Odd = 0 and Even = 1. For example, 5 is represented by:
|
||||||
|
//
|
||||||
|
// Odd Even Even Odd Odd Even
|
||||||
|
// in binary:
|
||||||
|
// 0 1 1 0 0 1 == 0x19
|
||||||
|
//
|
||||||
|
static final int[] CHECK_DIGIT_ENCODINGS = {
|
||||||
|
0x38, 0x34, 0x32, 0x31, 0x2C, 0x26, 0x23, 0x2A, 0x29, 0x25
|
||||||
|
};
|
||||||
/**
|
/**
|
||||||
* The pattern that marks the middle, and end, of a UPC-E pattern.
|
* The pattern that marks the middle, and end, of a UPC-E pattern.
|
||||||
* There is no "second half" to a UPC-E barcode.
|
* There is no "second half" to a UPC-E barcode.
|
||||||
|
|
77
core/src/main/java/com/google/zxing/oned/UPCEWriter.java
Normal file
77
core/src/main/java/com/google/zxing/oned/UPCEWriter.java
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2009 ZXing authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.google.zxing.oned;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.google.zxing.BarcodeFormat;
|
||||||
|
import com.google.zxing.EncodeHintType;
|
||||||
|
import com.google.zxing.WriterException;
|
||||||
|
import com.google.zxing.common.BitMatrix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This object renders an UPC-E code as a {@link BitMatrix}.
|
||||||
|
*
|
||||||
|
* @author 0979097955s@gmail.com (RX)
|
||||||
|
*/
|
||||||
|
public final class UPCEWriter extends UPCEANWriter {
|
||||||
|
|
||||||
|
private static final int CODE_WIDTH = 3 + // start guard
|
||||||
|
(7 * 6) + // bars
|
||||||
|
6; // end guard
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BitMatrix encode(String contents,
|
||||||
|
BarcodeFormat format,
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
Map<EncodeHintType, ?> hints) throws WriterException {
|
||||||
|
if (format != BarcodeFormat.UPC_E) {
|
||||||
|
throw new IllegalArgumentException("Can only encode UPC_E, but got " + format);
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.encode(contents, format, width, height, hints);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean[] encode(String contents) {
|
||||||
|
if (contents.length() != 8) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Requested contents should be 8 digits long, but got " + contents.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
int checkDigit = Integer.parseInt(contents.substring(7, 8));
|
||||||
|
int parities = UPCEReader.CHECK_DIGIT_ENCODINGS[checkDigit];
|
||||||
|
boolean[] result = new boolean[CODE_WIDTH];
|
||||||
|
int pos = 0;
|
||||||
|
|
||||||
|
pos += appendPattern(result, pos, UPCEANReader.START_END_PATTERN, true);
|
||||||
|
|
||||||
|
for (int i = 1; i <= 6; i++) {
|
||||||
|
int digit = Integer.parseInt(contents.substring(i, i + 1));
|
||||||
|
if ((parities >> (6 - i) & 1) == 1) {
|
||||||
|
digit += 10;
|
||||||
|
}
|
||||||
|
pos += appendPattern(result, pos, UPCEANReader.L_AND_G_PATTERNS[digit], false);
|
||||||
|
}
|
||||||
|
|
||||||
|
appendPattern(result, pos, UPCEANReader.END_PATTERN, false);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue