Graphics2D 寫圖片中文亂碼問題及解決

Graphics2D 寫圖片中文亂碼

概述

由於工作的需求,需要往圖片寫字,寫中文的時候出現瞭亂碼,網上找瞭很多資料都不行,後來自己不斷嘗試,最終發現由於Font 的name設置問題導致的亂碼。

問題原因&解決

字形類Font用於規范組件所使用的字形大小、樣式和字體等。其構造函數:

public Font(String name,int style,int size);
  • name表示本地可獲取字體名稱
  • style表示字體樣式,包含Font.PLAIN,Font.BOLD,Font.ITALIC三種,分別對應平體、加粗和斜體。 可見Font name不能隨便設置

查看服務器支持哪些字體

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

如果服務器不存在想要的字體,通過網上下載或者其他系統拷貝(例如 宋體字體文件simsun.ttc simsun.ttf)將其通過ftp上傳到服務器並拷貝到/usr/local/jdk/jre/lib/fonts/ 目錄下(jdk 安裝目錄 ),然後重啟下java進程即可。

測試代碼

        BufferedImage buffImg = ImageIO.read(new File("/tmp/1.jpg"));
        Graphics2D g = buffImg.createGraphics();
        g.setColor(Color.BLACK);
        Font f = new Font("宋體",Font.PLAIN, 30);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g.setFont(f);
        FontMetrics fm = g.getFontMetrics(f);
        g.drawString("中31國", 100, 100);
        ImageIO.write(buffImg, FORMAT, new File("/tmp/test.jpg"));

Graphics2D 顯示文字時亂碼

Graphics2D 顯示文字時亂碼,一種方案是在服務器上添加字體

一種是,把漢字轉為unicode

在數據庫中存的是 \u6388\u6743\u7b7e\u540d\uff1a這個樣的文字

在頁面上還是顯示 \u6388\u6743\u7b7e\u540d\uff1a顯然是java給轉義瞭

String s = "\u5ba2\u6237\u7b7e\u5b57\uff1a";
String str = s.replaceAll("\\\\", "");

現在用 replalaceAll替換一下就好。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: