把生成的二维码跟图片以BASE64输出给浏览器

包:链接:https://pan.baidu.com/s/1MampoA6ZQa9nhjBt-N9v2A 
提取码:o2fm 
 

base64在浏览器中显示:

<img src=“http://www.letuknowit.com/images/wg.png”/>
也可以这样显示:
<img src=“data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNo8zjsOxCAMBFB/KEAUFFR0Cbng3nQPw68ArZdAlOZppPFIBhH5EAB8b+Tlt9MYQ6i1BuqFaq1CKSVcxZ2Acs6406KUgpt5/LCKuVgz5BDCSb13ZO99ZOdcZGvt4mJjzMVKqcha68iIePB86GAiOv8CDADlIUQBs7MD3wAAAABJRU5ErkJggg%3D%3D”/>

 

package com.utils.jointImg;

/**
 * Copyright:
 * FileName: QRCodeMax
 * Author:   
 * Date:     2019/4/30 13:50
 * Description: 生成二维码跟背景图拼接
 * History:
 */

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

/**
 * 类名称:QRCodeMax
 * 类描述:生成二维码图片+背景+文字描述工具类
 * 修改备注:更新有参数构造
 * @version: 2.0
 *
 */
public class QRCodeMax {


    //文字显示
    private static final int QRCOLOR = 0x201f1f; // 二维码颜色:黑色
    private static final int BGWHITE = 0xFFFFFF; //二维码背景颜色:白色


    // 设置QR二维码参数信息
    private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
        private static final long serialVersionUID = 1L;
        {
            put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 设置QR二维码的纠错级别(H为最高级别)
            put(EncodeHintType.CHARACTER_SET, "utf-8");// 设置编码方式
            put(EncodeHintType.MARGIN, 0);// 白边
        }
    };

    /**
     * 生成二维码图片+背景+文字描述
     * @param codeFile 生成图地址
     * @param bgImgFile 背景图地址
     * @param WIDTH 二维码宽度
     * @param HEIGHT 二维码高度
     * @param qrUrl 二维码识别地址
     * @param note  文字描述1
     * @param tui   文字描述2
     * @param size 文字大小
     * @param imagesX 二维码x轴方向
     * @param imagesY 二维码y轴方向
     * @param text1X 文字描述1x轴方向
     * @param text1Y 文字描述1y轴方向
     * @param text2X 文字描述2x轴方向
     * @param text2Y 文字描述2y轴方向
     */
    public static String CreatQRCode(File codeFile, File bgImgFile, Integer WIDTH, Integer HEIGHT, String qrUrl,
                                             String note, String tui, Integer size, Integer imagesX, Integer imagesY, Integer text1X, Integer text1Y
            , Integer text2X, Integer text2Y) {
        String binary = null;
        Hashtable hints = new Hashtable();
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

        try {
            MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
            // 参数顺序分别为: 编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
            BitMatrix bm = multiFormatWriter.encode(qrUrl, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
           // BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

            BufferedImage image = toBufferedImage(bm);
            ByteArrayOutputStream out = new ByteArrayOutputStream();

            // 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF) 白(0xFF000000)两色
            for (int x = 0; x < WIDTH; x++) {
                for (int y = 0; y < HEIGHT; y++) {
                    image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGWHITE);
                }
            }

            /*
             * 	添加背景图片
             */

            BufferedImage backgroundImage = ImageIO.read(bgImgFile);
            int bgWidth=backgroundImage.getWidth();
            int qrWidth=image.getWidth();
            //距离背景图片x边的距离,居中显示
            int disx=(bgWidth-qrWidth)-imagesX;

            //距离y边距离 * * * *
            int disy=imagesY;

            Graphics2D rng=backgroundImage.createGraphics();
            rng.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP));
            rng.drawImage(image,disx,disy,WIDTH,HEIGHT,null);

            /*
             * 	文字描述参数设置
             */

            Color textColor=Color.white;
            rng.setColor(textColor);
            rng.drawImage(backgroundImage,0,0,null);
            //设置字体类型和大小(BOLD加粗/ PLAIN平常)
            rng.setFont(new Font("微软雅黑,Arial",Font.BOLD,size));
            //设置字体颜色
            rng.setColor(Color.black);
            int strWidth=rng.getFontMetrics().stringWidth(note);

            //文字1显示位置
            int disx1=(bgWidth-strWidth)-text1X;//左右
            rng.drawString(note,disx1,text1Y);//上下

            //文字2显示位置
            int disx2=(bgWidth-strWidth)-text2X;//左右
            rng.drawString(tui,disx2,text2Y);//上下

            rng.dispose();
            image=backgroundImage;
            image.flush();
            InputStream is =null;
            //ImageIO.write(image, "png", codeFile);
            //写入、格式、写出
            ImageIO.write(image, "png", out);
            byte[] bytes = out.toByteArray();

            // 将字节数组转为二进制
            BASE64Encoder encoder = new BASE64Encoder();
            binary = encoder.encodeBuffer(bytes).trim();

           
        } catch (Exception e) {
            e.printStackTrace();
        }
        return binary;
    }

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args)  {

        File bgImgFile=new File("E:/code.png");//背景图片
        File QrCodeFile = new File("E:/index.png");//生成图片位置
        String url = "https://www.baidu.com";//二维码链接
        String note = "" ;//文字描述
        String tui = "" ;//文字描述


        //宣传二维码生成
        //生成图地址,背景图地址,二维码宽度,二维码高度,二维码识别地址,文字描述1,文字描述2,文字大小,图片x轴方向,图片y轴方向,文字1||2xy轴方向
        CreatQRCode(QrCodeFile,bgImgFile, 180, 180, url, note,tui, 38, 339, 961, 0, 0, 410, 210);

        //System.out.println( CreatQRCode(QrCodeFile,bgImgFile, 180, 180, url, note,tui, 38, 339, 961, 0, 0, 410, 210));
    }


  /*  public static String creatRrCode(String contents, int width, int height) {
        String binary = null;
        Hashtable hints = new Hashtable();
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(
                    contents, BarcodeFormat.QR_CODE, width, height, hints);
            // 1、读取文件转换为字节数组
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            BufferedImage image = toBufferedImage(bitMatrix);
            //转换成png格式的IO流
            ImageIO.write(image, "png", out);
            byte[] bytes = out.toByteArray();

            // 2、将字节数组转为二进制
            BASE64Encoder encoder = new BASE64Encoder();
            binary = encoder.encodeBuffer(bytes).trim();
        } catch (WriterException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return binary;
    }*/

    /**
     * image流数据处理
     *
     * @author ianly
     */
    public static BufferedImage toBufferedImage(BitMatrix matrix) {
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                image.setRGB(x, y, matrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
            }
        }
        return image;
    }


}

 

 

另一种生成二维码的方式:

package com.utils.jointImg;

import com.swetake.util.Qrcode;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.UnsupportedEncodingException;

/**
 * Copyright:2019, 
 * FileName: tojoinImg
 * Author:   lixionghao
 * Date:     2019/4/30 10:35
 * Description: 图片二维码拼接
 * History:
 */

public class tojoinImg {
    /**
     * @param content 二维码存储的内容
     * @param imgType 生成二维码的数据格式
     * @param size
     * @return
     */
    private BufferedImage qRCodeCommon(String content, String imgType, int size) {
        Qrcode qrcode = new Qrcode();
        qrcode.setQrcodeErrorCorrect('M');// 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关qrcode.setQrcodeEncodeMode('B');

        qrcode.setQrcodeVersion(7);// 设置Qrcode包的版本

        BufferedImage bi = null;
        try {
            byte[] d = content.getBytes("GBK");
            bi = new BufferedImage(139, 139, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bi.createGraphics();
            g.setBackground(Color.WHITE);// 设置背景颜色(白色)
            g.clearRect(0, 0, 139, 139); // 矩形 X、Y、width、height
            g.setColor(Color.BLACK); // 设置图像颜色(黑色)
            if (d.length > 0 && d.length < 123) {
                boolean[][] b = qrcode.calQrcode(d);
                for (int i = 0; i < b.length; i++) {
                    for (int j = 0; j < b.length; j++) {
                        if (b[j][i]) {
                            g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
                        }
                    }
                }
            }
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } // 字符集
        return bi;

    }

    public static void main(String[] args) {
       /* String content = "我要生成的内容";
        tojoinImg img = new tojoinImg();
        try{
            BufferedImage bufImg = img.qRCodeCommon(content, "png", 14);

            //指定要生成的图片路径
            File file = new File("E:/a.jpg");

            // 生成二维码QRCode图片
            ImageIO.write(bufImg, "jpg", file);
        } catch(Exception e){
            e.printStackTrace();
        }*/


      /*  try {
            *//*Student stu = new Student("test", 11);
            stu.setId(10);*//*
            getQrocodeImg("http://baidu.com", "E:/timg.jpg","F:/timg.jpg");
        } catch (Exception e) {
            e.printStackTrace();
        }*/

    }

    /**
     * 生成二维码工具类
     * 二维码生成核心方法
     * @param content 二维码存储的内容
     * @param imgPath 二维码图片路径
     * @param logoPath 中间logo的图片路径
     * @throws Exception 异常
     */
    public static void  getQrocodeImg(String content,String imgPath,String logoPath)
            throws Exception{
        //实例化qecode对象
        Qrcode qrcode = new Qrcode();
        //设置排错率15%空间 错误信息
        qrcode.setQrcodeErrorCorrect('M');
        //二维码存储内容的编码集
        qrcode.setQrcodeEncodeMode('B');
        //设置二维码的版本 1-40 值越大尺寸越大,可存储的信息越大
        qrcode.setQrcodeVersion(15);

        //准备绘制二维码 画画条件:画板 画笔
        int width = 235;     //宽
        int height = 235;   //高
        //创建画板
        BufferedImage image = new BufferedImage(width, height,

                BufferedImage.TYPE_INT_RGB);
        //绘制工具
        Graphics2D gs =image.createGraphics();

        //设置背景颜色
        gs.setBackground(Color.white);
        //开始绘制矩形
        gs.clearRect(0, 0, width, height);
        //设置前景色
        gs.setColor(Color.black);

        //接受内容
        // byte[] codeOut = objectToByte(content);
        byte[] codeOut;
        codeOut = content.getBytes("utf-8");


        //通过byte数组获取boolean 类型二维码
        boolean[][] code = qrcode.calQrcode(codeOut);

        //遍历这个二维数组
        for (int i = 0; i < code.length; i++) {
            for (int j = 0; j < code.length; j++) {
                //如果是真的就涂黑
                if (code[i][j]) {
                    gs.fillRect(j*3+2, i*3+2, 3, 3);
                }
            }
        }


        //加入中间logo
        /*Image img= ImageIO.read(new File(logoPath));*/
        //80,80是距离gs两个边的距离,55,55是中间logo的大小
        //gs.drawImage(img,80,80,75,75,null);


        //释放资源
        image.flush();
        gs.dispose();
        image.flush();

        //写入指定路径
        ImageIO.write(image, "png", new File(imgPath));

        System.out.println("二维码生成成功!");
    }


}

 

包:链接:https://pan.baidu.com/s/1T-vJJ70UOuNJHAjj8DYBzA 
提取码:r0aq 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值