需求:

  1. 注册的时候提交昵称,账号,密码(这里不说明,仅仅是需求
  2. 根据昵称获得第一个字母,数字,汉子,生成默认图片;
  3. 默认图片需求:浅色底+黑色字;深色底+白色字
  4. 头像尺寸:120px * 120px , 字体尺寸:50
  5. 字体显示位置 居中显示

实现:

1.文字获得

public class StringUtil {private static final String  ENGLISH_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";/*** 获取首字母或汉字来,用来进行绘制头像* @param nick* @return*/public static String getCharString(String nick){if(nick==null){return  String.valueOf(ENGLISH_CHARS.charAt((int)(Math.random() * 26)));}char[] chars = nick.toCharArray();if(chars.length>0){char c=chars[0];if(Character.isLetter(c)){//是字母if(Character.isLowerCase(c)){//是否是小写字母c=Character.toUpperCase(c);return String.valueOf(c);}else {return String.valueOf(c);}}else{//不是字母返回return String.valueOf(c);}}return String.valueOf(ENGLISH_CHARS.charAt((int)(Math.random() * 26)));}}

2.绘制默认头像

注释写的很详细,见注释
package yuan.ssm.common.util;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.*;import static yuan.ssm.common.config.ConfigConstant.FONT_IMAGE_BASE_PATH;/*** ==================================================* <p/>* 版权: 软件工程.net12-1 原明卓* <p/>* 项目: 基于用户兴趣标签的新闻推荐系统* <p/>* 作者: 原明卓* <p/>* 版本: 1.0* <p/>* 创建日期: 16-4-14 上午11:36* <p/>* 功能描述: 根据用户昵称生成用户头像* <p>* <p/>* 功能更新历史:* <p>* ==================================================*/
public class FontImageUtil {/*** 根据文字和图片名称创建图片* 默认的字体 宋体加粗* @param str 文字* @param imgName 文件明* @throws Exception*/public static void createImage(String str, String imgName) throws Exception{createImage(str,new Font("宋体",Font.BOLD,50),new File(FONT_IMAGE_BASE_PATH+imgName));}/*** 根据str,输出目录创建图片* 文字样式默认为 宋体加粗* @param str 文字* @param outFile 输出目录* @throws Exception*/public static void createImage(String str, File outFile) throws Exception{createImage(str,new Font("宋体",Font.BOLD,50),outFile);}/*** 根据str,font的样式以及输出文件目录* @param str 文字* @param font 字体样式* @param outFile 输出的文件及其输出的位置* @throws Exception* createImage("中华人民共和国",new Font("宋体",Font.BOLD,18),new File("e:/a.png"));*/public static void createImage(String str, Font font, File outFile) throws Exception{//        ArrayList<int[]> rgbs = getRGB();int[] ranRGB = getRanRGB();boolean isQian=isQianRGB(ranRGB);int width=120;int height=120;//创建图片BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);Graphics2D g=image.createGraphics();g.setColor(new Color(ranRGB[0],ranRGB[1],ranRGB[2]));// 一个未知颜色g.fillRect(0, 0, width, height);//先用颜色填充背景//判断是浅颜色还是深颜色if(isQian){g.setColor(Color.black);//黑色}else{g.setColor(Color.white);//白色}//设置画笔字体g.setFont(font);g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);//判断字体的绘制位置,居中显示FontMetrics fm=g.getFontMetrics(font);int textWidth=fm.stringWidth(str);int x=(width-textWidth)/2;int ascent=fm.getAscent();int descent=fm.getDescent();int y=(height-ascent-descent)/2+ascent;//画出字符串g.drawString(str,x,y);g.dispose();//输出png图片ImageIO.write(image, "png", outFile);}/***  一个算法 - 判断是深颜色还是浅颜色的算法**  $grayLevel = $R * 0.299 + $G * 0.587 + $B * 0.114;*    if ($grayLevel >= 192) {*      // add shadow*    }** @deprecated  业务修改,不仅仅是需要深色悲剧,浅色字,效率底** 修改为 : 获得随机颜色背景,深色绘制白色字体,浅色,绘制黑色字体* */private static ArrayList<int[]> getRGB(){//1. 随机生成 rgb//2. 判断深颜色还是浅颜色//3. 继续随机生成 rgb//4. 判读是深颜色还是浅颜色 :和第一次相反,返回两个rgb值//5.  颜色深的作为背景,颜色浅的作为文字;//6. 第一个存放浅颜色,第二个存放深颜色ArrayList<int[]> colorList=new ArrayList<int[]>();int[] rgb = getRanRGB();while (true){if(isQianRGB(rgb)){colorList.add(rgb);break;}else {rgb=getRanRGB();}}int[] rgbQ=getRanRGB();while (true){if(isQianRGB(rgbQ)){rgbQ=getRanRGB();}else {colorList.add(rgbQ);break;}}return colorList;}/*** 获得随机颜色* @return rgb颜色*/private static int[] getRanRGB(){int [] colors=new int[3];for(int i=0;i<colors.length;i++){colors[i]=(int)(Math.random()*256);}return colors;}/*** 判断是不是浅颜色* @param colors* @return 是否是浅颜色*/private static boolean isQianRGB(int[] colors){int grayLevel = (int) (colors[0] * 0.299 + colors[1] * 0.587 + colors[2] * 0.114);if(grayLevel>=192){return true;}return false;}}

3.参考

文字居中显示参考文章,请点击我


4.效果

Spring Mvc - 用户注册服务端生成默认头像实现相关推荐

  1. Spring Cloud Config服务端配置细节(二)之加密解密

    在微服务架构中,由于独立的服务个数众多,加上前期测试工作量大,一些原本由运维人员维护的敏感信息会被我们直接写在微服务中,以提高开发效率,但是这种明文存储方式显然是非常危险的,所以我们要对这些信息进行加 ...

  2. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码

    Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...

  3. 传奇服务器是测试模式怎么修改,www.23bb.net告诉你传奇服务端中默认系统提示文字修改方法...

    在玩传奇中中,常见一些系统提示,如人物在安全区中扔东西时,会弹出对话框提示禁止扔,或者在游戏登陆时提示攻击模式,及人物行会显示与夫妻称号显示格式等所有的系统默认格式.其实这些格式都是可以进行修改的,今 ...

  4. spring实现mqtt服务端_SpringBoot--实战开发--MQTT消息推送(六十)

    一.MQTT简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台 ...

  5. Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api(二十)

    一:Swagger介绍 Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目 实现了与SpingMVC框架的无缝集成功能,方便生成spring r ...

  6. Spring Cloud Config服务端配置细节(一)

    上篇文章我们看了Spring Cloud中分布式配置中心的一个基本使用,这里边还涉及到许多细节,本文我们就来看看服务端配置中的一些细节. 本文是Spring Cloud系列的第二十三篇文章,了解前二十 ...

  7. .net MVC在服务端代码输出html字符串

    .net MVC中在服务端脚本写字符串变量的时候 ,前端输出会自动转义,这个传统的WebForm有些区别,正确的写法是这样的. @{     string w="<a href=\&q ...

  8. 微服务Spring Cloud Eureka 服务端-基本配置(eureka.server.xxx)

    2019独角兽企业重金招聘Python工程师标准>>> Eureka配置系列: Eureka 客户端-基本配置 https://my.oschina.net/langxSpirit/ ...

  9. java服务端下载微信头像并返回客户端

    首先说一下需求:白鹭引擎中使用webgl的情况下某些ios没法直接下载显示微信用户头像(应该是认证相关的东西吧),而使用canvas模式又十分耗费性能.手机极易发热.所以只能在客户端请求的时候获取用户 ...

  10. backbone 模板 html,用Backbone.js绑住服务端生成的html

    去年做雪球的timeline模块时我正深受 #newTwitter 的影响,倾向于把尽可能多的逻辑放到客户端去做,最后实现的时候选择了Backbone.js.使用Backbone.js的好处就不说了, ...

最新文章

  1. 【复盘】如何培养小朋友的编程能力?
  2. 遇到automation服务器不能创建对象...
  3. App Class Loader
  4. SAP传统电商解决方案的技术挑战以及SAP的应对措施
  5. mysql+默认值+default_十六、MySQL 中数据类型的默认值 - default 约束-搜云库
  6. 微软企业库5.0学习笔记(三十三)数据访问模块
  7. JDK源码解析之 java.lang.Thread
  8. 分布式锁的 3 种实现方案!
  9. 如何解决Error: failed PB timebomb check
  10. Palo Alto 再次修复一个严重的 PAN-OS 漏洞
  11. Ajax实现搜索提示框~超级详细
  12. ES6中变量的解构赋值
  13. Intellij IDEA 导入Maven项目
  14. JavaWeb实现记住密码功能(使用Cookie)
  15. 访问共享计算机的用户名和密码怎么设置,Win7系统下共享文件夹怎么设置账号密码...
  16. 艾默生首席执行官范大为退休;液化空气将新建生产装置为京东方供应气体 | 美通企业日报...
  17. 使用QtCharts报错
  18. 在线自习室——新型的学习利器
  19. sizeof(int)为什么输出的是4而不是2呢,int类型究竟占几个字节
  20. Framer:开源原型设计工具,巨头们的心头好

热门文章

  1. 重积分定理与计算总结
  2. data协议,好玩,好用
  3. RouterOS o*** client 连接爱快 Open*** 服务端
  4. 【蓝凌系统】OA首页最新知识_正文表格模板
  5. 总结一下m3u8格式相关问题
  6. iOS微信分享服务器设置,ios微信分享设置title怎么弄?
  7. destoon-开启远程ftp后会员头像上传不显示
  8. DSP TMS320C5509A 控制DDS AD9854芯片驱动
  9. Java版本kafka-clients的介绍
  10. Gos —— 获取物理内存容量