为什么相同的数据条形码在视觉上看起来不同?

mal*_*alz 4 java barcode

我遇到内容相同但原始字节不同的两个条形码之间的差异。一个条形码是使用名为 Labelary 的在线工具生成的,该工具专为创建 ZPL 标签而设计,另一个条形码是使用 ZXing 库在我的 Java 代码中生成的。尽管内容相同,但条形码的视觉外观有所不同。

我的条形码

我的条形码

原始文本: 12345678
原始字节: 69 0c 22 38 4e 2f 6a

BarcodeGenerator.java

public byte[] getBarCode128(String data, int width, int height) {
    Code128Writer writer = new Code128Writer();
    BitMatrix matrix = writer.encode(data, BarcodeFormat.CODE_128, width, height);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    try {
        MatrixToImageWriter.writeToStream(matrix, "png", outputStream);
        return outputStream.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

Main.java

public static void main(String[] args) {
    String data = "12345678";
        
    int width = (int) (data.length() * 11 * moduleWidth);
    int height = 270;
        
    BarcodeGenerator barcode = new BarcodeGenerator();
    byte[] barcodeImageBytes = barcode.getBarCode128(data, (int) width, (int) height);
}
Run Code Online (Sandbox Code Playgroud)

Labelary 的条形码

单击此处查看源代码。

Labelary 的条形码

原始文本: 12345678
原始字节: 68 11 12 13 14 15 16 17 18 3c 6a

造成这种差异的潜在原因是什么?如何确保使用 Java 中的 ZXing 库正确生成条形码?

tea*_*418 6

两者都是正确的,只是编码不同。一种69是代码 C,每个代码点有两位数字。较长的68一个是代码 B。

另请参阅: https: //en.wikipedia.org/wiki/Code_128

如果您想强制您的代码也执行较长的代码 B,您可以将FORCE_CODE_SET编码提示设置为“B”。

对编码提示的疯狂猜测:

Map<EncodeHintType, String> hints = new HashMap<>();
hints.put(EncodeHintType.FORCE_CODE_SET, "B");
BitMatrix matrix = writer.encode(data, BarcodeFormat.CODE_128, width, height, hints);
Run Code Online (Sandbox Code Playgroud)