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");
}
}