[Java基础]– 生成一维码图片(2种方式)

[Java基础]– 生成一维码图片(2种方式)方式一 生成一维码 使用架包 gt jbarcode jar 点击打开链接实现代码可以直接使用 如下 importjava awt image BufferedImag importjav

大家好,欢迎来到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

(0)
上一篇 2025-11-11 17:10
下一篇 2025-11-11 17:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信