java生成一维码和二维码
来源:互联网 发布:北京学唱歌 知乎 编辑:程序博客网 时间:2024/05/22 13:22
这两天想了解一下二维码是怎样生成的。然后在网上看了很多资料,也有很多源码可以直接用的。我也没有自己写,也是拿着源码进行看和修改的,然后生成自己想要的二维码和一维码,还是很不错的,所以分享一下。
首先第一步,需要导入jar包,我把我用的jar包放上来吧
jar包下载链接:http://download.csdn.net/download/qq_27790011/10046325
将包导入好项目之后就可以开始写代码了,先来谈谈一个简单的生成二维码和一维码。想直接使用的可以复制代码之直接可以用。
下面是MatrixUtil 类,全部生成一维码和二维码的方法都在里面,不过都是生成最简单的样式,样式可以自己修改。
package com.zlf.qrcode2;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.WriterException; //import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import javax.imageio.ImageIO; import java.io.File; import java.io.OutputStream; import java.io.IOException; import java.util.Hashtable; import java.awt.image.BufferedImage; /** * 使用ZXing2.3,生成条码的辅助类。可以编码、解码。编码使用code包,解码需要javase包。 */ public final class MatrixUtil { private static final String CHARSET = "utf-8"; private static final int BLACK = 0xFF000000; private static final int WHITE = 0xFFFFFFFF; /** * 禁止生成实例,生成实例也没有意义。 */ private MatrixUtil() { } /** * 生成矩阵,是一个简单的函数,参数固定,更多的是使用示范。 * @param text * @return */ public static BitMatrix toQRCodeMatrix(String text, Integer width, Integer height) { if (width == null || width < 300) { width = 300; } if (height == null || height < 300) { height = 300; } // 二维码的图片格式 Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(); // 内容所使用编码 hints.put(EncodeHintType.CHARACTER_SET, CHARSET); BitMatrix bitMatrix = null; try { bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints); } catch (WriterException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 生成二维码 // File outputFile = new File("d:"+File.separator+"new.gif"); // MatrixUtil.writeToFile(bitMatrix, format, outputFile); return bitMatrix; } /** * 将指定的字符串生成二维码图片。简单的使用示例。 * @param text * @param file * @param format * @return */ public boolean toQrcodeFile(String text, File file, String format) { BitMatrix matrix = toQRCodeMatrix(text, null, null); if (matrix != null) { try { writeToFile(matrix, format, file); return true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return false; } /** * 根据点矩阵生成黑白图。 */ public static BufferedImage toBufferedImage(BitMatrix matrix) { int width = matrix.getWidth(); int height = matrix.getHeight(); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE); } } return image; } /** * 将字符串编成一维条码的矩阵 * @param str * @param width * @param height * @return */ public static BitMatrix toBarCodeMatrix(String str, Integer width, Integer height) { if (width == null || width < 200) { width = 200; } if (height == null || height < 50) { height = 50; } try { // 文字编码 Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(); hints.put(EncodeHintType.CHARACTER_SET, CHARSET); BitMatrix bitMatrix = new MultiFormatWriter().encode(str, BarcodeFormat.CODE_128, width, height, hints); return bitMatrix; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 根据矩阵、图片格式,生成文件。 */ public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException { BufferedImage image = toBufferedImage(matrix); if (!ImageIO.write(image, format, file)) { throw new IOException("Could not write an image of format " + format + " to " + file); } } /** * 将矩阵写入到输出流中。 */ public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException { BufferedImage image = toBufferedImage(matrix); if (!ImageIO.write(image, format, stream)) { throw new IOException("Could not write an image of format " + format); } } /** * 解码,需要javase包。 * @param file * @return */ /*public static String decode(File file) { BufferedImage image; try { if (file == null || file.exists() == false) { throw new Exception(" File not found:" + file.getPath()); } image = ImageIO.read(file); LuminanceSource source = new BufferedImageLuminanceSource(image); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Result result; // 解码设置编码方式为:utf-8, Hashtable hints = new Hashtable(); hints.put(DecodeHintType.CHARACTER_SET, CHARSET); result = new MultiFormatReader().decode(bitmap, hints); return result.getText(); } catch (Exception e) { e.printStackTrace(); } return null; } */}
接下来是Test测试类,代码更简单。
package com.zlf.qrcode2;import java.io.File; public class Test { /** * 测试函数。简单地将指定的字符串生成二维码图片。 */ public static void main(String[] args) throws Exception { String text = "1234567890"; String result; String format = "jpg"; //生成二维码 File outputFile = new File("j:"+File.separator+"rqcode.jpg"); MatrixUtil.writeToFile(MatrixUtil.toQRCodeMatrix(text, null, null), format, outputFile); System.out.println("success1"); //result = MatrixUtil.decode(outputFile); //System.out.println(result); //生成条形码 outputFile = new File("j:"+File.separator+"barcode.jpg"); MatrixUtil.writeToFile(MatrixUtil.toBarCodeMatrix(text, null, null), format, outputFile); System.out.println("success2"); //result = MatrixUtil.decode(outputFile); //System.out.println(result); } }
一维码和二维码效果图
接下来主要讲一下二维码的生成吧,因为现在二维码比较火,动不动就手机扫一扫。为了制作一个稍微有特点的二维码。我另起了一个项目,不过jar包还是通用的。然后有这几个类。MatrixToImageWriter类QRCodeFactory类和测试类Qrest
MatrixToImageWriter类主要的功能也是生成二维码图片
package com.zlf.qrcode;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.io.OutputStream;import javax.imageio.ImageIO;import com.google.zxing.common.BitMatrix;/* 二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的,可以将该类直接拷贝到源码中使用,当然你也可以自己写个 生产条形码的基类 */public class MatrixToImageWriter { private static final int BLACK = 0xFF000000;//用于设置图案的颜色 private static final int WHITE = 0xFFFFFFFF; //用于背景色 private MatrixToImageWriter() { } public static BufferedImage toBufferedImage(BitMatrix matrix) { int width = matrix.getWidth(); int height = matrix.getHeight(); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, (matrix.get(x, y) ? BLACK : WHITE));// image.setRGB(x, y, (matrix.get(x, y) ? Color.YELLOW.getRGB() : Color.CYAN.getRGB())); } } return image; } public static void writeToFile(BitMatrix matrix, String format, File file,String logUri) throws IOException { System.out.println("write to file"); BufferedImage image = toBufferedImage(matrix); //设置logo图标 QRCodeFactory logoConfig = new QRCodeFactory(); image = logoConfig.setMatrixLogo(image, logUri); if (!ImageIO.write(image, format, file)) { System.out.println("生成图片失败"); throw new IOException("Could not write an image of format " + format + " to " + file); }else{ System.out.println("图片生成成功!"); } } public static void writeToStream(BitMatrix matrix, String format, OutputStream stream,String logUri) throws IOException { BufferedImage image = toBufferedImage(matrix); //设置logo图标 QRCodeFactory logoConfig = new QRCodeFactory(); image = logoConfig.setMatrixLogo(image, logUri); if (!ImageIO.write(image, format, stream)) { throw new IOException("Could not write an image of format " + format); } }}
QRCodeFactory类的功能主要是编写自己特定制作,比如给二维码添加一个logo,给二维码添加文字说明。
package com.zlf.qrcode;import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.geom.RoundRectangle2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.Hashtable;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatWriter;import com.google.zxing.WriterException;import com.google.zxing.common.BitMatrix;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;/** * 本类用于对我们二维码进行参数的设定,生成我们的二维码: * @author kingwen */public class QRCodeFactory { /** * 给生成的二维码添加中间的logo * @param matrixImage 生成的二维码 * @param logUri logo地址 * @return 带有logo的二维码 * @throws IOException logo地址找不到会有io异常 */ public BufferedImage setMatrixLogo(BufferedImage matrixImage,String logUri) throws IOException{ /** * 读取二维码图片,并构建绘图对象 */ Graphics2D g2 = matrixImage.createGraphics(); int matrixWidth = matrixImage.getWidth(); int matrixHeigh = matrixImage.getHeight(); /** * 读取Logo图片 */ BufferedImage logo = ImageIO.read(new File(logUri)); //开始绘制图片 g2.drawImage(logo,matrixWidth/5*2,matrixHeigh/5*2, matrixWidth/5, matrixHeigh/5, null); //绘制边框 BasicStroke stroke = new BasicStroke(5,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND); // 设置笔画对象 g2.setStroke(stroke); //指定弧度的圆角矩形 RoundRectangle2D.Float round = new RoundRectangle2D.Float(matrixWidth/5*2, matrixHeigh/5*2, matrixWidth/5, matrixHeigh/5,20,20); g2.setColor(Color.white); // 绘制圆弧矩形 g2.draw(round); //设置logo 有一道灰色边框 BasicStroke stroke2 = new BasicStroke(1,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND); // 设置笔画对象 g2.setStroke(stroke2); RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(matrixWidth/5*2+2, matrixHeigh/5*2+2, matrixWidth/5-4, matrixHeigh/5-4,20,20); g2.setColor(new Color(128,128,128)); g2.draw(round2);// 绘制圆弧矩形 Font font = new Font("Freestyle Script", Font.BOLD, 80); g2.setFont(font); g2.drawString("my love", matrixWidth/5*1+50, matrixHeigh/5*4-10); g2.dispose(); matrixImage.flush() ; return matrixImage ; } /** * 创建我们的二维码图片 * @param content 二维码内容 * @param format 生成二维码的格式 * @param outFileUri 二维码的生成地址 * @param logUri 二维码中间logo的地址 * @param size 用于设定图片大小(可变参数,宽,高) * @throws IOException 抛出io异常 * @throws WriterException 抛出书写异常 */ public void CreatQrImage(String content,String format,String outFileUri,String logUri, int ...size) throws IOException, WriterException{ int width = 430; // 二维码图片宽度 430 int height = 430; // 二维码图片高度430 //如果存储大小的不为空,那么对我们图片的大小进行设定 if(size.length==2){ width=size[0]; height=size[1]; }else if(size.length==1){ width=height=size[0]; } Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); // 指定纠错等级,纠错级别(L 7%、M 15%、Q 25%、H 30%) hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 内容所使用字符集编码 hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //hints.put(EncodeHintType.MAX_SIZE, 350);//设置图片的最大值 //hints.put(EncodeHintType.MIN_SIZE, 100);//设置图片的最小值 hints.put(EncodeHintType.MARGIN, 1);//设置二维码边的空度,非负数 BitMatrix bitMatrix = new MultiFormatWriter().encode(content,//要编码的内容 //编码类型,目前zxing支持:Aztec 2D,CODABAR 1D format,Code 39 1D,Code 93 1D ,Code 128 1D, //Data Matrix 2D , EAN-8 1D,EAN-13 1D,ITF (Interleaved Two of Five) 1D, //MaxiCode 2D barcode,PDF417,QR Code 2D,RSS 14,RSS EXPANDED,UPC-A 1D,UPC-E 1D,UPC/EAN extension,UPC_EAN_EXTENSION BarcodeFormat.QR_CODE, width, //条形码的宽度 height, //条形码的高度 hints);//生成条形码时的一些配置,此项可选 // 生成二维码图片文件 File outputFile = new File(outFileUri); //指定输出路径 System.out.println("输出文件路径为"+outputFile.getPath()); MatrixToImageWriter.writeToFile(bitMatrix, format, outputFile,logUri); } }
接下来就是测试Qrest类了,
package com.zlf.qrcode;import java.io.IOException;import com.google.zxing.WriterException;public class Qrest { public static void main(String[] args) { String content="我莫名奇妙的笑了,只因为想到了你。"; String logUri="J:/logs/1.jpg"; //J:\\logs\\author.jpg String outFileUri="J:/logs/qtCode1.jpg"; int[] size=new int[]{430,430}; String format = "jpg"; try { new QRCodeFactory().CreatQrImage(content, format, outFileUri, logUri,size); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WriterException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
这些代码也可以直接复制直接使用的。,现在给看一下我做出来的效果图。
参考的文章比较多,现在也记不得网址了,就不粘出来了,如果有侵权的联系我删除。
阅读全文
0 0
- Java生成,一维码和二维码
- java生成一维码和二维码
- java生成二维码和解析二维码
- JAVA生成二维码和解析二维码
- java 生成和解密二维码
- Java二维码生成和解析
- java二维码工具类:生成二维码和解析二维码
- java二维码 生成二维码
- java生成二维码、条形码和二维码、条形码的解码
- java生成二维码、条形码和二维码、条形码的解码
- java 二维码生成和加密base64压码
- java实现二维码的生成和解析。
- java实现二维码的生成和解析
- java 二维码生成和加密base64压码
- 【java】二维码的生成和使用
- Java 二维码生成基础方法和代码
- java代码实现生成二维码和条形码
- java生成单个和批量二维码
- java 语言 基础 总结【2】- 写在编程之前
- jq:prop()、attr()、data()异同
- C# 获取文件名和扩展名
- redis 与 spring整合 hash 增删改操作 list增删改操作
- Linux驱动获取进程PID和进程名字
- java生成一维码和二维码
- shiro讲解 之 Authorization (三)
- 金网seo工具资源全套软件
- Android bootchart 工具使用
- 初识云计算
- pod【Cocopods在Mac ox 10.13报错】
- React Component组件的详细说明和生命周期
- 读书笔记——《Java 8实战》系列之Lambda表达式(一)
- python opencv 显示图像