引入:

我们知道,大家去商场购物时候,都是有个条形码扫描器会去扫描条形码,然后这个商品的信息就全部扫描进去了,这里我们就来研究下商场常用的条形码EAN-13


European Article Number ,其中共计13位代码的EAN-13是比较通用的一般终端产品的条形码协议和标准,主要应用于超级市场和其它零售业,因此这种是我们比较常见的,随便拿起身边的一个从超市买来的商品都可以从包装上看得到。代码的前3位是国家代码,中间4位是生产商代码,后5位是产品代码,最后一位是自动生成的校验码。


具体细节可以参见百度百科介绍:

http://baike.baidu.com/link?url=8uZkRNs9TJ6u1ObC3VqHxh1X9H10ja9UVFp-ESsCZJdhwQtd_d2k0zPzaUL_CZp9


实践:

我们这里就用JAVA 代码来负责生成指定内容的条形码图片,以及从条形码图片中解析出原始内容。

为此,我们写了一个java工具类 ,它用了Zxing 库:

package com.charles.study.barcode.onedimension;
import java.awt.p_w_picpath.BufferedImage;
import java.io.File;
import javax.p_w_picpathio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
/**
 * 这个工具类用于处理编码/解码 EAN-13 欧洲条形码
 * @author charles.wang
 *
 */
public class OneDimensionCodeUtil {
                                                                                                                                                             
    private OneDimensionCodeUtil(){}
                                                                                                                                                             
                                                                                                                                                             
    /**
     * 基于一个字符串生成相对应的EAN-13条形码,有指定的宽度和高度,并且存放到指定位置的文件中
     * @param contents
     * @param width
     * @param height
     * @param fileName
     * @throws Exception
     */
    public static void generate1DBarCodeImage(String contents ,int width,int height,String fileName) throws Exception{
                                                                                                                                                                 
        try { 
                                                                                                                                                                     
            //创建EAN-13条形码文件的位图矩阵
            BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, 
                    BarcodeFormat.EAN_13, width, height, null); 
                                                                                                                                                                     
            //从入参获取文件格式
            String fileFormat = fileName.substring(fileName.lastIndexOf(".")+1,fileName.length());
            //从入参创建文件对象
            File outputFile = new File(fileName);
                                                                                                                                                                     
            //吧位图矩阵写入指定的图片文件中
            MatrixToImageWriter 
                    .writeToFile(bitMatrix, fileFormat, outputFile); 
                                                                                                                                                           
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    }
                                                                                                                                                             
    /**
     * 读取一个EAN-13条形码图片文件,还原其原始信息
     * @param p_w_picpathPath
     * @return
     */
    public static String resolve1DBarCodeImage(String p_w_picpathPath){
        BufferedImage p_w_picpath = null;
        try { 
                                                                                                                                                                     
            //读取条形码图片文件
            p_w_picpath = ImageIO.read(new File(p_w_picpathPath)); 
            if (p_w_picpath == null) { 
                System.out.println("条形码图片不存在."); 
            } 
                                                                                                                                                                         
            LuminanceSource source = new BufferedImageLuminanceSource(p_w_picpath); 
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); 
                                                                                                                                                           
                                                                                                                                                                    
            //基于条形码图片文件解码获得其结果
            Result result = new MultiFormatReader().decode(bitmap,null);
                                                                                                                                                                     
            //从结果中获得原始文本
            return result.getText();
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return null; 
    }
                                                                                                                                                             
    public static void main(String[] args){
                                                                                                                                                                 
        //EAN-13条形码Demo
                                                                                                                                                                         
        try{
            String fileName = "D:/Framework Study/BarCode/OneDimension/newBarcode.png"; 
            // 《3D打印从想象到现实》这本书的条形码
            String contents = "9787508638584"; 
                                                                                                                                                           
            int width = 105;
            int height = 50; 
            OneDimensionCodeUtil.generate1DBarCodeImage(contents, width, height, fileName);
                                                                                                                                                           
        }catch(Exception ex){
            System.err.print("生成条形码出错");
        }
                                                                                                                                                                 
                                                                                                                                                                 
                                                                                                                                                                 
        //解析条形码
        String barcode_original = resolve1DBarCodeImage("D:/Framework Study/BarCode/OneDimension/newBarcode.png");
        System.out.println("还原的信息为:"+barcode_original);
                                                                                                                                                                         
    }
}



我们也在后面给出了测试的例子,比如说,我们要生成对应《3D打印从想象到现实》这本书的条形码图片,我们查阅本书知道这个条形码为 9787508638584,当我们执行到生成条形码之后,我们检查D:/FrameworkStudy/BarCode/OneDimension/newBarcode.png文件,发现果然这个文件是刚生成的,大小格式都符合:

条形码研究-EAN13 条形码_第1张图片

然后检查这个图片:

条形码研究-EAN13 条形码_第2张图片

果然是一个条形码文件。



然后我们运行下面的解析过程,则控制台显示:

163356218.png

说明我们代码是完全正确的。


我还用了我同事的手机扫描了我这里生成的条形码图片,它会获得这本书的正确信息。


福利:

这里提供一个在线网站可以专门去定制条形码:

http://barcode.tec-it.com/?LANG=zh-cn