在linux,centos环境下的,生成的带文字的水印图片在显示为方框乱码。

img.setFont(new Font("宋体", Font.BOLD, 20));

写中文进入图片之前必须设置字体,而且这个字体必须支持中文,否则就会出现乱码或者方框、问号等等。

BufferedImage在内存创建的图像调用的是服务器端的字体,所以在img.drawString(str, x, y);时,如果服务器端找不到对应的中文字体,那么它就识别不了,最后写入图片的中文就变成了乱码、方框、问号等了。

4c868277647570781416457e30203c0e.png

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程序员——学习是最好的投资

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐