大家好,欢迎来到IT知识分享网。
方式一(生成一维码):使用架包–>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(""); //生成的图片高度是固定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内容
<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")); } }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/118645.html