使用Graphics2D合成图片与文字
import org.springframework.web.bind.annotation.GetMapping;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
@GetMapping("/imgFrin")
public void imgFrin(String backgroundImg, String content, String img, HttpServletResponse response) {
try {
URL url = new URL(backgroundImg);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();
Image src = ImageIO.read(inStream);
int width = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.drawImage(src, 0, 0, width, height, null);
Font font = loadFont("font/NotoSansHans-Medium.otf", 40);
g.setFont(font);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.WHITE);
g.drawString(content, 142, 100);
URL url1 = new URL(img);
BufferedImage read = ImageIO.read(url1);
BufferedImage bi = new BufferedImage(read.getWidth(), read.getHeight(), BufferedImage.TYPE_INT_RGB);
Ellipse2D.Double aDouble = new Ellipse2D.Double(0, 0, read.getWidth(), read.getHeight());
Graphics2D graphics = bi.createGraphics();
bi = graphics.getDeviceConfiguration().createCompatibleImage(read.getWidth(), read.getHeight(), Transparency.TRANSLUCENT);
graphics = bi.createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
graphics.setClip(aDouble);
graphics.drawImage(read,0,0,null);
graphics.dispose();
g.drawImage(bi,19,53,100,100,null);
g.dispose();
ByteArrayOutputStream out = new ByteArrayOutputStream();
saveImage(image, out);
out.close();
InputStream input = new ByteArrayInputStream(out.toByteArray());
response.setContentType("image/jpeg");
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
BufferedImage buffImg = ImageIO.read(input);
ImageIO.write(buffImg, "jpg", response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
System.out.println(e);
}
}
public Font loadFont(String fontFileName, float fontSize)
{
try {
InputStream aixing = ResourceUtil.getStream(fontFileName);
Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, aixing);
Font dynamicFontPt = dynamicFont.deriveFont(fontSize);
aixing.close();
return dynamicFontPt;
} catch (Exception e)
{
e.printStackTrace();
return new java.awt.Font("宋体", Font.PLAIN, 14);
}
}
public void saveImage(BufferedImage img, OutputStream out) throws Exception {
ImageIO.write(img, "jpg", out);
}