Java來(lái)實(shí)現(xiàn)文本轉(zhuǎn)圖片需求示例
背景
需求:
- 客戶傳過來(lái)的文本可能會(huì)拼接成一個(gè)違規(guī)文本圖,此時(shí)文本審核引擎檢查不出來(lái),只能由圖片審核引擎來(lái)檢測(cè)了,這時(shí)就需要將此文本圖轉(zhuǎn)成一個(gè)圖片來(lái)交由圖片審核引擎。
- 要求不僅支持普通字符,還要支持ASCII以及表情等特殊字符。
分析
- 借助Java的awt用戶界面工具包來(lái)做。
- 不同的操作系統(tǒng)要提前下載各個(gè)字體包才行,不然生成的圖片有亂碼。
如下以centos7系統(tǒng)為例:
- 查看所有支持的字體:fc-list。
- 下載完之后一定要刷新字體:fc-cache -fv。
- 最后一定要切記:刷新完字體一定要重啟Java程序,不然不生效。
代碼
@Slf4j
public class TextUtils {
/**
* 文本=》圖片
* 目前不支持彩色圖片
*/
private static final int FONT_SIZE = 24;
private static final int PADDING = 20;
private static final Color BACKGROUND_COLOR = Color.WHITE;
private static final Color TEXT_COLOR = Color.BLACK;
private static final String TEMP_FILE_PREFIX = "tmp_";
private static final String IMAGE_SUFFIX = "png";
private static final String[] PREFERRED_FONTS = {
"DejaVu Sans Mono", // 優(yōu)先使用等寬字體
"Monospaced", // Java默認(rèn)等寬字體
"Symbola", // Unicode符號(hào)專用字體
"Segoe UI Symbol", // Windows符號(hào)字體
"Apple Symbols", // macOS符號(hào)字體
"Noto Sans Symbols" // Google符號(hào)字體
};
public static String convertImage(String text) {
Path tempFile = null;
try {
tempFile = Files.createTempFile(TEMP_FILE_PREFIX, "." + IMAGE_SUFFIX);
String filePath = tempFile.toAbsolutePath().toString();
// 分割文本行(\R支持所有不同操作系統(tǒng)換行符格式)
List<String> lines = Arrays.asList(text.split("\\R"));
// 獲取最佳可用字體
Font font = getBestAvailableFont();
// 創(chuàng)建臨時(shí)圖像用于計(jì)算尺寸
BufferedImage tempImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
Graphics2D tempG = tempImage.createGraphics();
try {
tempG.setFont(font);
FontMetrics metrics = tempG.getFontMetrics();
// 計(jì)算最大行寬和總高度
int maxWidth = 0;
for (String line : lines) {
int width = metrics.stringWidth(line);
if (width > maxWidth) maxWidth = width;
}
int totalHeight = metrics.getHeight() * lines.size();
// 創(chuàng)建實(shí)際圖像
int imageWidth = maxWidth + 2 * PADDING;
int imageHeight = totalHeight + 2 * PADDING;
BufferedImage image = new BufferedImage(
imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
try {
// 設(shè)置渲染參數(shù)
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setFont(font);
g.setColor(BACKGROUND_COLOR);
g.fillRect(0, 0, imageWidth, imageHeight);
g.setColor(TEXT_COLOR);
// 繪制文本行
int y = PADDING + metrics.getAscent();
for (String line : lines) {
g.drawString(line, PADDING, y);
y += metrics.getHeight();
}
}finally {
g.dispose();
}
//寫入文件
ImageIO.write(image, IMAGE_SUFFIX, new File(filePath));
}finally {
tempG.dispose();
}
return filePath;
}catch (Exception e) {
log.error("text convert image error: ", e);
deleteTempFile(tempFile);
return null;
}
}
private static Font getBestAvailableFont() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
List<String> availableFonts = Arrays.asList(ge.getAvailableFontFamilyNames());
// 查找首選字體
for (String fontName : PREFERRED_FONTS) {
if (availableFonts.contains(fontName)) {
return new Font(fontName, Font.PLAIN, FONT_SIZE);
}
}
// 回退到支持更廣的字體
if (availableFonts.contains("Symbola")) {
return new Font("Symbola", Font.PLAIN, FONT_SIZE);
}
// 最終回退到等寬字體
return new Font(Font.MONOSPACED, Font.PLAIN, FONT_SIZE);
}
public static void deleteTempFile(Path tempFile) {
if (tempFile != null) {
try {
Files.deleteIfExists(tempFile);
} catch (Exception e) {
log.error("Failed to delete temp file: {}", tempFile, e);
}
}
}
}到此這篇關(guān)于Java來(lái)實(shí)現(xiàn)文本轉(zhuǎn)圖片需求示例的文章就介紹到這了,更多相關(guān)Java 文本轉(zhuǎn)圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于mybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇基于mybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-10-10
java基于Des對(duì)稱加密算法實(shí)現(xiàn)的加密與解密功能詳解
這篇文章主要介紹了java基于Des對(duì)稱加密算法實(shí)現(xiàn)的加密與解密功能,結(jié)合實(shí)例形式詳細(xì)分析了Des加密算法的功能、原理、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-01-01
詳解Java的Struts框架以及相關(guān)的MVC設(shè)計(jì)理念
這篇文章主要介紹了詳解Java的Struts框架以及相關(guān)的MVC設(shè)計(jì)理念,Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
Intellij Idea插件開發(fā)之創(chuàng)建項(xiàng)目層級(jí)的右鍵菜單
這篇文章主要介紹了Intellij Idea插件開發(fā)之創(chuàng)建項(xiàng)目層級(jí)的右鍵菜單,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-02-02
Java的Spring框架中實(shí)現(xiàn)發(fā)送郵件功能的核心代碼示例
這篇文章主要介紹了Java的Spring框架中實(shí)現(xiàn)發(fā)送郵件功能的核心代碼示例,包括發(fā)送帶附件的郵件功能的實(shí)現(xiàn),需要的朋友可以參考下2016-03-03

