java 生成推广码 背景图和自己的二维码

看效果图
在这里插入图片描述

package com.hxx.utils;

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 java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;

public class HxxCodeUtils {
    private static final int QRCOLOR = 2105119;
    private static final int BGWHITE = 16777215;
    private static Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>() {
        private static final long serialVersionUID = 1L;

        {
            this.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
            this.put(EncodeHintType.CHARACTER_SET, "utf-8");
            this.put(EncodeHintType.MARGIN, 0);
        }
    };

    public HxxCodeUtils() {
    }

    public static void 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) {
        try {
            MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
            BitMatrix bm = multiFormatWriter.encode(qrUrl, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
            BufferedImage image = new BufferedImage(WIDTH, HEIGHT, 1);

            int y;
            for(int x = 0; x < WIDTH; ++x) {
                for(y = 0; y < HEIGHT; ++y) {
                    image.setRGB(x, y, bm.get(x, y) ? 2105119 : 16777215);
                }
            }

            BufferedImage backgroundImage = ImageIO.read(bgImgFile);
            y = backgroundImage.getWidth();
            int qrWidth = image.getWidth();
            int disx = y - qrWidth - imagesX;
            int disy = imagesY;
            Graphics2D rng = backgroundImage.createGraphics();
            rng.setComposite(AlphaComposite.getInstance(10));
            rng.drawImage(image, disx, disy, WIDTH, HEIGHT, (ImageObserver)null);
            Color textColor = Color.white;
            rng.setColor(textColor);
            rng.drawImage(backgroundImage, 0, 0, (ImageObserver)null);
            rng.setFont(new Font("微软雅黑,Arial", 1, size));
            rng.setColor(Color.black);
            int strWidth = rng.getFontMetrics().stringWidth(note);
            int disx1 = y - strWidth - text1X;
            rng.drawString(note, disx1, text1Y);
            int disx2 = y - strWidth - text2X;
            rng.drawString(tui, disx2, text2Y);
            rng.dispose();
            backgroundImage.flush();
            ImageIO.write(backgroundImage, "png", codeFile);
        } catch (Exception var27) {
            var27.printStackTrace();
        }

    }

//这个 你可以直接测试 生成、二维码在海报的位置你自己需要自己调
  public static void main(String[] args) {
           File bgImgFile = new File("D:/silly/lu2.jpg");//背景图片
        File QrCodeFile = new File("D:/silly/7.jpg");//生成图片位置
        String url = "http://silly.nat300.top/api/wx/login?parent_id=7";//二维码链接
        String note = "龙虎斗";//文字描述
        String tui = "龙虎斗";//文字描述

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



把上面作为工具类就可以了 这个生成图片后回显到浏览器 海报推广码就生成了


package longhudou.controller.wx;

import com.hxx.utils.BaseController;
import com.hxx.utils.HxxCodeUtils;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @ClassName HuangXiangXiang
 * @Date 2019/11/16 17:24
 * @Version V1.0
 **/
public class QRCodeController extends BaseController {


    public void QRCreate() throws IOException {
        String parentId = get("parent_id");

        File bgImgFile = new File("D:/silly/lu2.jpg");//背景图片
        File QrCodeFile = new File("D:/silly/7.jpg");//生成图片位置
        String url = "http://silly.nat300.top/api/wx/login?parent_id=7";//二维码链接
        String note = "龙虎斗";//文字描述
        String tui = "龙虎斗";//文字描述

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

        ServletOutputStream out = null;
        FileInputStream ips = null;

        HttpServletResponse response = getResponse();
        //获取图片存放路径
        String imgPath = "D:/silly/7.jpg";
        ips = new FileInputStream(new File(imgPath));
        getResponse().setContentType("image/jpg");
        out = response.getOutputStream();
        //读取文件流
        int len = 0;
        byte[] buffer = new byte[1024 * 10];
        while ((len = ips.read(buffer)) != -1) {
            out.write(buffer, 0, len);

        }
        out.flush();
        renderNull();
    }



}


使用到的pom
  <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.3</version>
        </dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值