Linux下Java图片和文字合成成功后文字不显示的问题

最近使用Java将字体写到图片上时遇到了一个问题,写文字的时候英文字母可以正常写上,而中文却消失了,由于我本地代码是在Windows环境下运行的,而上传到服务器是在Linux环境下运行的,在本地的图片和文字可以正常合成,而上传到服务器后就凉了。。最后发现原来是Java找不到相应字体类型导致的,具体代码如下:

/**
     * 图片上写文字
     * @param backgroundImg 图片
     * @param markContent   文字内容
     * @param fontX 文字距离图片左侧像素
     * @param fontY 文字距离图片上方像素
     * @param fontSize  文字大小
     * @param markContentColor  文字颜色
     * @return
     */
    public static BufferedImage mergeImage(BufferedImage backgroundImg,String markContent,int fontX, int fontY, int fontSize,
                                                 Color markContentColor){
        int width = backgroundImg.getWidth(null) == -1 ? 200 : backgroundImg.getWidth(null);
        int height = backgroundImg.getHeight(null) == -1 ? 200 : backgroundImg.getHeight(null);
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bufferedImage.createGraphics();
        g.setColor(markContentColor);
        g.setBackground(Color.red);
        g.drawImage(backgroundImg, 0, 0, null);
        // 字体、字型、字号
        g.setFont(new Font("Microsoft YaHei", Font.PLAIN, fontSize));
        // 画文字的位置
        g.drawString(markContent, fontX, fontY);
        g.dispose();
        return bufferedImage;
    }

上面代码中 g.setFont(new Font("Microsoft YaHei", Font.PLAIN, fontSize)); 设置的Microsoft YaHei在运行的时候找不到,所以字体无法正常写入图片。

下面代码可以查看Java环境支持的字体:

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

输出结果中不包含Microsoft YaHei这个字体。

解决办法:在jre中添加相应的字体即可:

先在本地Windows下找到字体文件:

找到Java运行环境安装目录,假如是/usr/java/jdk1.8.0_151/jre/lib/fonts

进入此目录下: 

#cd /usr/java/jdk1.6.0_03/jre/lib/fonts

创建文件夹
#sudo mkdir fallback

然后把字体文件拷贝到fallback文件夹下,重启tomcat,然后再次运行上面的代码查看支持的字体类型,发现多了一个Microsoft YaHei,然后这个字体类型就可以正常使用,代码就可以正确写入文字了。

如果在jre/lib/fonts中添加字体文件不行的话可以尝试在Linux系统中添加字体文件。

 


版权声明:本文为nisen6477原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。