本機 Windows 環境測試以下代碼生成中文水印完全沒問題,但是發布到Linux下不顯示,一開始以為是報錯了沒打印出來,搜索發現直接提示中文亂碼的或者不顯示的,才明白原來是字體庫原因,於是開始解決這個問題。

/***@paramsrcImgPath 源圖片路徑
*@paramtarImgPath 保存的圖片路徑
*@paramwaterMarkContent 文字內容
*@parammarkContentColor 文字顏色
*@paramfont 字體*/
public static void addLetterXY(String srcImgPath, String tarImgPath, String content,Color color,Font font, int x,inty) {try{//讀取原圖片信息
File srcImgFile = new File(srcImgPath);//得到原圖片
Image srcImg = ImageIO.read(srcImgFile);//文件轉化為圖片
int srcImgWidth = srcImg.getWidth(null);//獲取圖片的寬
int srcImgHeight = srcImg.getHeight(null);//獲取圖片的高//加文字
BufferedImage bufImg = newBufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g=bufImg.createGraphics();
g.drawImage(srcImg,0, 0, srcImgWidth, srcImgHeight, null);
g.setColor(color);//根據圖片的背景設置水印顏色
g.setFont(font); //設置字體
g.drawString(content, x, y);//畫出水印
g.dispose();//輸出圖片
FileOutputStream outImgStream = newFileOutputStream(tarImgPath);
ImageIO.write(bufImg,"png", outImgStream);
outImgStream.flush();
outImgStream.close();
System.out.println("添加文字完成");
}catch(Exception e) {
System.out.println("生成圖片出錯啦:"+e.getMessage());
}
}

首先根據介紹了解到,從jdk15版本(即jdk1.5_*) 后,可以自定義字體庫,添加方式如下鏈接: 但實際上在這里添加並沒有作用,使用以下方式輸出tomcat所擁有字體庫,發現添加的字體並不存在。

GraphicsEnvironment ge =GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontFamilies=ge.getAvailableFontFamilyNames();for(String s : fontFamilies) {
System.out.println(s);
}

我這只配置到前 5 步就可以了,不需要重啟Linux 或字體服務,步驟總結為以下:

1、檢查字體是否已經安裝:

fc-list  ----------檢查所有已有的字體

fc-list :lang=zh -----------只檢查中文

2、到 C:\windows\fonts 復制對應字體庫,微軟雅黑、宋體、黑體等,各文件后綴可能不一樣,有的為ttf,有的為ttc,不影響使用。

3、上傳剛才復制的字體庫到/usr/share/fonts/zh_CN目錄下,如果沒有該目錄,用命令:mkdir /usr/share/fonts/zh_CN  來創建,然后再上傳。

4、修改字體權限,使root以外的用戶可以使用這些字體:chmod -R 777 /usr/share/fonts/zh_CN,使用777 賦予全部權限,chmod 指令可以查看該鏈接:

5、建立字體緩存:

mkfontscale
mkfontdir
fc-cache -fv

6、重啟 Tomcat,以上文章中有的說要重啟 Linux系統,有的說要重啟字體庫服務,但我都沒有,而且也沒有字體服務,只是重啟了Tomcat 執行后有效。

7、可以再次使用 fc-list 查看字體庫,已經包含了新加入的字體,或者使用上邊的Java 輸出也包含了新字體,打印中文水印也OK。