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. React Native 环境搭建

    1,安装 HomeBrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install ...

  2. Jmeter正则表达式

    Jmeter正则表达式 文章转自:http://www.cnblogs.com/jamesping/articles/2252675.html 正则表达式可以帮助我们更好的描述复杂的文本格式.一旦你描 ...

  3. WCF学习之旅—WCF中传统的异常处理(十六)

    WCF中的异常处理 在软件开发过程中,不可能没有异常的出现,所以在开发过程中,对不可预知的异常进行解决时,异常处理显得尤为重要.对于一般的.NET系统来说,我们简单地借助try/catch可以很容易地 ...

  4. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...

  5. JavaScript权威设计--JavaScript函数(简要学习笔记十)

    1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"lik ...

  6. 连接SQLServer时,因启用连接池导致孤立事务的原因分析和解决办法

    本文出处:http://www.cnblogs.com/wy123/p/6110349.html 之前遇到过这么一种情况: 连接数据库的部分Session会出现不定时的阻塞,这种阻塞时长时短,有时候持 ...

  7. iOS 相机

    本章节主要为之前项目 JXHomepwner 添加照片功能(项目地址).具体任务就是显示一个 UIImagePickerController 对象,使用户能够为 JXItem 对象拍照并保存.拍摄的照 ...

  8. C#委托的一次"甜蜜"接触

    委托是个说烂了的话题,但是依旧有好多人不知道为什么要在C#中使用委托,最近有朋友也问到我这个问题,所以举例些场景,以供那些知道怎么声明委托.怎么调用却不知道为什么要用的朋友一些参考,当然也是希望验证下 ...

  9. EF 在controller 带参数跳转到新的网址

    参考文章:http://blog.csdn.net/zhensoft163/article/details/7174661 我用到了这一种方式: 跳转到同一Controller 里面的不同Action ...

  10. ASP.NET MVC——URL路由

    在MVC之前,ASP.NET假设请求的URL与服务器上的文件之间有关联,服务器接受请求,并输出相应的文件.而在引入MVC后,请求是由控制器的动作方法来处理的.为了处理URL,便引入了路由系统. 首先我 ...