swetake包已实现二维码的实现, 但依然需要我们根据数据去画QR Code图,如果需要添加logo到二维码图片上,依然需要我们自己去实现。 所以自己实现了在二维码添加logo图片, 现在把代码分享出来 并附带了详细的注释。
import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.swetake.util.Qrcode; public class QRCodeGenerator { private static String LOGO_IMAGE_PATH = "D:/logo.jpg"; /** * * @param imagePath * @param content * @param fileName * @param suffix * @return */ public String generateInstantQrCode(String imagePath, String content, String fileName, String suffix) { String imageURL = ""; try { byte[] contentBytes = content.getBytes("UTF-8"); if (contentBytes.length > 0) { Qrcode qrcodeHandler = new Qrcode(); qrcodeHandler.setQrcodeErrorCorrect('M'); //纠错码,每一个类型的代表着不同的字码可被纠正。 类型: L(7%),M(15%),Q(25%),H(30%), 这也是为什么有些二维码残缺,或者中间有一个比较大的Logo照样能够被扫描的原因。 qrcodeHandler.setQrcodeEncodeMode('B'); //B,A,N qrcodeHandler.setQrcodeVersion(0); //0-40 boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); //计算二维码数据 int imageWidth = 250; //设定图片固定宽度为250 int times = 250/codeOut.length; //计算约定好的宽度类出现二维码数据图的个数 BufferedImage bufImg = new BufferedImage( times * codeOut.length, times * codeOut.length, BufferedImage.TYPE_INT_RGB); //生成image buffer用于准备画图对象 Graphics2D gs = bufImg.createGraphics(); //生成画图对象 gs.setBackground(Color.WHITE); //给二维码图片设定背景图 /*gs.clearRect(0, 0, codeOut.length * 3 + 3, codeOut.length * 3 + 3);*/ gs.clearRect(0, 0, times * codeOut.length, times * codeOut.length); //清楚画布上的内容 gs.setColor(Color.BLACK); // Set image color:BLACK 设置二维码数据图片的颜色 // Set the offset, if not may cause a parse error int pixoff = 2; /**draw logo image*/ Image logoImg = ImageIO.read(new File(LOGO_IMAGE_PATH)); //读取logo文件至image对象,以便用于将logo的图片内容画入二维码 //System.out.println("----" + logoImg.getHeight(null)); int middleX = (codeOut.length * times)/2 - logoImg.getWidth(null)/2 ; //计算出logo在二维码上的位置的宽 int middleY = (codeOut.length * times)/2 - logoImg.getHeight(null)/2; //计算出logo在二维码上的位置的高 // The output : QR code for (int i = 0; i < codeOut.length; i++) { for (int j = 0; j < codeOut.length; j++) { if (codeOut[j][i]) { gs.fillRect(j * times + pixoff, i * times + pixoff, times, times); //将每个数据点画入二维码 } } } // autoHeight = codeOut.length * 3 + 3; // gs.clearRect(0, 0, autoHeight, autoHeight); gs.drawImage(logoImg, middleX, middleY, null); //将logo画入二维码图片 gs.dispose(); bufImg.flush(); imageURL = imagePath + fileName + "." + suffix; File imgFile = new File(imageURL); ImageIO.write(bufImg, suffix, imgFile); //将最终的二维图片写入文件 } } catch (Exception e) { e.printStackTrace(); } return imageURL; } public static void main(String []args) { QRCodeGenerator q = new QRCodeGenerator(); q.generateInstantQrCode("d:/qrCode/", "aaweeeeeeeeeeeeeeeeeeeeeeeeeeeeeefdsaaaaaaaaaaaasdffdsaaaaaaaaaaaaaf", "qrcode_test", "jpeg"); } }