`

调整一维条码宽单元窄单元比例(ZXing2.3)

阅读更多
  最近用到一维条码、二维条码,看了几种方案,选了ZXing,因为即支持一维条码、二维条码的生成,也支持条码的识读。
  结果在应用的过程中遇到了问题,有的单位使用的是针式打印机,一式多份的,打印出来的一维条码识别率很低。这是个致命的问题,必须要解决。仔细阅读了一维条码的原理、码制,发现一个说法,条码的宽单元与窄单元的比例(W/N Ratio)可以为2至3。看一下打印结果,ZXing打印出来的好像是2,如果调整到3,是不是能提高识别率呢?
  可是,把ZXing的接口反复看了几遍,没有找到能改的地方,觉得这是一个比较重要的参数,ZXing不提供有点不厚道呀!
  只好改源码了,阅读了一下源码,发现ZXing确实不支持调整宽窄单元比,因为2是硬编码在代码里的,为了不影响原有的代码,我就自已加一种码制吧,起个名叫Code393,表示宽窄单元比为3的Code39码。把我的代码完整贴一下,改动并不多,加了一点儿注释。还要修改BarcodeFormat、MultiFormatWriter,很简单,这里不做介绍了。
/*
 * Copyright 2010 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 com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

import java.util.Map;

/**
 * This object renders a CODE39 code as a {@link BitMatrix}.
 * 宽单元这宽度为窄单元的2到3倍,这是我自定义的3倍的单元比
 * 
 * @author erik.barbara@gmail.com (Erik Barbara), Modified by wallimn@sohu.com
 */
public final class Code393Writer extends OneDimensionalCodeWriter {

  @Override
  public BitMatrix encode(String contents,
                          BarcodeFormat format,
                          int width,
                          int height,
                          Map<EncodeHintType,?> hints) throws WriterException {
    if (format != BarcodeFormat.CODE_39_3) {
      throw new IllegalArgumentException("Can only encode CODE_39, but got " + format);
    }
    return super.encode(contents, format, width, height, hints);
  }

  @Override
  public boolean[] encode(String contents) {
    int length = contents.length();
    if (length > 80) {
      throw new IllegalArgumentException(
          "Requested contents should be less than 80 digits long, but got " + length);
    }

    int[] widths = new int[9];
    //int codeWidth = 24 + 1 + length;
    int codeWidth = 1 + length;//每个字符间的空
    for (int i = 0; i < length; i++) {
      int indexInString = Code39Reader.ALPHABET_STRING.indexOf(contents.charAt(i));
      if (indexInString < 0) {
        throw new IllegalArgumentException("Bad contents: " + contents);
      }
      toIntArray(Code39Reader.CHARACTER_ENCODINGS[indexInString], widths);
      for (int width : widths) {
        codeWidth += width;
      }
    }
    toIntArray(Code39Reader.CHARACTER_ENCODINGS[39], widths);
    //起始码、结束码占的宽度
    for (int width : widths) {
    	codeWidth += width;
    }
    for (int width : widths) {
    	codeWidth += width;
    }
    boolean[] result = new boolean[codeWidth];
    int pos = appendPattern(result, 0, widths, true);
    int[] narrowWhite = {1};
    pos += appendPattern(result, pos, narrowWhite, false);
    //append next character to bytematrix
    for(int i = length-1; i >= 0; i--) {
      int indexInString = Code39Reader.ALPHABET_STRING.indexOf(contents.charAt(i));
      toIntArray(Code39Reader.CHARACTER_ENCODINGS[indexInString], widths);
      pos += appendPattern(result, pos, widths, true);
      pos += appendPattern(result, pos, narrowWhite, false);
    }
    toIntArray(Code39Reader.CHARACTER_ENCODINGS[39], widths);
    pos += appendPattern(result, pos, widths, true);
    return result;
  }

  private static void toIntArray(int a, int[] toReturn) {
    for (int i = 0; i < 9; i++) {
      int temp = a & (1 << i);
      toReturn[i] = temp == 0 ? 1 : 3;//原来此处为3
    }
  }

}


  调整好了,打印一试,识别率比较令人满意。
  另,此项修改,不知对条码识别有没有影响,本人没有检查识读部分的代码。
  本人原创,转载请保留原文地址:http://wallimn.iteye.com/blog/2111896
分享到:
评论

相关推荐

    zxing jar包 2.3 3.0 3.1

    这个库被广泛应用于移动设备和Web应用程序中,支持多种编码格式,如QR码、条形码(Code 128、EAN-13等)以及各种二维和一维条码。在提供的信息中,我们看到有三个不同版本的ZXing库的JAR文件:2.3、3.0和3.1.1,这些...

    详细注释!二维码条码扫描源码,使用Zxing core2.3

    **Zxing (Zebra Crossing)** 是一个开源的条码解码框架,由Google开发,支持多种条码格式,包括一维条码(如EAN-13、UPC-A)和二维条码(如QR Code、Data Matrix)。Zxing的核心库(core)可以用于多种平台,包括...

    详细注释!二维码条码扫描源码,使用Zxing core2.3.zip

    Zxing,全称“Zebra Crossing”,是一款开源的多格式一维/二维条码图像处理库,支持多种平台,包括Java、Android和iOS。 首先,我们需要理解Zxing的核心组件。在Zxing中,`Core`模块是最基础的部分,它包含了所有...

    安卓开发-详细注释!二维码条码扫描源码,使用Zxing core2.3.zip

    二维码条码扫描源码,使用Zxing core2.3.zip”(实际为rar格式)提供了一个基于Zxing库的二维码和条形码扫描解决方案,并且附带了详尽的注释,对于开发者来说是一个很好的学习和参考资源。 Zxing,全称“Zebra ...

    安卓Andriod源码——详细注释!二维码条码扫描源码,使用Zxingcore2.3.zip

    这个项目使用了Zxing(ZXing,取自“Zebra Crossing”的缩写)的核心库,版本为2.3,它是一个开源的、多格式的一维和二维条码图像处理库。 【描述】中提到的“安卓Andriod源码——详细注释!”意味着这个代码库包含...

    安卓Android源码——详细注释!二维码条码扫描源码,使用Zxing core2.3.zip

    Zxing是一个跨平台的开源项目,用于读取、写入多种一维和二维条码。它提供了多种客户端应用,包括Java库、命令行工具以及针对Android和iOS的原生应用。在Android上,Zxing库通常通过集成其核心库来实现扫描功能。 1...

    安卓Android源码——详细注释!二维码条码扫描源码,使用Zxingcore2.3.zip

    ZXing(Zebra Crossing)是一个开源项目,提供多种格式的一维和二维条码的读取和生成能力。这个项目为多个平台提供了库,包括Java、Android以及Web版本。在Android平台上,ZXing通常通过集成Zxingcore库来实现扫描...

    zxing3.3版本jar包、api文档

    这个项目提供了多种条码格式(包括一维和二维)的生成和解码功能,广泛应用于移动设备上的扫描应用。ZXing 3.3版本的发布,带来了性能优化和新特性的添加,确保了更好的稳定性和兼容性。 在这个压缩包中,我们包含...

    1维/2维条码扫描器

    本款1维/2维条码扫描器(THIR-6780系列)是一款高效可靠的条码读取设备,支持多种类型的条码识别,包括但不限于常见的1维条码如Code39、Code128等,以及2维条码如QR Code、Data Matrix等。产品设计紧凑,操作简便,...

    android 二维码条码扫描源码,注释详细

    Zxing(ZXing,发音为“zebra crossing”,斑马线)是一个开放源码的、跨平台的多种格式的一维和二维条码图像处理库,它包含了读取、解码和生成条码图像的各种功能。在这个项目中,Zxing核心库2.3被用于实现扫描功能...

    zxingfragmentlib:Android 片段的条码扫描器。 兼容安卓 2.1+

    有一些错误会阻止以纵向模式扫描(尤其是一维码,QR 等应该没问题)。 我已经测试了代码并且它(至少)在 Android 2.1 (Eclair)、2.3 (Gingerbread) 和 4.4 (KitKat) 中工作。 如果你的不起作用,请创建一个问题。...

    二维码电子请柬生成与扫描系统设计本科毕业设计.docx

    相比于一维条形码,二维码能够在更小的空间内存储更多的信息,包括文字、数字、网址等。此外,二维码具有较高的容错率,即使部分损坏,仍能正确解码。这使得二维码在物流、广告、支付等多个领域都有广泛的应用。 ...

    DES算法的二维码扫描

    - **定义**: 二维码是一种二维条形码,能够存储比一维码更多的信息。 - **特点**: 容量大、容错能力强、读取速度快。 - **应用**: 电子商务、物流管理、身份验证等。 - **2.4 DES加密算法介绍** - **原理**: DES...

    电脑用二维码扫描

    1.1 基本原理:二维码,全称Quick Response Code,快速响应码,是一种二维条形码。它通过将数据编码为黑白相间的图形,以便由特定的扫描设备读取并解码。二维码可以存储各种类型的信息,如文字、数字、网址、名片...

    python基于Django的二维码生成算法源码数据库.docx

    相比传统的一维条码,二维码具有以下优势: - **高密度**:单位面积内能存储更多数据。 - **多方向读取**:不受扫描方向限制。 - **错误纠正能力**:即使部分损坏也能被正确识别。 - **快速解码**:支持高速数据读取...

    超简单集成华为HMS Scankit 扫码SDK实现扫一扫二维码

    超简单集成华为HMS Scankit扫码服务实现扫一扫二维码前言官网的Demo和Sample代码体验1 开发前...最近要做一个停车场扫码收费的app,在网上搜了一圈,首先接触到了ZXing,上手试了下,集成过程不复杂,但是感觉效果欠佳

Global site tag (gtag.js) - Google Analytics