java图片头像代码_用Java和OpenCV生成Github默认头像
前言
刚刚过完年,把这样那样的事情忙完,就赶紧把博客剩下的主要功能都先做完了,感觉一身轻松。
闲下来了就抽空看看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默认头像相关推荐
- java空心正方形代码_从Java中的用户输入绘制空心星号正方形/矩...
我正在尝试创建一个程序,要求用户提供正方形/矩形的宽度和长度尺寸,然后使用#符号将其绘制出来.我几乎了解了,除了我似乎不太了解矩形的右边以正确打印出来- 这是我的代码: import java.uti ...
- java图片去掉文字_关于java:Java-添加删除PPT文本和图片水印
在前文中,我介绍过如何给PDF文档增加文本和图片水印.本文将具体解说如何增加.删除PPT文本和图片水印. 此次代码示例所用到的工具是Free Spire.Presentation for Java.F ...
- java调节音量代码_用Java调用VC音量控制程序_java
前言 本文通过java的Runtime接口来实现调用其他语言实现的应用程序,进而来实现对计算机硬件信息的监控和控制.本文是多媒体信息系统的一个部分,就是调整计算机音量. 使用VC编写音量控制程序 本控 ...
- java dijkstra算法代码_[转载]Java实现dijkstra算法: 地图中任意起点寻找最佳路径...
最近在复习java,下学期要用,写这个练手. 技术较粗糙,见谅. 代码里用的是这幅地图,根据实际情况更改,在addNode方法中 这个是运行结果,起点和终点在 运行wrap(String qidia ...
- java 测试用例核心代码_核心Java测验
java 测试用例核心代码 Welcome to Core Java Quiz. Java is an object-oriented programming language. 欢迎来到Core J ...
- java好的代码_做java软件工程师,怎样才能写出好的代码?
原标题:做java软件工程师,怎样才能写出好的代码? Java代码之于java程序员而言就是左膀右臂,java代码写的好的java程序员明显更是企业的欢迎,一个优秀的java程序员的考核标准之一也是看 ...
- java 图片放在哪_在Java Web应用程序中,应该将用户照片存储在哪里?
小编典典 解决方案前要考虑的事项: 您是否会水平扩展Web应用程序(即,您是否正在运行多个servlet容器实例). 您期望什么样的流量? 图片需要更新的速度(即用户更改了头像后,他们和所有其他用户是 ...
- java计算机全部代码_(Java)谁有计算器的完整代码?
展开全部 参考: http://gzdzw.51.net/htmjsq.htm 计算器代码: 计算器 var FKeyPad = document.Calculator; var Accum = 0; ...
- java引入bean代码_通过java代码装配bean
importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.context.annot ...
最新文章
- ueeditor 百度编译器使用onchange效果
- qt在表格中如何画线_如何把EXCEL的表格完整的粘贴到WORD文件中
- WildFly上具有AngularJS的Java EE 7和Java WebSocket API(JSR 356)
- JVM(2)--一文读懂垃圾回收
- ImportError: No module named ‘pandas.io.data‘
- java 一个月的第一天_java中如何正确获得一个月的第一天和最后一天
- 数据库系统实训——实验五——存储过程
- php绘制时钟刻度,怎么用canvas写钟表刻度的时钟和分钟
- wxpython应用程序错误_wxPython因分段错误而崩溃
- 学习Linux的途径。
- MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
- JS生成随机的字母数字组合的字符串
- R语言实现K最近邻算法(KNN)
- 序列化:ProtoBuf 与 JSON 的比较 !
- 安装matlab2016a教程---适合小白,超详细
- python爬取『大年初一』热映电影,以『可视化及词云秀』方式带你了解热映电影...
- 山水印|竹林野茶:它,被称为茶叶中瑰宝,不止抗癌那么简单
- python爬取bilibili数据_BiliBili爬取数据简单分析
- alias别名设置及删除
- 将字符串中的中文转为拼音(java)