前言

刚刚过完年,把这样那样的事情忙完,就赶紧把博客剩下的主要功能都先做完了,感觉一身轻松。

闲下来了就抽空看看Github上的项目,偶然间发现Github的默认头像很有特色,它并不像其它的网站一样使用一张默认图片,而是临时随机生成一张,很有特色,看起来也挺好玩的,于是就想着自己也弄一个仿制品来玩玩吧。

准备工作

先研究一下Github默认头像的结构,先拿几张Github用户的默认头像来看看:

github_user_avatar_1

github_user_avatar_2

先查看一下这些图片的大小,为 420*420px,仔细看一下,结构应该是这样的:

中心矩阵为 5x5

每一块长度为 70px

边缘的灰色条条长度为 35px

搞清楚这些,就可以开始自己撸了,决定使用 Java + OpenCV 3.4 来制作图像。

代码

GithubAvatarGenerator.java

import org.opencv.core.CvType;

import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;

import java.util.Random;

/**

* Github头像生成器

*/

public class GithubAvatarGenerator {

private static final int GITHUB_AVATAR_ROWS = 420;

private static final int GITHUB_AVATAR_COLS = 420;

// 围边使用的灰色

private static final int [] COLOR_GREY_BGR = new int[] {

230, 230, 230

};

// 选出一些大概会比较好看的颜色池用于生成

private static final int [][] COLOR_POOL_RGB = new int[][] {

{170, 205, 102},

{159, 255, 84},

{209, 206, 0},

{255, 255, 0},

{47, 107, 85},

{47, 255, 173},

{0, 173, 205},

{8, 101, 139},

{180, 180, 238},

{106, 106, 255},

{155, 211, 255},

{204, 50, 153},

{101, 119, 139}

};

// 外围宽度

private static final int GITHUB_AVATAR_FRAME_WIDTH = 35;

// Block宽度

private static final int GITHUB_AVATAR_BLOCK_WIDTH = 70;

// Vertex 大小

private static final int GITHUB_AVATAR_VERTEX_WIDTH = 5;

/**

* 获取一个 5x5 的随机填充对称矩阵

* @return 5x5 随机填充对称矩阵

*/

private boolean [][] getGithubAvatarVertex() {

// 新建矩阵

boolean [][] vertex = new boolean[5][5];

// 先随机填充中间一条

Random random = new Random();

for (int i = 0; i < 5; i++) {

if (random.nextBoolean()) {

vertex[i][2] = true;

}

}

// 随机填充半边

for (int i = 0; i < 5; i++) {

for (int j = 0; j < 2; j++) {

if (random.nextBoolean()) {

vertex[i][j] = true;

}

}

}

// 将填充的半边对称复制到另外半边

for (int i = 0; i < 5; i++) {

for (int j = 3; j < 5; j++) {

vertex[i][j] = vertex[i][4 - j];

}

}

return vertex;

}

/**

* 获取一个随机的 github 头像 BGR 信息

* @return 图像 BGR 信息

*/

private byte [][][] getGithubAvatarRGBData() {

// 通道

int channels = 3;

// BGR 信息

byte [][][] bgrData = new byte[GITHUB_AVATAR_ROWS][GITHUB_AVATAR_COLS][channels];

// 获取一个随机的颜色索引

Random random = new Random();

int randomIndex = random.nextInt() % COLOR_POOL_RGB.length;

if (randomIndex < 0) {

randomIndex = 0 - randomIndex;

}

// 用索引获取一个随机的颜色

int [] randomBGR = new int[3];

System.arraycopy(COLOR_POOL_RGB[randomIndex], 0, randomBGR, 0, 3);

// 先将外围一圈 35px 填充成灰色

// top

for (int i = 0; i < GITHUB_AVATAR_FRAME_WIDTH; i++) {

for (int j = 0; j < GITHUB_AVATAR_COLS; j++) {

for (int k = 0; k < channels; k++) {

bgrData[i][j][k] = (byte) COLOR_GREY_BGR[k];

}

}

}

// bottom

for (int i = GITHUB_AVATAR_COLS - 1; i > GITHUB_AVATAR_COLS - GITHUB_AVATAR_FRAME_WIDTH - 1; i--) {

for (int j = 0; j < GITHUB_AVATAR_COLS; j++) {

for (int k = 0; k < channels; k++) {

bgrData[i][j][k] = (byte) COLOR_GREY_BGR[k];

}

}

}

// left

for (int i = 0; i < GITHUB_AVATAR_COLS; i++) {

for (int j = 0; j

for (int k = 0; k < channels; k++) {

bgrData[i][j][k] = (byte) COLOR_GREY_BGR[k];

}

}

}

// right

for (int i = 0; i < GITHUB_AVATAR_COLS; i++) {

for (int j = GITHUB_AVATAR_ROWS - 1; j > GITHUB_AVATAR_ROWS - GITHUB_AVATAR_FRAME_WIDTH - 1; j--) {

for (int k = 0; k < channels; k++) {

bgrData[i][j][k] = (byte) COLOR_GREY_BGR[k];

}

}

}

// 将中间 5x5 的范围按照矩阵信息填充

boolean [][] vertex = getGithubAvatarVertex();

for (int i = 0; i < GITHUB_AVATAR_VERTEX_WIDTH; i++) {

for (int j = 0; j < GITHUB_AVATAR_VERTEX_WIDTH; j++) {

if (vertex[i][j]) {

for (int m = GITHUB_AVATAR_FRAME_WIDTH + i * GITHUB_AVATAR_BLOCK_WIDTH;

m < GITHUB_AVATAR_FRAME_WIDTH + i * GITHUB_AVATAR_BLOCK_WIDTH + GITHUB_AVATAR_BLOCK_WIDTH;

m++) {

for (int n = GITHUB_AVATAR_FRAME_WIDTH + j * GITHUB_AVATAR_BLOCK_WIDTH;

n < GITHUB_AVATAR_FRAME_WIDTH + j * GITHUB_AVATAR_BLOCK_WIDTH + GITHUB_AVATAR_BLOCK_WIDTH;

n++) {

for (int k = 0; k < channels; k++) {

bgrData[m][n][k] = (byte) randomBGR[k];

}

}

}

} else {

for (int m = GITHUB_AVATAR_FRAME_WIDTH + i * GITHUB_AVATAR_BLOCK_WIDTH;

m < GITHUB_AVATAR_FRAME_WIDTH + i * GITHUB_AVATAR_BLOCK_WIDTH + GITHUB_AVATAR_BLOCK_WIDTH;

m++) {

for (int n = GITHUB_AVATAR_FRAME_WIDTH + j * GITHUB_AVATAR_BLOCK_WIDTH;

n < GITHUB_AVATAR_FRAME_WIDTH + j * GITHUB_AVATAR_BLOCK_WIDTH + GITHUB_AVATAR_BLOCK_WIDTH;

n++) {

for (int k = 0; k < channels; k++) {

bgrData[m][n][k] = (byte) COLOR_GREY_BGR[k];

}

}

}

}

}

}

// 返回 BGR 信息

return bgrData;

}

/**

* 获取一个随机的头像

* @param fileName 文件名

*/

public void getARandomAvatar(String fileName) {

// 新建一个 img 文件

Mat img = new Mat(

GITHUB_AVATAR_ROWS,

GITHUB_AVATAR_COLS,

// RGB 通道

CvType.CV_8UC3

);

// 长

int width = img.cols();

// 宽

int height = img.height();

// 通道

int channels = img.channels();

// 图像中所有像素加通道的储存数据

int [][][] data = new int[height][width][channels];

// 获取数据头像 BGR 信息

byte [][][] randomAvatarBGR = getGithubAvatarRGBData();

// 将生成的 github 头像信息复制到图片中

for (int i = 0; i < height; i++) {

for (int j = 0; j < width; j++) {

img.put(i, j, randomAvatarBGR[i][j]);

}

}

// 保存图片

Imgcodecs.imwrite(fileName, img);

}

}

Main.java

import org.opencv.core.Core;

public class Main {

static {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

}

// main

public static void main(String[] args) {

GithubAvatarGenerator githubAvatarGenerator = new GithubAvatarGenerator();

for (int i = 1; i <= 20; i ++) {

githubAvatarGenerator.getARandomAvatar(String.valueOf(i) + ".jpg");

}

}

}

效果

一次性产生20张图片,我们来看看其中几张的效果

result_avatar_1

result_avatar_2

result_avatar_3

result_avatar_4

result_avatar_5

result_avatar_6

挺萌的蛤!

java图片头像代码_用Java和OpenCV生成Github默认头像相关推荐

  1. java空心正方形代码_从Java中的用户输入绘制空心星号正方形/矩...

    我正在尝试创建一个程序,要求用户提供正方形/矩形的宽度和长度尺寸,然后使用#符号将其绘制出来.我几乎了解了,除了我似乎不太了解矩形的右边以正确打印出来- 这是我的代码: import java.uti ...

  2. java图片去掉文字_关于java:Java-添加删除PPT文本和图片水印

    在前文中,我介绍过如何给PDF文档增加文本和图片水印.本文将具体解说如何增加.删除PPT文本和图片水印. 此次代码示例所用到的工具是Free Spire.Presentation for Java.F ...

  3. java调节音量代码_用Java调用VC音量控制程序_java

    前言 本文通过java的Runtime接口来实现调用其他语言实现的应用程序,进而来实现对计算机硬件信息的监控和控制.本文是多媒体信息系统的一个部分,就是调整计算机音量. 使用VC编写音量控制程序 本控 ...

  4. java dijkstra算法代码_[转载]Java实现dijkstra算法: 地图中任意起点寻找最佳路径...

    最近在复习java,下学期要用,写这个练手.  技术较粗糙,见谅. 代码里用的是这幅地图,根据实际情况更改,在addNode方法中 这个是运行结果,起点和终点在 运行wrap(String qidia ...

  5. java 测试用例核心代码_核心Java测验

    java 测试用例核心代码 Welcome to Core Java Quiz. Java is an object-oriented programming language. 欢迎来到Core J ...

  6. java好的代码_做java软件工程师,怎样才能写出好的代码?

    原标题:做java软件工程师,怎样才能写出好的代码? Java代码之于java程序员而言就是左膀右臂,java代码写的好的java程序员明显更是企业的欢迎,一个优秀的java程序员的考核标准之一也是看 ...

  7. java 图片放在哪_在Java Web应用程序中,应该将用户照片存储在哪里?

    小编典典 解决方案前要考虑的事项: 您是否会水平扩展Web应用程序(即,您是否正在运行多个servlet容器实例). 您期望什么样的流量? 图片需要更新的速度(即用户更改了头像后,他们和所有其他用户是 ...

  8. java计算机全部代码_(Java)谁有计算器的完整代码?

    展开全部 参考: http://gzdzw.51.net/htmjsq.htm 计算器代码: 计算器 var FKeyPad = document.Calculator; var Accum = 0; ...

  9. java引入bean代码_通过java代码装配bean

    importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.context.annot ...

最新文章

  1. 尚未备份数据库 *** 的日志尾部。如果该日志包含您不希望丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 备份该日志。...
  2. saltstack执行state.sls耗时长的坑
  3. PHP文件包含漏洞原理分析和利用方法
  4. OpenGL 基础光照ColorsBasic Lighting
  5. 如何成为优秀的程序员
  6. IOS工程自动打包并发布脚本实现
  7. c++ map是有序还是无序的_c++ unorder_map的用法
  8. mybatis中,collection配置后查询只显示一条记录
  9. python类型和格式_json数据格式和python中字典的数据类型
  10. 怎么让模糊的数字变清楚_一键模糊图像变清晰,好家伙!这款神器插件你值得拥有...
  11. 算法直观与对模型的理解
  12. 饥荒联机版Mod开发——制作栏(九)
  13. 2022年全国图书参考联盟读秀5.0/4.0/3.0/2.0/1.0书库网盘数据索引在线搜索查询系统搭建教程,可以实现ISBN/SS号/书封面链接/书名/作者/出版社…等信息一键搜索查询
  14. 【生信分析】Analyzing RNA-seq data with DESeq2:输入数据和差异表达分析
  15. android 8.0+后台Service限制
  16. 计算机地理绘图软件叫什么,地理教师如何选择理想的绘图软件 ──基于对常用绘图软件的比较与分析...
  17. mongodb java 日志分析_如何禁用mongoDB Java驱动程序日志记录?
  18. AndroidStudio使用之仿微信首页界面
  19. linux 物理内存释放,swap释放
  20. YOLOV7详细解读(一)网络架构解读

热门文章

  1. 从“账房先生”到“中国巨型计算机之父”,慈云桂先后主导了中国四代计算机的研发...
  2. PP熔喷、线烧、折叠滤芯保安过滤器
  3. java基于springboot+Vue+nodejs的高校网上二手闲置跳蚤市场 element
  4. 【cmd网速问题】解决cmd控制台下载东西网速过慢的问题
  5. MySQL十表联查快速得到结果_MySQL-第十篇多表连接查询
  6. 重庆大学计算机学院王臣,计算机学院召开人才引进及人才聘期考核工作会
  7. Trunk口的简单实例
  8. 做影视后期常用的行业软件
  9. 互联网+业务转型,云计算厂商对比
  10. 【短线策略】创新高牛股妖股主升浪启动选股交易策略