最近使用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版权协议,转载请附上原文出处链接和本声明。