本機 Windows 環境測試以下代碼生成中文水印完全沒問題,但是發布到Linux下不顯示,一開始以為是報錯了沒打印出來,搜索發現直接提示中文亂碼的或者不顯示的,才明白原來是字體庫原因,於是開始解決這個問題。
/** * @param srcImgPath 源圖片路徑 * @param tarImgPath 保存的圖片路徑 * @param waterMarkContent 文字內容 * @param markContentColor 文字顏色 * @param font 字體 */ public static void addLetterXY(String srcImgPath, String tarImgPath, String content,Color color,Font font, int x,int y) { try { // 讀取原圖片信息 File srcImgFile = new File(srcImgPath);//得到原圖片 Image srcImg = ImageIO.read(srcImgFile);//文件轉化為圖片 int srcImgWidth = srcImg.getWidth(null);//獲取圖片的寬 int srcImgHeight = srcImg.getHeight(null);//獲取圖片的高 // 加文字 BufferedImage bufImg = new BufferedImage(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 = new FileOutputStream(tarImgPath); ImageIO.write(bufImg, "png", outImgStream); outImgStream.flush(); outImgStream.close(); System.out.println("添加文字完成"); } catch (Exception e) { System.out.println("生成圖片出錯啦:"+e.getMessage()); } }
首先根據介紹了解到,從jdk15版本(即jdk1.5_*) 后,可以自定義字體庫,添加方式如下鏈接:https://blog.csdn.net/nisen6477/article/details/82255435 但實際上在這里添加並沒有作用,使用以下方式輸出tomcat所擁有字體庫,發現添加的字體並不存在。
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String[] fontFamilies = ge.getAvailableFontFamilyNames(); for (String s : fontFamilies) { System.out.println(s); }
於是又有文章介紹說要在Linux 系統中添加字體庫,添加方式如鏈接:https://blog.csdn.net/myflysun/article/details/78055247 或 https://blog.csdn.net/qq296398300/article/details/70145206
我這只配置到前 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 指令可以查看該鏈接:https://www.cnblogs.com/lhm166/articles/6605059.html
5、建立字體緩存:
mkfontscale
mkfontdir
fc-cache -fv
6、重啟 Tomcat,以上文章中有的說要重啟 Linux系統,有的說要重啟字體庫服務,但我都沒有,而且也沒有字體服務,只是重啟了Tomcat 執行后有效。
7、可以再次使用 fc-list 查看字體庫,已經包含了新加入的字體,或者使用上邊的Java 輸出也包含了新字體,打印中文水印也OK。