上一篇介绍了在linux, centos图片加水印出现乱码的解决方案,《linux java程序加水印及中文乱码方案》, 在真实项目环境下,一是部署在虚拟机服务器,还有项目部署在docker容器里面,和运维沟通后,第一种解决方案后期更换环境就容易出现疏漏,再说一台服务器下面部署了多个项目,运维担心升级后会影响其它项目,作为开发/技术人员来说,服务器做一下配置更方便,但毕竟是生产, 接下来我们采用新的思路,把字体库文件放在项目某个目录下,例如:friend-new-web/src/main/resources/simsun.ttc
运行Tomcat服务,
java代码:
import java.awt.Font;
import java.io.File;
import java.io.FileInputStream;
import org.springframework.util.Assert;
/**
* 加载中文字体库
*
* @author David
*
*/
public class SystemLoadFont {
/**
* 本地读取方法
* @param path 文件路径
* @param style 字体样式
* @param fontSize 字体大小
* @return
*/
public static java.awt.Font styleFont(String path,int style,float fontSize) {
Assert.notNull(path);
Font font = SystemLoadFont.loadStyleFont(path,style,fontSize);// 调用
return font;
}
/**
*
* @param fontFileName 外部字体名
* @param style 字体样式
* @param fontSize 字体大小
* @return
*/
public static Font loadStyleFont(String fontFileName,int style, float fontSize) {
try{
File file = new File(fontFileName);
FileInputStream in = new FileInputStream(file);
Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, in);
Font dynamicFontPt = dynamicFont.deriveFont(style,fontSize);
in.close();
return dynamicFontPt;
}catch(Exception e) {//异常处理
e.printStackTrace();
return new java.awt.Font("宋体", Font.PLAIN, 20);
}
}
}
java水印代码测试:
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageGraphics {
/**
* @param args
*/
public static void main(String[] args) {
//字体文件路径
String simsunPath =
this.getClass().getClassLoader().getResource("simsun.ttc").getPath();
int width = 200;
int height = 200;
String text = "佳友博客";
int x = 0;
int y = 0;
BufferedImage processDiagram = new BufferedImage(100, 100,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) processDiagram.createGraphics();
Font font = SystemLoadFont.styleFont(simsunPath,Font.PLAIN,16f);
g.setFont(font);
FontMetrics fontMetrics = g.getFontMetrics();
int textX = x + ((width - fontMetrics.stringWidth(text)) / 2);
int textY = y + ((height - fontMetrics.getHeight()) / 2)
+ fontMetrics.getHeight();
g.drawString(text, textX, textY);
File outFile = new File("c:/friend365.png");
try {
ImageIO.write(processDiagram, "png", outFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 写图片
}
}