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

来源:互联网 发布:骂醒我 网络歌手 编辑:程序博客网 时间:2024/06/06 12:54

需求:

  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.效果


这里写图片描述

0 0
原创粉丝点击