swetake实现生成带logo的二维码

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

你可能感兴趣的:(swetake实现生成带logo的二维码)