maven

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.3</version>
        </dependency>

 

package com.smartsite.util;

import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.smartsite.base.Constant;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.net.URL;

@Slf4j
public class CardGraphicsUtil {
    private CardGraphicsUtil() {
        super();
    }

    public static final String FONT = "宋体";
    public static final Color HUAXI_COLOR_GREEN = new Color(0, 122, 55);
    private static BufferedImage image;
    //图片的宽度
    private static final int imageWidth = 430;
    //图片的高度
    private static final int imageHeight = 250;

    /**
     * 生成名片
     *
     * @param qrUrl           二维码url
     * @param logoUrl         logo url
     * @param title           标题
     * @param backgroundColor 背景色
     * @param foreColor       前景色
     * @param items           显示内容
     * @return
     */
    public static BufferedImage generate(String qrUrl, String logoUrl, String title, Color backgroundColor, Color foreColor, Item... items) {
        if (null == qrUrl) {
            qrUrl = "";
        }
        if (null == logoUrl) {
            logoUrl = "";
        }
        if (null == title) {
            title = "";
        }
        if (null == items) {
            items = new Item[0];
        }
        if(null == backgroundColor){
            backgroundColor = Color.black;
        }
        if(null == foreColor){
            foreColor = Color.white;
        }
        //头部高度
        int H_title = 50;
        image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
        //画布背景
        Graphics2D main = image.createGraphics();
        //设置图片的背景色
        main.setColor(backgroundColor);
        main.fillRect(0, 0, imageWidth, imageHeight);

        //logo
        if (!ComUtil.isEmpty(logoUrl) && (logoUrl.toLowerCase().startsWith("http://") || logoUrl.toLowerCase().startsWith("https://"))){
            Graphics dPic = image.getGraphics();
            BufferedImage dimg = null;
            try {
                dimg = javax.imageio.ImageIO.read(new URL(logoUrl));
            } catch (Exception e) {
                log.error(e.getMessage(),e);
            }
            if (dimg != null) {
                dPic.setClip(new RoundRectangle2D.Double(10, 5, 40, 40, 0, 0));
                dPic.drawImage(dimg, 10, 5, 40, 40, null);
                dPic.dispose();
            }
        }

        //标题
        Graphics titleImg = image.createGraphics();
        //设置区域颜色
        titleImg.setColor(backgroundColor);
        //填充区域并确定区域大小位置
        titleImg.fillRect(50, 0, imageWidth - 50, H_title);
        //设置字体颜色,先设置颜色,再填充内容
        titleImg.setColor(foreColor);
        //设置字体
        Font titleFont = new Font(FONT, Font.BOLD, 18);
        titleImg.setFont(titleFont);
        titleImg.drawString(title, 60, 35);

        //横杠
        Graphics lineImg = image.createGraphics();
        //设置区域颜色
        lineImg.setColor(foreColor);
        //填充区域并确定区域大小位置
        lineImg.fillRect(10, 50, imageWidth - 20, 1);

        if (items.length > 0) {
            //详细信息
            Graphics itemsImg = image.createGraphics();
            //设置区域颜色
            titleImg.setColor(backgroundColor);
            //填充区域并确定区域大小位置
            titleImg.fillRect(12, 60, imageWidth - 200, 340);
            for (int i = 0; i < items.length; i++) {
                Item item = items[i];
                if (ComUtil.isEmpty(item)) {
                    break;
                }
                //设置字体颜色,先设置颜色,再填充内容
                titleImg.setColor(foreColor);
                //设置字体
                Font itemFont = new Font(FONT, Font.PLAIN, 14);
                titleImg.setFont(itemFont);
                titleImg.drawString(item.getName() + Constant.COLON + item.getValue(), 20, 25 * i + 80);
            }
        }

        //插入二维码
        Graphics qrImg = image.getGraphics();
        BufferedImage bimg = null;
        try {
            QrConfig config = new QrConfig(180, 180);
            config.setBackColor(backgroundColor.getRGB());
            config.setForeColor(foreColor.getRGB());
            bimg = QrCodeUtil.generate(qrUrl, config);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        if (bimg != null) {
            qrImg.drawImage(bimg, 240, 65, 180, 180, null);
            qrImg.dispose();
        }
        return image;
    }

    /**
     * 图片切圆角
     *
     * @param srcImage
     * @param radius
     * @return
     */
    public static BufferedImage setClip(BufferedImage srcImage, int radius) {
        int width = srcImage.getWidth();
        int height = srcImage.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D gs = image.createGraphics();

        gs.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        gs.setClip(new RoundRectangle2D.Double(0, 0, width, height, radius, radius));
        gs.drawImage(srcImage, 0, 0, null);
        gs.dispose();
        return image;
    }



    public static Color getColor(int rgb) {
        return new Color(rgb);
    }

    /**
     * r,g,b-> int
     * @param r
     * @param g
     * @param b
     * @return rgb整型值
     */
    public static int getColor(int r,int g,int b) {
        return ((0xFF << 24)|(r << 16)|(g << 8)|b);
    }


    @Data
    @AllArgsConstructor
    public static class Item {
        private String name;
        private String value;
    }
}

import com.smartsite.annotation.Pass;
import com.smartsite.util.CardGraphicsUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * @description 存放一些示例
 * @author caobin
 * @since 2019-12-16
 */
@RestController
@Slf4j
@Api(description = "示例" )
@RequestMapping("/example")
public class ExampleController {

    /**
     * qr
     */
    @ApiOperation(value = "qr")
    @Pass
    @GetMapping("/qr")
    public void qr(HttpServletResponse response) throws IOException {
        ServletOutputStream os = response.getOutputStream();
        CardGraphicsUtil.Item[] items = new CardGraphicsUtil.Item[]{
                new CardGraphicsUtil.Item("001号配电箱","001号配电箱"),
                new CardGraphicsUtil.Item("巡检项目","配电箱"),
                new CardGraphicsUtil.Item("规格","一级配电箱"),
                new CardGraphicsUtil.Item("位置","1号楼"),
                new CardGraphicsUtil.Item("楼层","5F"),
                new CardGraphicsUtil.Item("负责人","王三张"),
                new CardGraphicsUtil.Item("手机号码","13888888888")
        };
        //生成名片
        BufferedImage card = CardGraphicsUtil.generate("aa", "http://www.letsbim.net/imgs/logo.png", "四川省第六建筑有限公司", CardGraphicsUtil.HUAXI_COLOR_GREEN, Color.white, items);
//        BufferedImage card = CardGraphicsUtil.generate("aa", "http://www.letsbim.net/imgs/logo.png", "四川省第六建筑有限公司",Color.white, Color.black, items);
        //圆角处理
        card=CardGraphicsUtil.setClip(card,30);

        ImageIO.write(card,"PNG",os);
        os.flush();
        os.close();
    }

}