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. Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值

    第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...

  2. Javascript刷题 》数组求和

    计算给定数组 arr 中所有元素的总和 输入描述: 数组中的元素均为 Number 类型 输入例子: sum([ 1, 2, 3, 4 ]) 输出例子: 10 解题方法 1.定义一个变量,将前面的和后 ...

  3. JS中的数学计算<之简单实例讲解>

    1.取余数   % var a=10%3; //a=1 2.取绝对值  Math.abs() var a=Math.abs(-102.1); var b=Math.abs(102.1); //a=10 ...

  4. python实现网络爬虫下载天涯论坛帖子

    最近发现天涯论坛是一个挺有意思的网站,有各种乱七八糟的帖子足以填补无聊时候的空虚感,但是相当不爽的一件事就是天涯的分页模式下想连贯的把楼主的内容看完实在是太心酸了,一个999页的帖子,百分之九十都是无 ...

  5. Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...

  6. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(五)

    向前向后算法解决隐马尔可夫模型机器学习问题 作者:白宁超 2016年7月12日14:28:10 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无什么用场. ...

  7. Ajax接收不到PHP return后的结果的原因

    PHP在处理ajax返回值的时候,如果使用return如 return $result会失败,echo $result却没问题. 解释原因如下: 1.ajax请求从服务器端读取返回值,而且这些返回值必 ...

  8. Python时间戳和日期的相互转换

    Python时间戳和日期的相互转换 (2014-03-17 11:24:35) 转载▼   分类: Python 当前时间戳:time.time() 当前日期:time.ctime() 1.Pytho ...

  9. java范型集合中的成员排序

    范型集合中的类是JsonObject,不是自定义类,如果是自定义类就直接取要比较的字段值. ArrayList<JSONObject> TList = new ArrayList<J ...

  10. activiti工作流的web流程设计器整合视频教程 SSM和独立部署

    本视频为activiti工作流的web流程设计器整合视频教程 整合Acitiviti在线流程设计器(Activiti-Modeler 5.21.0 官方流程设计器) 本视频共讲了两种整合方式 1. 流 ...