java生成带有图片的二维码

1.原始代码如下:

package com.mycompany.qrcodeutil;

/**
 * @author Alexs
 * @date 20181224 13:35:01
 * @email [email protected]
 * @version V1.0
 * @desc
 */
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.imageio.ImageIO;

import com.swetake.util.Qrcode;
import java.awt.Image;
import java.io.InputStream;
import java.io.OutputStream;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

public class QRCodeUtil {
    //设置二维码中间图片的宽高

    private int imageWidth = 30;
    private int imageHeight = 30;
    private String codeType = "utf-8";
    private BufferedImage qrCodeEncode(String content, String imgType, int size) {
        BufferedImage bufImg = null;
        try {
            Qrcode qrcodeHandler = new Qrcode();
// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小  
            qrcodeHandler.setQrcodeErrorCorrect('M');
            qrcodeHandler.setQrcodeEncodeMode('B');
// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大  
            qrcodeHandler.setQrcodeVersion(size);
// 获得内容的字节数组,设置编码格式  
            byte[] contentBytes = content.toString().getBytes(codeType);
// 图片尺寸  
            int imgSize = 67 + 12 * (size - 1);
            bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
            Graphics2D gs = bufImg.createGraphics();
// 设置背景颜色  
            gs.setBackground(Color.WHITE);
            gs.clearRect(0, 0, imgSize, imgSize);
// 设定图像颜色> BLACK  
            gs.setColor(Color.BLACK);
// 设置偏移量,不设置可能导致解析出错  
            int pixoff = 2;
// 输出内容> 二维码  
            if (contentBytes.length > 0 && contentBytes.length < 800) {
                boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
                for (int i = 0; i < codeOut.length; i++) {
                    for (int j = 0; j < codeOut.length; j++) {
                        if (codeOut[j][i]) {
                            gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                        }
                    }
                }
            } else {
                throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
            }
            gs.dispose();
            bufImg.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bufImg;
    }

    /**
     * 解析二维码,返回解析内容
     *
     * @param imageFile
     * @return
     */
    public String qrCodeDecode(File imageFile) throws IOException {
        String decodedData = null;
        QRCodeDecoder decoder = new QRCodeDecoder();
        //File file = new File("E:/baoqun.jpg");//本地图片
        //BufferedImage image = (BufferedImage)ImageIO.read(file);;  
        BufferedImage image = null;
        try {
            image = ImageIO.read(imageFile);
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }

        try {
            decodedData = new String(decoder.decode(new J2SEImage(image)), "GBK");
        } catch (DecodingFailedException dfe) {
            System.out.println("Error: " + dfe.getMessage());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return decodedData;
    } 
       /** 
     * 解析二维码(QRCode) 
     * 
     * @param input 输入流 
     * @return 
     */
    public String decoderQRCode(InputStream input) {
        BufferedImage bufImg = null;
        String content = null;
        try {
            bufImg = ImageIO.read(input);
            QRCodeDecoder decoder = new QRCodeDecoder();
            content = new String(decoder.decode(new J2SEImage(bufImg)), codeType);
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
            e.printStackTrace();
        } catch (DecodingFailedException dfe) {
            System.out.println("Error: " + dfe.getMessage());
            dfe.printStackTrace();
        }
        return content;
    }

    static class J2SEImage implements QRCodeImage {

        BufferedImage image;

        public J2SEImage(BufferedImage image) {
            this.image = image;
        }

        public int getWidth() {
            return image.getWidth();
        }

        public int getHeight() {
            return image.getHeight();
        }

        public int getPixel(int x, int y) {
            return image.getRGB(x, y);
        }
    }
       /**
     * 在二维码中间加入图片
     * @param bugImg
     * @String imgFile
     */
    private BufferedImage createPhotoAtCenter(BufferedImage bufImg, String imgFile) throws Exception {
        Image im = ImageIO.read(new File(imgFile));
        Graphics2D g = bufImg.createGraphics();
         //获取bufImg的中间位置
        int centerX = bufImg.getMinX() + bufImg.getWidth() / 2 - imageWidth / 2;
        int centerY = bufImg.getMinY() + bufImg.getHeight() / 2 - imageHeight / 2;
        g.drawImage(im, centerX, centerY, imageWidth, imageHeight, null);
        g.dispose();
        bufImg.flush();
        return bufImg;
    }
        /** 
             * 生成二维码(QRCode)图片 
             * @param content 存储内容 
             * @param imgPath 中间图片路径 
             * @param imgType 图片类型 
             * @param outpath 输出二维码文件
        */
    public BufferedImage encoderQRCode(String content, String imgPath, String imgType, int size, String outpath) {
        try {
            BufferedImage bufImg = this.qrCodeEncode(content, imgType, size);
             //在二维码中间加入图片
            BufferedImage _bufImg = createPhotoAtCenter(bufImg, imgPath);
            File imgFile = new File(outpath);
            // 生成二维码QRCode图片  
            ImageIO.write(_bufImg, imgType, imgFile);
            return _bufImg;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
        /** 
     * 生成二维码(QRCode)图片 
     * @param content 存储内容 
     * @param output 输出流 
     * @param imgType 图片类型 
     * @param size 二维码尺寸 
     */
    public void encoderQRCode(String content, OutputStream output, String imgType, int size) {
        try {
            BufferedImage bufImg = this.qrCodeEncode(content, imgType, size);//生成二维码QRCode图片  
            ImageIO.write(bufImg, imgType, output);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        String imgPath = "E:/baoqun.jpg";//本地图片
        String filePath = "d:/qrcode.png";//生成的二维码
        // 二维码内容  
        String encodeddata = "http://www.powermaxtech.net/";
        QRCodeUtil QRCodeUtil2 = new QRCodeUtil();
        // QRCodeUtil0.qrCodeEncode(encodeddata, qrFile);(encoderContent, imgPath, imgType, size,imgoutPath);
        QRCodeUtil2.encoderQRCode(encodeddata, imgPath, "png", 7, filePath);
        // 解码  
        // String reText = QRCodeUtil2.decoderQRCode(filePath);
        System.out.println(QRCodeUtil2);
    }
}

需要的java包 :QRCode.jar
需要的图片:
E:/baoqun.jpg
java生成带有图片的二维码_第1张图片
2.结果:(d:/qrcode.png)
java生成带有图片的二维码_第2张图片

你可能感兴趣的:(java生成带有图片的二维码)