由服务器对图片文字进行合成,前段都好好的。服务器为linux
这边要求改用方正字体,果断乱码了,打出一溜方框。
出现问题最主要的是排查问题所在。第一想到的是因为字体名称为汉字,前端给server传的时候是不是乱码了。我是用post传的,这应该不会,跟后台后,果然不是这的原因。求救于搜索引擎。
关键字:“drawString 乱码”一搜,有几个帖子,锁定在server上没有字体这个线索上。
首先写了个程序,用于获取主机所支持字体的
import java.awt.GraphicsEnvironment;
public class GetFont {
public static void main(String[] args) {
String[] fontNames=GraphicsEnvironment.getLocalGraphicsEnvironment().
getAvailableFontFamilyNames();
for(String fontName:fontNames){
System.out.println(fontName);
}
}
}
上传到服务器上编译执行了一下,只有几个逻辑字体,没有物理字体。应该是了,又写了个测试程序先上传到服务器
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class TestFont {
public static void main(String[] args) {
BufferedImage bi = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
Graphics g = bi.getGraphics();
Color color = g.getColor();
System.out.println(color);
g.fillRect(0, 0, 800, 600);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g.setFont(new Font("方正黑体简体", Font.PLAIN, 30));
g.setColor(Color.black);
g.drawString("相见时难别亦难", 200, 50);
g.setFont(new Font("微软雅黑", Font.BOLD, 30));
g.setColor(Color.black);
g.drawString("相见时难别亦难", 200, 85);
g.setFont(new Font("方正大黑简体", Font.PLAIN, 30));
g.setColor(Color.black);
g.drawString("相见时难别亦难", 200, 120);
g.dispose();
bi.flush();
//新名字
String fname = "abc";
try {
ImageIO.write(bi, "jpg", new File("/" + fname + ".jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //将其保存在C:/imageSort/targetPIC
}
}
查阅了一下,了解到jvm支持的字体是在%JAVA_HOME%/jvm/lib/font下,ftp上去即可了。不知道路径直接 echo $JAVA_HOME看看就知道了
注意windows里 c:/windows/font文件夹里都是已安装的字体,不能直接ftp上传,拷出去在上传到linux即可。这样传上去的字体只是java支持,不过也没必要都支持,linux作为服务器,其他程序也没有图形界面。
再次执行测试程序,这次打印出来的就对了
问题解决