效果
原图

实现

代码
package com.evimage.web.evgis.utils;
import com.evimage.common.utils.sign.Base64;
import org.apache.commons.compress.utils.IOUtils;
import org.springframework.util.Base64Utils;
import org.springframework.util.FastByteArrayOutputStream;
import sun.misc.BASE64Decoder;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class ImageBuilderUtils {
private static final String BACK_IMG = "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";
public static int[] getContentSize(Font font, String content) {
int[] contentSize = new int[2];
FontRenderContext frc = new FontRenderContext(new AffineTransform(), true, true);
Rectangle rec = font.getStringBounds(content, frc).getBounds();
contentSize[0] = (int) rec.getWidth();
contentSize[1] = (int) rec.getHeight();
return contentSize;
}
private static BufferedImage base64ToBufferedImage(String base64) {
BASE64Decoder decoder = new sun.misc.BASE64Decoder();
try {
byte[] bytes1 = decoder.decodeBuffer(base64);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
return ImageIO.read(bais);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static String streamToBase64(InputStream inputStream) throws IOException {
return Base64Utils.encodeToString(IOUtils.toByteArray(inputStream));
}
public static String builderImgToBase64(String content, String imgPath, String targetImgPath)
throws Exception {
FileInputStream fileInputStream = null;
FileOutputStream fileOutStream = null;
FastByteArrayOutputStream os = null;
try {
Font font2 = new Font("sans-serif", Font.BOLD, 30);
int[] contentSize = getContentSize(font2, content);
File srcImageFile = new File(imgPath);
if (!srcImageFile.exists()) {
throw new Exception("srcImageFile is not exist!");
}
fileInputStream = new FileInputStream(srcImageFile);
BufferedImage image1 = ImageIO.read(fileInputStream);
int imgWidth = Math.max(image1.getWidth(), contentSize[0] + 40);
int imgHeight = image1.getHeight() - 25;
BufferedImage bi = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g1 = (Graphics2D) bi.getGraphics();
g1.fillRect(0, 0, imgWidth, imgHeight);
g1.drawImage(image1, 0, 0, imgWidth, imgHeight, null);
g1.setClip(0, 0, imgWidth, imgHeight);
Rectangle clip = g1.getClipBounds();
FontMetrics fm = g1.getFontMetrics(font2);
int ascent = fm.getAscent();
int descent = fm.getDescent();
int y = (clip.height - (ascent + descent)) / 2 + ascent;
g1.setFont(font2);
g1.setColor(Color.WHITE);
g1.drawString(content, (imgWidth - contentSize[0]) / 2, y);
os = new FastByteArrayOutputStream();
ImageIO.write(bi, "PNG", os);
String encode = Base64.encode(os.toByteArray());
fileOutStream = new FileOutputStream(targetImgPath);
ImageIO.write(bi, "PNG", fileOutStream);
return encode;
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
throw e;
} catch (Exception e) {
throw e;
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutStream != null) {
try {
fileOutStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
os.close();
}
}
}
public static String builderImgToBase64(String content)
throws Exception {
FileInputStream fileInputStream = null;
FileOutputStream fileOutStream = null;
FastByteArrayOutputStream os = null;
try {
Font font2 = new Font("sans-serif", Font.BOLD, 30);
int[] contentSize = getContentSize(font2, content);
BufferedImage image1 = base64ToBufferedImage(BACK_IMG);
int imgWidth = Math.max(image1.getWidth(), contentSize[0] + 40);
int imgHeight = image1.getHeight() - 25;
BufferedImage bi = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g1 = (Graphics2D) bi.getGraphics();
g1.fillRect(0, 0, imgWidth, imgHeight);
g1.drawImage(image1, 0, 0, imgWidth, imgHeight, null);
g1.setClip(0, 0, imgWidth, imgHeight);
Rectangle clip = g1.getClipBounds();
FontMetrics fm = g1.getFontMetrics(font2);
int ascent = fm.getAscent();
int descent = fm.getDescent();
int y = (clip.height - (ascent + descent)) / 2 + ascent;
g1.setFont(font2);
g1.setColor(Color.WHITE);
g1.drawString(content, (imgWidth - contentSize[0]) / 2, y);
os = new FastByteArrayOutputStream();
ImageIO.write(bi, "PNG", os);
String encode = Base64.encode(os.toByteArray());
return encode;
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
throw e;
} catch (Exception e) {
throw e;
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutStream != null) {
try {
fileOutStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
os.close();
}
}
}
public static void main(String[] args) throws Exception {
String[] strArr = new String[]{"你在搞什么啊1", "你在搞什么啊2"};
List<String> list = new ArrayList<>();
for (String content : strArr) {
String str = ImageBuilderUtils.builderImgToBase64(content, "D:\bigProject\image_by_graphics2D.png", "D:\bigProject\image_by_graphics2D-2.png");
list.add(str);
}
list.stream().forEach(System.out::println);
}
}