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