本机 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:windowsfonts 复制对应字体库,微软雅黑、宋体、黑体等,各文件后缀可能不一样,有的为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。