首页 > 编程语言 >JAVA实现海报背景填充qrCode

JAVA实现海报背景填充qrCode

时间:2023-07-30 18:01:10浏览次数:32  
标签:srcImage 海报 JAVA int BufferedImage radius new qrCode gs

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.添加展示文本,也是根据位置进行,左、右长度进行调整

标签:srcImage,海报,JAVA,int,BufferedImage,radius,new,qrCode,gs
From: https://blog.51cto.com/u_16177403/6901654

相关文章

  • java基础中(笔记)
    流程控制流程控制语句的分类:1、顺序结构:从上往下,从前往后;2、分支结构(if,switch);3、循环结构(for,while,do...while); if语句if格式:if(关系表达式){语句体;}if(关系表达式){语句体1;}else{语句体2;}if(关系表达式){语句体1;}elseif{语句体2;}elseif{语句体3;}elseif{语......
  • Java 中 == 与 equals() 的区别
    Java中==与equals()的区别1.====是一个比较运算符,在使用时有可以判断两种情况在用于基本类型时,即判断两边数据的值是否相等。在用于引用类型时,即判断两边是否为同一个对象即有相同的地址。2.equals()方法equals()方法是Object的一个方法,只能判断引用类型。O......
  • 懒得改变原始对象?JavaScript代理模式教你怎样一步步偷懒!
    前言系列首发于公众号『非同质前端札记』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。懒得改变原始对象?JavaScript代理模式教你怎样一步步偷懒!何为代理模式例如,你想预约一家公司的董事长会面,按照正常流程,你只能通过先联系他的秘书,然后跟他的秘书预约时间,约好时......
  • Java利用Rxtx进行串口通讯
    最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了。那么问题来了,如何进行串口通讯呢?老板说你用Java写个程序好了嘛,用Java写串口程序也是醉了。实验室也没别人写了,所以就......
  • java基础上(笔记)
    变量变量:程序运行过程中,其值可以发生改变的量。变量由三部分组成:变量名、变量值、数据类型。格式:数据类型变量名=变量值;如:inta=10;(定义变量)变量的使用:取值与修改值。取值格式:变量名修改格式:变量名=变量值;注意事项:不能定义已存在的变量;不能使用未定义的变量;整数默认最大......
  • Java概述
    第一章·内容介绍......
  • JavaScript学习 -- 对称加密算法DES
    在现代的互联网时代,数据安全性备受关注。为了保护敏感数据的机密性,对称加密算法是一种常用的方法。在JavaScript中,DES(DataEncryptionStandard)是一种常用的对称加密算法。本篇博客将为您展示如何在JavaScript中使用DES算法进行加密和解密,并提供一个实际的例子。首先,我们需要使用Cr......
  • java学习前须知(笔记)
    Path环境变量的配置我的电脑单击右键选择属性,就进入了设置的关于选项,找到高级系统设置,高级里面选环境变量,弹出窗口里面选系统变量下的新建,取名JAVA_HOME;路径选为jdk-8的根目录,即可得到一个系统变量;选中系统变量里的Path,编辑即可,可新建%JAVA_HOME%\bin,这样就可以直接在cmd里启......
  • Java概述
    第一章·内容介绍......
  • Java学习-4.数组
    一、数组类型数组是存储多个变量(元素)的东西(容器),这多个变量的数据类型要一致。定义一个数组类型的变量,使用数组类型“类型[]”,例如,int[]。和单个基本类型变量不同,数组变量初始化必须使用newint[5]表示创建一个可容纳5个int元素的数组。Java的数组有几个特点:数组所有元素......