0
点赞
收藏
分享

微信扫一扫

JAVA实现海报背景填充qrCode

东林梁 2023-07-30 阅读 54

package com.open.openbank.qrCode;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * 生成海报
 */
public class PosterTest {

    public static void main(String[] args){
        String backgroundPath = "E:\\tools\\payPoster\\back\\background_end.jpg";
        String qrCodePath = "E:\\tools\\payQrCode\\pay.png";
        String outPath = "E:\\tools\\payPoster\\end.jpg";
        overlapImage(backgroundPath, qrCodePath, "展示文本内容", outPath);

    }

    public static String overlapImage(String backgroundPath, String qrCodePath, String merName,String outPath){
        try {
            int width = 1118;
            BufferedImage background = resizeImage1(1118,1524, ImageIO.read(new File(backgroundPath)));
            // 二维码的路径
            BufferedImage qrCode = resizeImage(682,748,ImageIO.read(new File(qrCodePath)));
            // 在背景图片中添加入需要写入的信息
            Graphics2D g = background.createGraphics();

            // 在背景图片上添加二维码图片
            g.drawImage(qrCode, 218,288, qrCode.getWidth(),qrCode.getHeight(),null);

            g.setColor(Color.black);
            Font font = new Font("微软雅黑", Font.PLAIN, 35);
            g.setFont(font);

            // 计算文字长度,计算居中的X点坐标
            FontMetrics fm = g.getFontMetrics(font);
            int textWidth = fm.stringWidth(merName);
            int tWidth = (width-textWidth) / 2;
            g.drawString(merName, tWidth, 1010);

            g.dispose();
            ImageIO.write(background,"jpg", new File(outPath));

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static BufferedImage resizeImage1(int x,int y,BufferedImage bfi){

        BufferedImage bufferedImage = new BufferedImage(x,y,BufferedImage.TYPE_INT_RGB);
        bufferedImage.getGraphics().drawImage(
                bfi.getScaledInstance(x,y, Image.SCALE_SMOOTH),0,0,null);

        return bufferedImage;
    }

    public static BufferedImage resizeImage(int x,int y,BufferedImage bfi){
        BufferedImage bufferedImage = new BufferedImage(x,y,BufferedImage.TYPE_INT_RGB);
        bufferedImage.getGraphics().drawImage(
                bfi.getScaledInstance(x,y, Image.SCALE_SMOOTH),0,0,null);
        try {
            bufferedImage = setRadius(bufferedImage);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return bufferedImage;
    }

    public static BufferedImage setRadius(BufferedImage srcImage) throws IOException{
        int radius = (srcImage.getWidth() + srcImage.getHeight()) / 20;
        return setRadius(srcImage, radius, 0, 0);
    }

    public static BufferedImage setRadius(BufferedImage srcImage, int radius, int border, int padding) throws IOException{
        int width = srcImage.getWidth();
        int height = srcImage.getHeight();
        int canvasWidth = width + padding * 2;
        int canvasHeight = height + padding * 2;

        BufferedImage image = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
        Graphics2D gs = image.createGraphics();
        gs.setComposite(AlphaComposite.Src);
        gs.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        gs.setColor(Color.WHITE);
        gs.fill(new RoundRectangle2D.Float(0, 0, canvasWidth, canvasHeight, radius, radius));
        gs.setComposite(AlphaComposite.SrcAtop);
        gs.drawImage(setClip(srcImage, radius), padding, padding, null);
        if(border !=0){
            gs.setColor(Color.GRAY);
            gs.setStroke(new BasicStroke(border));
            gs.drawRoundRect(padding, padding, canvasWidth - 2 * padding, canvasHeight - 2 * padding, radius, radius);
        }
        gs.dispose();
        return image;
    }

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

1.设置背景图片

2.设置qrcode

3.根据背景图上二维码要填充的位置进行qrCode定位调整,根据二维码的框及位置测量进行调整

4.添加展示文本,也是根据位置进行,左、右长度进行调整

举报

相关推荐

0 条评论