方式一(生成一维码):使用架包-->jbarcode.jar 点击打开链接
实现代码可以直接使用,如下:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import javax.imageio.stream.FileImageOutputStream;
import org.jbarcode.JBarcode;
import org.jbarcode.encode.BarcodeEncoder;
import org.jbarcode.encode.Code39Encoder;
import org.jbarcode.paint.BaseLineTextPainter;
import org.jbarcode.paint.EAN13TextPainter;
import org.jbarcode.paint.WideRatioCodedPainter;
import org.jbarcode.paint.WidthCodedPainter;
import org.jbarcode.util.ImageUtil;
/**
*
*@类功能说明: java生成一维码图片
*@修改人员名: yang
*@修改日期: 2016-2-24 下午05:00:11
*@创建时间: 2016-2-24 下午05:00:11
* ----------------------------------------------------------------------------------------------------------
* 修改次数 修改人员 修改内容 修改原因
*
* @备注:
* @版本: V1.0
*/
public class TestSingleImage {
public static void main(String args[]){
try {
byte[] by=createDimensionalCode("1234567893243213454");
//生成的图片高度是固定60像素
String path="F:12w3.jpg";//输出gif、jpg、png、bmp都行
//打开输入流
FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
//将byte数组写入本地硬盘
imageOutput.write(by, 0, by.length);
//关闭输入流
imageOutput.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @方法功能备注: 生成最综一维码字节数组
* @创建人员: yang
* @修改日期: 2016-2-24 下午05:27:25
* ----------------------------------------------------------------------------------------------------------------
* @修改历史
* 序号 日期 修改人 修改原因
*
*
* ----------------------------------------------------------------------------------------------------------------
* @备注:
* @param value
* @return:
* @测试结果:通过
*/
public static byte[] createDimensionalCode(String value){
return createCode(Code39Encoder.class,value,false);
}
public static byte[] createCode(Class<?> clazz,String value,boolean checkDigit){
try{
JBarcode localJBarcode = new JBarcode(getUnique(clazz),WidthCodedPainter.getInstance(),EAN13TextPainter.getInstance());
localJBarcode.setPainter(WideRatioCodedPainter.getInstance());
localJBarcode.setTextPainter(BaseLineTextPainter.getInstance());
localJBarcode.setCheckDigit(checkDigit);
localJBarcode.setShowCheckDigit(checkDigit);
return getImageBytes(localJBarcode.createBarcode(value));
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
//获取唯一单例的对象
private static BarcodeEncoder getUnique(Class<?> clazz) throws Exception{
Constructor<?>[] constructors=clazz.getDeclaredConstructors();
onstructor<?> privateConstructor = constructors[0];
}
方式二(生成一维码和二维码):在eclipse中生成(此方法比方式一好用!)
1、pox.xml内容
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>maven_ssm</groupId>
<artifactId>ssm</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>ssm Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!-- 表示开发的时候引入,发布的时候不会加载此包 -->
<scope>test</scope>
</dependency>
<!-- 导入谷歌生成一维码、二维码的包 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<build>
<finalName>ssm</finalName>
</build>
</project>
2、在src/main/java目录中,新建java代码
(1)一维码:SimpleCodeUtil.java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
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 SimpleCodeUtil{
//输出的图片格式
private static final String FORMAT="PNG";
/**
* 生成条形码<br>
* <b>注意</b>条形码的宽度不能等于图片的宽度,否则解析不出来,如果解析不出来,请加大offset的值
* @param contents 内容
* @param dest 条形码图片地址
* @param width 宽度
* @param height 高度
* @param offset 偏移量
* @throws WriterException
* @throws FileNotFoundException
* @throws IOException
*/
public static void encode(String contents,String dest,int width,int height,int offset)
throws WriterException, FileNotFoundException, IOException{
contents=new String(contents.getBytes("UTF-8"),"ISO-8859-1");
/**
* Code128A字符集 包括大写字母、数字、常用标点符号和一些控制符。
Code128B字符集 包括大小写字母、数字、常用标点符号。
Code128C字符集 为纯数字序列。
Code128Auto 是将上述三种字符集最佳优化组合。
EAN128条码生成 是由UPC/EAN指定代表意义规则的128码,编码方式同code128条码。
Code39条码生成字符集包括数字 、大写字母以及- . $ / + % * 空格等字符,其中"*"
只用于标记开始和结束。
Code93条码生成是 full ASCII 模式,可使用ASCII全部128个字符。
库德巴码(Codabar)条码生成,字符集包括数字和- $ : /. + 以及ABCD等字符,
其中ABCD只用于开始或者结尾,作为标识符使用。
交叉25码(Interleaved 2 of 5)条码生成,常用于物流管理,字符集仅为数字且个数为偶数,
为奇数将自动在前面加"0"。
Code11条码 只允许11种字元,分别是0-9和"-",为降低检查错误率,可使用两位的检验码。
MSI条形码 必须是纯的数字0-9,带有一位检验码。
EAN13商品条码是纯数字,而且位数是12位,在编码过后外加一位校验码,组成13位数字。
EAN8商品条码是纯数字,而且位数是7位,在编码过后外加一位校验码,组成8位数字。
UPC-A条码商品条码是纯数字,而且位数是11位,在编码过后外加一位校验码,
组成12位数字,主要在美国和加拿大使用。
UPC-E条码商品条码是纯数字,是由UPC-A缩减而成,位数是7位,而且首位必须为0,
在编码过后外加一位校验码,组成8位数字。
*/
BitMatrix matrix=new MultiFormatWriter().encode(contents,BarcodeFormat.CODE_128,
width-offset, height);
// BitMatrix matrix=new MultiFormatWriter().encode(contents, BarcodeFormat.EAN_13,
width-offset, height);
MatrixToImageWriter.writeToStream(matrix, FORMAT, new FileOutputStream(new File(dest)));
}
/**
* 解析条形码
* @param dest 要解码的图片地址
* @return String 条形码内容
*/
public static String decode(String dest) throws IOException, NotFoundException{
BufferedImage image=ImageIO.read(new File(dest));
LuminanceSource source=new BufferedImageLuminanceSource(image);
BinaryBitmap imageBinaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result = new MultiFormatReader().decode(imageBinaryBitmap,null);
return result.getText();
}
/**
* 以条形码 693 69838 0001 3 为例
此条形码分为4个部分,从左到右分别为:
1-3位:共3位,对应该条码的693,是中国的国家代码之一。
(690--695都是中国大陆的代码,由国际上分配)
4-8位:共5位,对应该条码的69838,代表着生产厂商代码,由厂商申请,国家分配
9-12位:共4位,对应该条码的0001,代表着厂内商品代码,由厂商自行确定
第13位:共1位,对应该条码的3,是校验码,依据一定的算法,由前面12位数字计算而得到
(公式第13位算法
1:取出该数的奇数位的和,c1=6+3+9+3+0+0=21;
2:取出该数的偶数位的和,c2=9+6+8+8+0+1=32;
3:将奇数位的和与“偶数位的和的三倍”相加。
4:取出结果的个位数:117(117%10=7);
5:用10减去这个个位数:10-7=3;
6:对得到的数再取个位数(对10去余)3%10=3
参考:<a href="http://baike.baidu.com/view/13740.htm?fr=aladdin">百度百科-条形码
* @return String 校验码
*/
public static String checksum(String countryCode,String factoryCode,String productCode)
throws Exception{
String temp=countryCode+factoryCode+productCode;
if(!(isNumber(countryCode)&&isNumber(factoryCode)&&isNumber(productCode))){
throw new Exception("不能含有非数字字符");
}
if(countryCode.length()!=3){
throw new Exception("国家地区代码不合规范,必须3位");
}
if(factoryCode.length()!=5){
throw new Exception("厂商代码不合规范,必须5位");
}
if(productCode.length()!=4){
throw new Exception("产品代码不合规范,必须4位");
}
char []code=temp.toCharArray();
int oddSum=0;
int evenSum=0;
for(int i=0;i<code.length;i++){
if((i+1)%2==1){
oddSum+=Integer.valueOf(code[i]+"");
}else{
evenSum+=Integer.valueOf(code[i]+"");
}
}
int digit=(10-((oddSum+evenSum*3)%10))%10;
return temp+digit;
}
/**
* 校验数字
* @param number 数字
* @return Boolean
*/
public static boolean isNumber(String number) {
if (null == number || "".equals(number))
return false;
String regex = "[0-9]*";
return number.matches(regex);
}
/** 测试程序是否正常
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
System.out.println("校验并写入:"+checksum("695", "32321", "2133"));
SimpleCodeUtil.encode(checksum("695", "32321", "2133"), "C:\\Target.PNG", 192, 60,10);
System.out.println("解析结果:"+BarCode.decode("C:\\Target.PNG"));
//生成19位一维码,需要修改成为:BarcodeFormat.CODE_128
SimpleCodeUtil.encode("1602071443012001406", "F:\\Target.PNG", 192, 60,10);
}
}
(2)二维码:DoubleCodeUtil.java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
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.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;
public class DoubleCodeUtil{
//输出的图片格式
private static final String FORMAT="PNG";
/**
* 生成一张二维码图片
* @param contents 码的内容
* @param dest 图片输出地址
* @param width 图片宽度(像素)
* @param height 图片高度(像素)
*/
public static void encode(String contents,String dest,int width,int height) throws WriterException, FileNotFoundException, IOException{
contents=new String(contents.getBytes("UTF-8"),"ISO-8859-1");
QRCodeWriter writer=new QRCodeWriter();
BitMatrix matrix=writer.encode(contents, BarcodeFormat.QR_CODE, width, height);
//MatrixToImageWriter.writeToFile(matrix, format, new File(dest)); //过时的方法,所以不推荐使用
MatrixToImageWriter.writeToStream(matrix, FORMAT, new FileOutputStream(new File(dest)));
}
/**
* 从一张图片解析出二维码信息
* @param dest 目标地址
* @return String 二维码信息
* @throws IOException
* @throws NotFoundException
* @throws ChecksumException
* @throws FormatException
*/
public static String decode(String dest) throws IOException, NotFoundException, ChecksumException, FormatException{
QRCodeReader reader=new QRCodeReader();
BufferedImage image=ImageIO.read(new File(dest));
LuminanceSource source=new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap imageBinaryBitmap = new BinaryBitmap(binarizer );
Result result = reader.decode(imageBinaryBitmap);
//System.out.println("result = "+ result.toString());
// System.out.println("resultFormat = "+ result.getBarcodeFormat());
//返回解析结果
return result.getText();
}
//测试是否正确
public static void main(String[] args) throws WriterException, IOException, NotFoundException, ChecksumException, FormatException {
//生成二维码图片
DoubleCodeUtil.encode("http://www.xdemo.org/", "F:\\123.png", 192, 200);
//解析二维码内容
System.out.println(DoubleCodeUtil.decode("F:\\123.png"));
}
}