在linux,centos环境下的,生成的带文字的水印图片在显示为方框乱码。
img.setFont(new Font("宋体", Font.BOLD, 20));
写中文进入图片之前必须设置字体,而且这个字体必须支持中文,否则就会出现乱码或者方框、问号等等。
BufferedImage在内存创建的图像调用的是服务器端的字体,所以在img.drawString(str, x, y);时,如果服务器端找不到对应的中文字体,那么它就识别不了,最后写入图片的中文就变成了乱码、方框、问号等了。
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) {
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 = new Font("宋体", Font.BOLD, 12);
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();
}// 写图片
}
}
需要将相关的字体文件传到服务器的jdk下即可, 如果没有simsun.ttc文件的话,上网搜索一下并下载。
#cd /usr/java/jdk1.7/jre/lib/fonts
#sudo mkdir fallback
将simsun.ttc拷贝到# /usr/java/jdk1.7/jre/lib/fonts/fallback文件夹内
#cp /usr/simsun.ttc /usr/java/jdk1.7/jre/lib/fonts/fallback
修改完必须重启服务器才有效。
1. java enum枚举使用场景及优缺点
2. dubbo实现原理机制
3. java程序员——学习是最好的投资