zxing 生成二维码,可设置logo、二维码颜色、白边大小
2016-07-10 17:03
771 查看
主要是使用google的zxing 生成二维码,可设置logo、二维码前景色/后景色、白边大小、二维码大小
1、用到jar包
2、生成二维码参数类
3、生成二维码工具类
4、自定义异常类
/**
* @copyright @2015-2016 Abel-Studio.All Rights Reserved
*/
package com.abel.tools.qrcode;
/**
* @description
* @author Abel.lin
* @date 2016年7月10日 下午4:41:41
*/
public class QRParamsException extends Exception {
private static final long serialVersionUID = 8837582301762730656L;
public QRParamsException() {} //用来创建无参数对象
public QRParamsException(String message) { //用来创建指定参数对象
super(message); //调用超类构造器
}
}
项目源码下载:http://download.csdn.net/detail/rongku/9572265
1、用到jar包
<dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.1.0</version> </dependency>
2、生成二维码参数类
/** * @copyright @2015-2016 Abel-Studio.All Rights Reserved */ package com.abel.tools.qrcode; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * @description * @author Abel.lin * @date 2016年7月10日 下午4:41:41 */ public class QRCodeParams { private String txt; //二维码内容 private String qrCodeUrl; //二维码网络路径 private String filePath; //二维码生成物理路径 private String fileName; //二维码生成图片名称(包含后缀名) private String logoPath; //logo图片 private Integer width = 300; //二维码宽度 private Integer height = 300; //二维码高度 private Integer onColor = 0xFF000000; //前景色 private Integer offColor = 0xFFFFFFFF; //背景色 private Integer margin = 1; //白边大小,取值范围0~4 private ErrorCorrectionLevel level = ErrorCorrectionLevel.L; //二维码容错率 public String getTxt() { return txt; } public void setTxt(String txt) { this.txt = txt; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public Integer getWidth() { return width; } public void setWidth(Integer width) { this.width = width; } public Integer getHeight() { return height; } public void setHeight(Integer height) { this.height = height; } public String getQrCodeUrl() { return qrCodeUrl; } public void setQrCodeUrl(String qrCodeUrl) { this.qrCodeUrl = qrCodeUrl; } public String getLogoPath() { return logoPath; } public void setLogoPath(String logoPath) { this.logoPath = logoPath; } public Integer getOnColor() { return onColor; } public void setOnColor(Integer onColor) { this.onColor = onColor; } public Integer getOffColor() { return offColor; } public void setOffColor(Integer offColor) { this.offColor = offColor; } public ErrorCorrectionLevel getLevel() { return level; } public void setLevel(ErrorCorrectionLevel level) { this.level = level; } /** * 返回文件后缀名 * @return */ public String getSuffixName(){ String imgName = this.getFileName(); if(imgName != null && !"".equals(imgName)){ String suffix=fileName.substring(fileName.lastIndexOf(".")+1); return suffix; } return ""; } public Integer getMargin() { return margin; } public void setMargin(Integer margin) { this.margin = margin; } }
3、生成二维码工具类
/** * @copyright @2015-2016 Abel-Studio.All Rights Reserved */ package com.abel.tools.qrcode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; 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.client.j2se.MatrixToImageConfig; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * @description * @author Abel.lin * @date 2016年7月10日 下午4:41:41 */ public class QRCodeUtil { private static int width = 300; //二维码宽度 private static int height = 300; //二维码高度 private static int onColor = 0xFF000000; //前景色 private static int offColor = 0xFFFFFFFF; //背景色 private static int margin = 1; //白边大小,取值范围0~4 private static ErrorCorrectionLevel level = ErrorCorrectionLevel.L; //二维码容错率 /** * 生成二维码 * @param params * QRCodeParams属性:txt、fileName、filePath不得为空; * @throws QRParamsException */ public static void generateQRImage(QRCodeParams params)throws QRParamsException{ if(params == null || params.getFileName() == null || params.getFilePath() == null || params.getTxt() == null){ throw new QRParamsException("参数错误"); } try{ initData(params); String imgPath = params.getFilePath(); String imgName = params.getFileName(); String txt = params.getTxt(); if(params.getLogoPath() != null && !"".equals(params.getLogoPath().trim())){ generateQRImage(txt, params.getLogoPath(), imgPath, imgName, params.getSuffixName()); }else{ generateQRImage(txt, imgPath, imgName, params.getSuffixName()); } }catch(Exception e){ e.printStackTrace(); } } /** * 生成二维码 * @param txt //二维码内容 * @param imgPath //二维码保存物理路径 * @param imgName //二维码文件名称 * @param suffix //图片后缀名 */ public static void generateQRImage(String txt, String imgPath, String imgName, String suffix){ File filePath = new File(imgPath); if(!filePath.exists()){ filePath.mkdirs(); } File imageFile = new File(imgPath,imgName); Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); // 指定纠错等级 hints.put(EncodeHintType.ERROR_CORRECTION, level); // 指定编码格式 hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); hints.put(EncodeHintType.MARGIN, margin); //设置白边 try { MatrixToImageConfig config = new MatrixToImageConfig(onColor, offColor); BitMatrix bitMatrix = new MultiFormatWriter().encode(txt,BarcodeFormat.QR_CODE, width, height, hints); // bitMatrix = deleteWhite(bitMatrix); MatrixToImageWriter.writeToPath(bitMatrix, suffix, imageFile.toPath(), config); } catch (Exception e) { e.printStackTrace(); } } /** * 生成带logo的二维码图片 * @param txt //二维码内容 * @param logoPath //logo绝对物理路径 * @param imgPath //二维码保存绝对物理路径 * @param imgName //二维码文件名称 * @param suffix //图片后缀名 * @throws Exception */ public static void generateQRImage(String txt, String logoPath, String imgPath, String imgName, String suffix) throws Exception{ File filePath = new File(imgPath); if(!filePath.exists()){ filePath.mkdirs(); } if(imgPath.endsWith("/")){ imgPath += imgName; }else{ imgPath += "/"+imgName; } Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); hints.put(EncodeHintType.ERROR_CORRECTION, level); hints.put(EncodeHintType.MARGIN, margin); //设置白边 BitMatrix bitMatrix = new MultiFormatWriter().encode(txt, BarcodeFormat.QR_CODE, width, height, hints); File qrcodeFile = new File(imgPath); writeToFile(bitMatrix, suffix, qrcodeFile, logoPath); } /** * * @param matrix 二维码矩阵相关 * @param format 二维码图片格式 * @param file 二维码图片文件 * @param logoPath logo路径 * @throws IOException */ public static void writeToFile(BitMatrix matrix,String format,File file,String logoPath) throws IOException { BufferedImage image = toBufferedImage(matrix); Graphics2D gs = image.createGraphics(); int ratioWidth = image.getWidth()*2/10; int ratioHeight = image.getHeight()*2/10; //载入logo Image img = ImageIO.read(new File(logoPath)); int logoWidth = img.getWidth(null)>ratioWidth?ratioWidth:img.getWidth(null); int logoHeight = img.getHeight(null)>ratioHeight?ratioHeight:img.getHeight(null); int x = (image.getWidth() - logoWidth) / 2; int y = (image.getHeight() - logoHeight) / 2; gs.drawImage(img, x, y, logoWidth, logoHeight, null); gs.setColor(Color.black); gs.setBackground(Color.WHITE); gs.dispose(); img.flush(); if(!ImageIO.write(image, format, file)){ throw new IOException("Could not write an image of format " + format + " to " + file); } } 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) ? onColor : offColor); } } return image; } public static BitMatrix deleteWhite(BitMatrix matrix){ int[] rec = matrix.getEnclosingRectangle(); int resWidth = rec[2] + 1; int resHeight = rec[3] + 1; BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); resMatrix.clear(); for (int i = 0; i < resWidth; i++) { for (int j = 0; j < resHeight; j++) { if (matrix.get(i + rec[0], j + rec[1])) resMatrix.set(i, j); } } return resMatrix; } private static void initData(QRCodeParams params){ if(params.getWidth() != null){ width = params.getWidth(); } if(params.getHeight() != null){ height = params.getHeight(); } if(params.getOnColor() != null){ onColor = params.getOnColor(); } if(params.getOffColor() != null){ offColor = params.getOffColor(); } if(params.getLevel() != null){ level = params.getLevel(); } } }
4、自定义异常类
/**
* @copyright @2015-2016 Abel-Studio.All Rights Reserved
*/
package com.abel.tools.qrcode;
/**
* @description
* @author Abel.lin
* @date 2016年7月10日 下午4:41:41
*/
public class QRParamsException extends Exception {
private static final long serialVersionUID = 8837582301762730656L;
public QRParamsException() {} //用来创建无参数对象
public QRParamsException(String message) { //用来创建指定参数对象
super(message); //调用超类构造器
}
}
项目源码下载:http://download.csdn.net/detail/rongku/9572265
相关文章推荐
- 马化腾亲自“站台” 企业微信和个人微信互通能带来什么?
- 批处理制作二维码生成器
- jQuery qrcode生成二维码的方法
- 使用jquery.qrcode.min.js实现中文转化二维码
- jquery插件qrcode在线生成二维码
- JavaScript生成二维码图片小结
- php制作中间带自己定义图片二维码的方法
- zbar解码二维码和条形码示例
- php使用qr生成二维码的示例分享
- php实现扫描二维码根据浏览器类型访问不同下载地址
- PHP微信开发之二维码生成类
- asp.net(C#)使用QRCode生成图片中心加Logo或图像的二维码实例
- PHP QRCODE生成彩色二维码的方法
- Jquery 类网页微信二维码图块滚动效果具体实现
- Android仿微信二维码和条形码
- 微信QQ的二维码登录原理js代码解析
- ASP.NET生成二维码的方法总结
- 使用PHP生成二维码的方法汇总
- Perl生成纯HTML代码二维码实例
- Symfony生成二维码的方法