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. 压缩javascript文件方法

    写在前面的话:正式部署前端的时候,javascript文件一般需要压缩,并生成相应的sourcemap文件,对于一些小型的项目开发,这里提供一个简单的办法. ======正文开始====== 1.下载 ...

  2. 如何在VMware中安装Windows Phone SDK 8.0 (支持模拟器调试)

    相信很多开发者目前的系统还是Win7或Mac,一般不会为了开发某个程序而重装系统,所以我们就需要用到VMware这类的虚拟机来模拟预期的开发环境.在开始介绍前,给大家说明下我当前的软硬件环境,本文所讲 ...

  3. Glide源码导读

    最近比较无聊,为了找点事干,就花了两天时间把Glide的源码大概看了一下.刚开始看Glide的源码头脑还是比较乱的,因为作者引入了几个概念,又大量用了泛型,如果不了解这些概念读起代码来就比较痛苦,我也 ...

  4. ABP框架 - 介绍

    文档目录 本节内容: 简介 一个快速示例 其它特性 启动模板 如何使用 简介 我们总是对不同的需求开发不同的应用.但至少在某些层面上,一次又一次地重复实现通用的和类似的功能.如:授权,验证,异常处理, ...

  5. form表单 ----在路上(15)

    form 表单就是将用户的信息提交到服务器,服务器会将信息存储活着根据信息查询数据进行增删改查,再将其返回给用户. 基本格式: <form action="" method ...

  6. Android Toolbar 开发总结

    初识 Toolbar Toolbar是在 Android 5.0 开始推出的一个 Material Design 风格的导航控件 ,Google 非常推荐大家使用 Toolbar 来作为Android ...

  7. Owin:“System.Reflection.TargetInvocationException”类型的未经处理的异常在 mscorlib.dll 中发生

    异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR 这个异常我遇到两种情况,供园友参考: 第一种,权限不够,在项目运行的时候弹出== ...

  8. 从java文件和CS文件里查询方法使用次数工具

    前几天,领导让我找一下老系统(Java)里getRemoteUser方法都哪个文件用了,package是什么,方法被调用了多少次,当时因为着急,所以,直接人工找的,但是以后要是再出现,人工找就太讨厌了 ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(5)-EF增删改查

    系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 回顾上一节的解决方案,我们看出了解决方案中类库的关系 这里要说明一点MVC!=三层 他们大约是这样的一种关系 代码实现 上 ...

  10. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之序列化

    一个技术汪的开源梦 —— 目录 想必大家在项目中都接触过 JSON 或者 XML 吧,为了将对象在网络上传输或者将其持久化必须将其序列化为一个字符串然后进行后续操作.常见的就是将其序列化成 JSON ...