[Java基础]-- 生成一维码图片(2种方式)
方式一(生成一维码):使用架包-->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]; privateConstructor.setAccessible(true); return (BarcodeEncoder)privateConstructor.newInstance(); } //获得图片字节码数组private static byte[] getImageBytes(BufferedImage paramBufferedImage) throws IOException{ return ImageUtil.encode(paramBufferedImage,"jpeg", 96, 100); } }
方式二(生成一维码和二维码):在eclipse中生成(此方法比方式一好用!)
1、pox.xml内容
4.0.0
maven_ssm
ssm
war
0.0.1-SNAPSHOT
ssm Maven Webapp
http://maven.apache.org
junit
junit
3.8.1
test
javax
javaee-api
7.0
junit
junit
4.11
test
com.google.zxing
core
3.1.0
com.google.zxing
javase
3.1.0
ssm
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";/**
* 生成条形码
* 注意条形码的宽度不能等于图片的宽度,否则解析不出来,如果解析不出来,请加大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
参考:百度百科-条形码
* @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
(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"));
}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
