我们都看到过一些网站上注册的新用户头像都是昵称的第一个字生成的图片。一下代码就是模拟这个图片的。
/**
* 创建头像
* @param drawString 要画的文字
* @param width 图片宽度
* @param height 图片高度
* @param fontSize 字体大小(磅)
* @return
*/
public static InputStream createHeadPortrait( String drawString, String formatName,int width,int height,int fontSize){
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) buffImg.getGraphics();
//消除文字锯齿
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
//消除画图锯齿
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_DEFAULT);
g.setColor(Color.orange);
g.fillRect(0, 0, width, height);
// 创建字体,字体的大小应该根据图片的高度来定。
Font font = new Font("楷体", Font.CENTER_BASELINE, fontSize);
//字体的大小信息
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
//文字宽
int fontWidth = metrics.stringWidth(drawString);
//文字的高
int fontHeight = metrics.getHeight();
//基线(baseline)到该字体中大多数字符的升部(ascender)之间的距离
int ascent = metrics.getAscent();
g.setFont(font);
g.setColor(Color.white);
//drawString的坐标指的是文字左下角的坐标
g.drawString(drawString, width/2-fontWidth/2, height/2-fontHeight/2+ascent);
ImageIO.write(buffImg, formatName, os);
InputStream inputStream = new ByteArrayInputStream(os.toByteArray());
return inputStream;
} catch (Exception e) {
logger.error("生成头像异常,e={}", e);
}finally {
try {
os.close();
} catch (IOException e) {
logger.error("os流关闭异常");
}
}
return null;
}
网友评论