Barcode简介

  Barcode是由一组按一定编码规则排列的条,空符号,用以表示一定的字符,数字及符号组成的,一种机器可读的数据表示方式。
  Barcode的形式多种多样,按照它们的外观分类:
    Linear barcode(一维码):它的信息存储量小,仅能存储一个代号,使用时通过这个代号调取计算机网络中的数据。
    Matrix barcode(二维码)。二维码是近几年发展起来的,它能在有限的空间内存储更多的信息,包括文字、图象、指纹、签名等,并可脱离计算机使用。
  你可能认为你对它们都有所了解,因为它们大概都是这个样子的:

      

  但事实上,它们有甚至有可能是这样子的:

      

  我们通常所说的二维码,只是Matrix barcode的一种,叫做QR code。

  Barcode种类繁多,有些编码格式并不常用,即使是ZXing也没有做到所有格式的支持,开发者只需了解就好。
  其中包括:
  一维条码编码格式:
    Code39码(标准39码)、Codabar码(库德巴码)、Code25码(标准25码)、ITF25码(交叉25码)、Matrix25码(矩阵25码)、UPC-A码、UPC-E码、
    EAN-13码(EAN-13国际商品条码)、EAN-8码(EAN-8国际商品条码)、中国邮政码(矩阵25码的一种变体)、Code-B码、MSI码、Code11码、Code93码、ISBN码、ISSN码、
    Code128码(Code128码,包括EAN128码)、Code39EMS(EMS专用的39码)等
  二维条码编码格式:
    PDF417码、Code49码、Code 16k码、Date Matrix码、MaxiCode码(包括 QR Code码)等。

      Code 39、Code 128、EAN、UPC、QR Code是我们生活中能经常见到的几种编码格式,同时ZXing对几种格式都有比较好的支持。
      其中,UPC-A是一种国际通用的编码格式,由12个数字构成,EAN-13是在UPC-A基础上的一种扩充(多了一个数字)。快数一数你身边的薯片的编码是不是13位!如果是的话,它最前边的两个数字是不是“69”?

      在EAN-13的编码体系中,前三位数字表示商品生产商的国家(并不是商品所属公司的国家),中国的编码是690~699,美国是(000~019、030~039、060~139),日本是(450~459、490~499),and so on。
      不同的编码格式通常用在不同的领域,如果你看到了一个Code 39或者Code 128的Barcode,那么这很就可能是一个快递编码,这个时候你就可以去那些提供快递查询的网站查询一下你的快递信息,如果有API提供出来那就更是再好不过了。
      至于QR Code,就是我们经常用手机扫一扫的二维码,表示的信息更是多种多样,并不仅仅是一个url那么简单,至于这些信息如何处理,是我们一会儿将要讨论的内容。

一、google的zxing(jar包下载)

  1:条形码的生成与解码(生成的条形码不显示 本身的条码含义,即:条码下方没有数字字母等。如有需要,自行拼接)

  

  

 import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream; import javax.imageio.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; public class ZxingEAN13Code {
/**
* 条形码编码
* @param contents
* @param width
* @param height
* @param imgPath
*/
public void encode(String contents, int width, int height, String imgPath) {
//保证最小为70*25的大小
int codeWidth = Math.max(70, width);
int codeHeight = Math.max(25, height);
try {
//使用EAN_13编码格式进行编码
BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
BarcodeFormat.EAN_13, codeWidth, codeHeight, null);
//生成png格式的图片保存到imgPath路径
MatrixToImageWriter.writeToStream(bitMatrix, "png",
new FileOutputStream(imgPath));
System.out.println("encode success! the img's path is "+imgPath);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 解析条形码
* @param imgPath
* @return
*/
public String decode(String imgPath) {
BufferedImage image = null;
Result result = null;
try {
image = ImageIO.read(new File(imgPath));
if (image == null) {
System.out.println("the decode image may be not exit.");
}
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); result = new MultiFormatReader().decode(bitmap, null);
return result.getText();
} catch (Exception e) {
e.printStackTrace();
}
return null;
} public static void main(String[] args) {
String decodeImgPath = "D:/1.png";
ZxingEAN13Code EAN13Code = new ZxingEAN13Code();
System.out.println(EAN13Code.decode(decodeImgPath)); String encodeImgPath = "D:/2.png";
String contents = "6923450657713";
int width = 150, height = 40;
EAN13Code.encode(contents, width, height, encodeImgPath);
}
}

  2:在web项目中很少会用到解码,一般而言是生成条形码后显示到页面或者打印出来,使用扫码枪扫码出来条形码的信息进行进一步的处理

    在此说明:扫码枪扫描条形码很简单,其实就可以把扫码枪理解成键盘,扫描条形码后,就可以将条码中的信息(如:6923450657713)显示在光标定位的地方

  

  

 import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable; import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping; import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix; public class ZxingBarCodeUtil {
/**
* 根据字符串生成条形码
*
* @param code字符串
* @return
*/
public static BitMatrix getShapeCode(String code) {
// 编码条形码
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "GBK");
BitMatrix matrix = null;
try {
// 使用code_128格式进行编码生成100*25的条形码
matrix = new MultiFormatWriter().encode(code,
BarcodeFormat.CODE_128, 100, 25, hints);
} catch (WriterException e) {
e.printStackTrace();
}
return matrix;
} /** 获取条形码 */
public void getShapeCode(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
BitMatrix matrix = this.getShapeCode(request.getParameter("printCode"));
// 返回png图片流
// 获得Servlet输出流
ServletOutputStream outStream = null;
try {
outStream = response.getOutputStream();
ImageIO.write(MatrixToImageWriter.toBufferedImage(matrix), "png",
outStream);
outStream.flush();
// 关闭输出流
outStream.close();
} catch (IOException e) {
String simplename = e.getClass().getSimpleName();
if (!"ClientAbortException".equals(simplename)) {
e.printStackTrace();
}
}
} /*public static void main(String[] args) {
BufferedImage buff = MatrixToImageWriter
.toBufferedImage(getShapeCode("TG201603280003"));// 123
try {
ImageIO.write(buff, "png", new File("D://1.png"));
System.out.println("已生成");
} catch (IOException e) {
e.printStackTrace();
}
}*/
}

  3:二维码的生成与解码

  

 import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Hashtable; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
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;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /**
* 二维码生成/解码器
*/
public class ZxingQRCode { /**
* 生成二维码
* @param contents
* @param width
* @param height
* @param imgPath
*/
public void encode(String contents, int width, int height, String imgPath) {
Hashtable<EncodeHintType, Object> hints = new Hashtable();
// 指定纠错等级
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
// 指定显示格式为GBK
hints.put(EncodeHintType.CHARACTER_SET, "GBK");
try {
BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
BarcodeFormat.QR_CODE, width, height, hints);
//生成png格式的图片保存到imgPath路径位置
MatrixToImageWriter.writeToStream(bitMatrix, "png",
new FileOutputStream(imgPath));
System.out.println("QR Code encode sucsess! the img's path is "+imgPath);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 解析二维码
* @param imgPath
* @return
*/
public String decode(String imgPath) {
BufferedImage image = null;
Result result = null;
try {
//读取图片
image = ImageIO.read(new File(imgPath));
if (image == null) {
System.out.println("the decode image may be not exit.");
}
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Hashtable<DecodeHintType, Object> hints = new Hashtable();
//设置显示格式为GBK
hints.put(DecodeHintType.CHARACTER_SET, "GBK");
//进行解码
result = new MultiFormatReader().decode(bitmap, hints);
return result.getText();//返回结果信息
} catch (Exception e) {
e.printStackTrace();
}
return null;
} public static void main(String[] args) {
ZxingQRCode ORCode = new ZxingQRCode();
ORCode.encode("http://www.cnblogs.com/zhaoyhBlog/", 150, 150,
"D:/二维码1.png"); System.out.println(ORCode.decode("D:/二维码1.png"));
}
}

 二、使用org.jbarcode(jar包下载)

1、生成条形码(条形码下方包含  本身的含义,即:条码下方有数字字母等)

 import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import org.jbarcode.JBarcode;
import org.jbarcode.encode.EAN8Encoder;
import org.jbarcode.paint.EAN8TextPainter;
import org.jbarcode.paint.WidthCodedPainter;
import org.jbarcode.util.ImageUtil; /**
* 支持EAN13, EAN8, UPCA, UPCE, Code 3 of 9, Codabar, Code 11, Code 93, Code 128,
* MSI/Plessey, Interleaved 2 of PostNet等
*/
public class JBarcodeByEAN8Util { public void encodeByEAN8(String content, String imgPath, int with,
int height) {
try {
JBarcode jBarcode = new JBarcode(EAN8Encoder.getInstance(),
WidthCodedPainter.getInstance(), EAN8TextPainter.getInstance());
BufferedImage bufferedImage = jBarcode.createBarcode(content);
FileOutputStream outputStream = new FileOutputStream(imgPath);
ImageUtil.encodeAndWrite(bufferedImage, "jpeg", outputStream, with,height);
outputStream.close();
System.out.println("===");
} catch (Exception localException) {
localException.printStackTrace();
}
} public static void main(String[] paramArrayOfString) {
JBarcodeByEAN8Util jBarCodeUtil = new JBarcodeByEAN8Util();
jBarCodeUtil.encodeByEAN8("110120119", "D:/EAN8.jpg", 100, 70);
}
}

参考链接:http://www.oschina.net/code/snippet_170632_47382

    http://www.oschina.net/code/snippet_152736_10891

Java 条形码 二维码 的生成与解析的更多相关文章

  1. 关于java的二维码的生成与解析

    本文说的是通过zxing实现二维码的生成与解析,看着很简单,直接上代码 import java.io.File; import java.io.IOException; import java.nio ...

  2. java实现二维码的生成与解析

    简单介绍下二维码:二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片,而解析二维码则相反,就是将一张经过编码的图片解析为数字或者文字. 当然 ...

  3. 【Java】Java实现二维码的生成与解析

    pom依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</ ...

  4. java实现二维码的生成和解析:QRCode、zxing 两种方式

    第一种:QRCode.jar,使用QRCode生成和解析二维码 1.导入jar包  2.代码 (1)QRCodeUtil .java import com.swetake.util.Qrcode; i ...

  5. ZXing二维码的生成和解析

    Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法, 现在我简单介绍一下使用Java利用Zxing生成与解析二维码 注意: 二维码的生成需要借助辅助类( ...

  6. .net core 的图片处理及二维码的生成及解析

    写代码这事,掐指算来已经十有余年. 从html到css到javascript到vbscript到c#,从兴趣到职业,生活总是失落与惊喜并存. 绝大部分时候,出发并不是因为知道该到哪里去,只是知道不能再 ...

  7. Java条形码/二维码生成和解析

    注意-本类依赖jar包文件:core.jar和zxing-javase.jar 下载jar文件,到本博客文件栏目下载. import com.google.zxing.BarcodeFormat; i ...

  8. java实现二维码的生成.

    目录 1.二维码概念  2.二维码发展历史  3.二维码分类  4.二维码优缺点  5.QR Code  1.二维码又称  二维条码 (2-dimensional bar code)是用某种特定的几何 ...

  9. 关于用Java实现二维码的生成

    昨天晚上看了一个视频讲的是web端把名片搞成二维码的形式,觉得挺有意思的,不过我还是初学,所以就没在网页端实现,写了命令行程序. 虽然看着程序很短,不过写的过程中还是出了问题, 最致命的就是 Grap ...

随机推荐

  1. .NET里简易实现IoC

    .NET里简易实现IoC 前言 在前面的篇幅中对依赖倒置原则和IoC框架的使用只是做了个简单的介绍,并没有很详细的去演示,可能有的朋友还是区分不了依赖倒置.依赖注入.控制反转这几个名词,或许知道的也只 ...

  2. iOS实现UICollectionViewDataSource与Controller的分离

    之前每次用到UICollectionView的时候都会都需要在Controller里面去实现DataSource & Delegate方法 单独Delegate方法还好不是很多, 但是再加上D ...

  3. Spark核心作业调度和任务调度之DAGScheduler源码

    前言:本文是我学习Spark 源码与内部原理用,同时也希望能给新手一些帮助,入道不深,如有遗漏或错误的,请在原文评论或者发送至我的邮箱 tongzhenguotongzhenguo@gmail.com ...

  4. Android笔记——Handler Runnable与Thread的区别

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  5. SQL Server 游标运用:鼠标轨迹字符串分割

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 游标模板(Cursor Template) 鼠标轨迹字符串分割SQL脚本实现(SQL Code ...

  6. Linux文件系统的实现

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux文件管理从用户的层面介绍了Linux管理文件的方式.Linux有一个树状 ...

  7. 如何写复杂的SQL

    经常有人问我那非常复杂的sql是怎么写出来的,我一直不知道该怎么回答.         因为虽然我写这样的sql很顺手,可是我却不知道怎么告诉别人怎么写. 很多人将这个问题归结为天赋,我却不这么看,我 ...

  8. 你真的会玩SQL吗?你所不知道的 数据聚合

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  9. 使用localResizeIMG3+WebAPI实现手机端图片上传

    前言 惯例~惯例~昨天发表的使用OWIN作为WebAPI的宿主..嗯..有很多人问..是不是缺少了什么 - - 好吧,如果你要把OWIN寄宿在其他的地方...代码如下: namespace Conso ...

  10. 深入理解脚本化CSS系列第二篇——查询计算样式

    × 目录 [1]getComputedStyle [2]注意事项 [3]currentStyle[4]IE 前面的话 元素的渲染结果是多个CSS样式博弈后的最终结果,这也是CSS中的C(cascade ...