最近工作中经常要用到QrCode二维码,研究了一下,写了个带圆角LOGO的JAVA实现,QrCode之所以能在中间放个LOGO图标,是因为编码时的信息冗余。实现的具体代码如下:
方法接口:
import java.io.File;
import java.io.OutputStream;
public interface QRCodeService {
public void generateToStream(String code, OutputStream stream);
public void generateToStream(String code, OutputStream stream, int width);
public void generateToStream(String code, OutputStream stream, int width, int frontColor);
public void generateToStream(String code, OutputStream stream, int width, int frontColor, File logo);
}
接口实现类:
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
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;
@Service("qrCodeService")
public class QRCodeServiceImpl implements QRCodeService {
private static final Logger LOGGER = LoggerFactory.getLogger(QRCodeServiceImpl.class);
// 二维码的宽
private static int WIDTH = 250;
// 中间图片的宽
private static int IMGWIDTH = 60;
// 圆角半径
private static int RADIUS = 10;
// 留白填充宽度
private static int MARGIN = 4;
private static int FRONTCOLOR = 0x00000000;//0x00808080;
/**
* 功能描述:生成普通二维码到输出流
*/
@Override
public void generateToStream(String code, OutputStream stream) {
this.generateToStream(code, stream, WIDTH, FRONTCOLOR, null);
}
@Override
public void generateToStream(String code, OutputStream stream, int width) {
this.generateToStream(code, stream, width, FRONTCOLOR, null);
}
@Override
public void generateToStream(String code, OutputStream stream, int width, int frontColor) {
this.generateToStream(code, stream, width, frontColor, null);
}
@Override
public void generateToStream(String code, OutputStream stream, int width, int frontColor, File logo) {