很多场合都会出现默认头像,比如刚注册的账户还未自定义头像,显示就是默认头像,这种头像一般都很丑,想到钉钉那种风格还挺特别的,仿照写一个。

废话不多说,直接上代码。

import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;/*** 根据姓名创建图片*/
public class CreateNamePicture {/*** @throws IOException* @throws**/public static void main(String[] args) throws IOException {String name = "张三";generateImg(name, "/Users/xingchenge/Desktop/temp", name);}/*** 绘制字体头像* 如果是英文名,只显示首字母大写* 如果是中文名,只显示最后两个字* @param name* @param outputPath* @param outputName* @throws IOException*/public static void generateImg(String name, String outputPath, String outputName)throws IOException {int width = 100;int height = 100;int nameLen = name.length();String nameWritten;// 如果用户输入的姓名少于等于2个字符,不用截取if (nameLen <= 2) {nameWritten = name;} else {// 如果用户输入的姓名大于等于3个字符,截取后面两位String first = name.substring(0, 1);if (isChinese(first)) {// 截取倒数两位汉字nameWritten = name.substring(nameLen - 2);} else {// 截取前面的两个英文字母nameWritten = name.substring(0, 2).toUpperCase();}}String filename = outputPath + File.separator + outputName + ".jpg";File file = new File(filename);//Font font = new Font("微软雅黑", Font.PLAIN, 30);BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g2 = (Graphics2D) bi.getGraphics();g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);g2.setBackground(getRandomColor());g2.clearRect(0, 0, width, height);g2.setPaint(Color.WHITE);Font font = null;// 两个字及以上if(nameWritten.length() >= 2) {font = new Font("微软雅黑", Font.PLAIN, 30);g2.setFont(font);String firstWritten = nameWritten.substring(0, 1);String secondWritten = nameWritten.substring(1, 2);// 两个中文 如 张三if (isChinese(firstWritten) && isChinese(secondWritten)) {g2.drawString(nameWritten, 20, 60);}// 首中次英 如 张Selse if (isChinese(firstWritten) && !isChinese(secondWritten)) {g2.drawString(nameWritten, 27, 60);} // 首英,如 ZSelse {nameWritten = nameWritten.substring(0,1);}}// 一个字if(nameWritten.length() ==1) {// 中文if(isChinese(nameWritten)) {font = new Font("微软雅黑", Font.PLAIN, 50);g2.setFont(font);g2.drawString(nameWritten, 25, 70);}// 英文else {font = new Font("微软雅黑", Font.PLAIN, 55);g2.setFont(font);g2.drawString(nameWritten.toUpperCase(), 33, 67);}}BufferedImage rounded = makeRoundedCorner(bi, 99);ImageIO.write(rounded, "png", file);}/*** 判断字符串是否为中文* @param str* @return*/public static boolean isChinese(String str) {String regEx = "[\\u4e00-\\u9fa5]+";Pattern p = Pattern.compile(regEx);Matcher m = p.matcher(str);if (m.find())return true;elsereturn false;}/*** 获得随机颜色* @return*/private static Color getRandomColor() {String[] beautifulColors =new String[]{"232,221,203", "205,179,128", "3,101,100", "3,54,73", "3,22,52","237,222,139", "251,178,23", "96,143,159", "1,77,103", "254,67,101", "252,157,154","249,205,173", "200,200,169", "131,175,155", "229,187,129", "161,23,21", "34,8,7","118,77,57", "17,63,61", "60,79,57", "95,92,51", "179,214,110", "248,147,29","227,160,93", "178,190,126", "114,111,238", "56,13,49", "89,61,67", "250,218,141","3,38,58", "179,168,150", "222,125,44", "20,68,106", "130,57,53", "137,190,178","201,186,131", "222,211,140", "222,156,83", "23,44,60", "39,72,98", "153,80,84","217,104,49", "230,179,61", "174,221,129", "107,194,53", "6,128,67", "38,157,128","178,200,187", "69,137,148", "117,121,71", "114,83,52", "87,105,60", "82,75,46","171,92,37", "100,107,48", "98,65,24", "54,37,17", "137,157,192", "250,227,113","29,131,8", "220,87,18", "29,191,151", "35,235,185", "213,26,33", "160,191,124","101,147,74", "64,116,52", "255,150,128", "255,94,72", "38,188,213", "167,220,224","1,165,175", "179,214,110", "248,147,29", "230,155,3", "209,73,78", "62,188,202","224,160,158", "161,47,47", "0,90,171", "107,194,53", "174,221,129", "6,128,67","38,157,128", "201,138,131", "220,162,151", "137,157,192", "175,215,237", "92,167,186","255,66,93", "147,224,255", "247,68,97", "185,227,217"};int len = beautifulColors.length;Random random = new Random();String[] color = beautifulColors[random.nextInt(len)].split(",");return new Color(Integer.parseInt(color[0]), Integer.parseInt(color[1]),Integer.parseInt(color[2]));}/*** 图片做圆角处理* @param image* @param cornerRadius* @return*/public static BufferedImage makeRoundedCorner(BufferedImage image, int cornerRadius){int w = image.getWidth();int h = image.getHeight();BufferedImage output = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);Graphics2D g2 = output.createGraphics();g2.setComposite(AlphaComposite.Src);g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(Color.WHITE);g2.fill(new RoundRectangle2D.Float(0, 0, w, h, cornerRadius, cornerRadius));g2.setComposite(AlphaComposite.SrcAtop);g2.drawImage(image, 0, 0, null);g2.dispose();return output;}}

自动生成带昵称的头像(仿照钉钉头像)相关推荐

  1. 在html文件中集成easy,easyapi 通过java注解或注释自动生成带页面的接口文档

    Java-自动生成带页面可调试的接口文档 介绍:一款java接口文档自动生成的插件,包含了根据接口注释或注解自动生成接口文档,可网页打开. 特点:一款无任何代码侵入的生成方式,10秒钟集成 1.支持读 ...

  2. idea IJ连接数据库,自动生成带注解的bean

    目录 1.右侧点开Database,点击+配置数据库 2.Data Source选择要连接的数据库类型 3.填写数据库配置项 4.配置数据库驱动 5.生成bean 6.编辑带备注的bean的groov ...

  3. html单页面js完成表数据库自动生成带注释的java实体类和简单的增删改查sql

    支持Mysql和Oracle,mybatis和ibatis可选.功能主要还是字符串的拼凑完成的,把用把表信息复制过来或者增加后台,就可以生成简单的增删改查了 临时体验点这里 我也不知道地址什么时候失效 ...

  4. 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图

    本文借助vs2005中自带的FileUpload控件实现图片文件的上传并生成缩略图. 实现过程:选择图片上传成功后,取得已经存在服务器的文件生成缩略图,并且判断是否是图片类型的文件,这个的判断可以在程 ...

  5. 工作中遇到的问题之android客户端自动生成带logo的二维码

    android中生成动态二维码很简单,网上随便搜一搜便能找到,本以为任务很快就把任务解决了,可是客户说二维码中一定要添加他们公司的logo这可把哥们难倒了,开始再次投入度娘的怀抱,查看各位大神的代码, ...

  6. Word2007自动生成带编号的多级目录

    [url]http://inexus.iteye.com/blog/1739627[/url]

  7. Python: 生成带用户昵称的头像

    Python: 生成带用户昵称的头像 需求 新建用户后,根据用户输入的昵称生成图片.(例:注册"钉钉"用户后,头像根据输入的名字生成) 开发环境 Windows 10 Python ...

  8. java生成word带多级标题,word2007中多级标题的设置和目录的自动生成 | 学步园

    如果你要写一篇论文,最好是在写之前将多级标题设置好,这样才能事半功倍,并且可自动生成带超链接的目录,下面言归正传将介绍一篇论文格式的标题和目录. 一.多级标题的生成 如果你最多只用到标题的3级,则只需 ...

  9. 批量生成带超链接目录且自动更新 Excel

    文章目录 自动生成带超链接的目录 一.知识点 get.workbook宏表函数使用 INDEX() FIND() REPLACE() HYPERLINK() 二.举例 第一步:定义名称 第二步:提取所 ...

最新文章

  1. R语言Logistic回归模型案例:分析吸烟、饮酒与食管癌的关系
  2. js时间搓化为今天明天_打乒乓球的搓球技巧!你掌握了吗?
  3. SAP Spartacus Template-Driven Outlets
  4. 高炉计算机控制,一高炉计算机控制系统升级.pdf
  5. python3.8.0安装详细步骤_python3.8.0安装教程_后端开发
  6. powershell目录带空格_精心构造的PS1文件名导致Powershell命令执行
  7. Shel脚本-初步入门之《02》
  8. 关于‘挖矿’minerd
  9. 华为 项目管理10大模板 【Word版 (可直接套用)】
  10. DDR2 DDR3 PCBlayout规则
  11. MOSFET 导通条件
  12. 汇编语言基础知识(二)
  13. 计算机专业怎么说才能高大上,搞笑!如何把自己的职业说的高大上
  14. 如何跳过计算机配置直接开机,WIN7开机怎么跳过欢迎界面_win7怎样跳过电脑开机欢迎界面-win7之家...
  15. 安卓智能地图开发与实施:三维地图 - ArcGIS Runtime SDK for Android
  16. 【转帖】M1、M2增速
  17. php agrs zf2,添加ZF2_PATH environment variable 环境变量
  18. [数论][高精度]Heaven Cow与God Bull
  19. 天行健,君子以自强不息;地势坤,君子以厚德载物的解释
  20. 【已解决】terminate called after throwing an instance of ‘cv::Exception‘,已放弃 (核心已转储)

热门文章

  1. python古典问题兔子问题_古典兔子问题
  2. 苹果蓝牙日志如何获取
  3. mx250是什么_分析mx250显卡什么级别
  4. c语言实现乘法口诀表的打印函数
  5. 蓝牙耳机什么牌子的好?口碑、销量双高的十大蓝牙耳机品牌!
  6. F280049C Crossbar X-BAR
  7. 美国计算机科学本科录取人数,美国加州大学圣地亚哥分校计算机科学本科录取条件.pdf...
  8. html制作简单框架网页 实现自己的音乐驿站 操作步骤及源文件下载 (播放功能限mp3文件)...
  9. 冒烟测试的7个好处,你是否经常用到它?
  10. Windows内存清理工具实现——从现象到本质