just for fun

代码可以直接运行,所有参数都提取成了常量,几乎都可以修改(除了256色阶)

Java 版本

package graph;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*** 随机产生类似Github的马赛克风格头像* @author LLH*/
public class GenerateMosaicHeadImg {/** 背景颜色 */private final static Color BACK_GROUND_COLOR = new Color(238, 238, 238);/** 图片宽 */private final static int IMG_WIDTH = 360;/** 图片高 */private final static int IMG_HEIGHT = 360;/** 图片边缘内边距 */private final static int PADDING = 30;/** 填充比率,越接近1,有色色块出现几率越高 */private final static double RADIO = 0.45;/** 每边矩形数量(建议>=5) */private final static int BLOCK_NUM = 9;/** 颜色差值评价值(越大颜色越鲜艳) */private final static int COLOR_DIFF_EVALUATION = 100;/** 基色阶数极限 */private final static int COLOR_LIMIT = 256;/** 保存路径 */private final static String DIR = "D://headImg/";public static void main(String[] args) throws IOException {//得到图片缓冲区BufferedImage bi = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_RGB);//得到它的绘制环境(这张图片的笔)Graphics2D g2 = (Graphics2D) bi.getGraphics();//设置背景颜色g2.setColor(BACK_GROUND_COLOR);g2.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);// 随机颜色Color mainColor = getRandomColor();// 随机生成有效块坐标集合List<Point> pointList = getRandomPointList(RADIO);// 填充图形fillGraph(g2, pointList, mainColor);File file = new File(DIR);if (!file.exists()) {file.mkdirs();}// 输出ImageIO.write(bi,"JPG",new FileOutputStream(DIR+System.currentTimeMillis()+".jpg"));//保存图片 JPEG表示保存格式}/*** 填充图形* @param g2        画笔* @param pointList 填充块坐标* @param mainColor 填充颜色*/private static void fillGraph(Graphics2D g2, List<Point> pointList, Color mainColor) {int rowBlockLength = (IMG_HEIGHT - 2 * PADDING) / BLOCK_NUM;int colBlockLength = (IMG_WIDTH - 2 * PADDING) / BLOCK_NUM;// 填充g2.setColor(mainColor);// 遍历pointsfor (Point point : pointList) {g2.fillRect(PADDING + point.x * rowBlockLength,PADDING + point.y * colBlockLength,rowBlockLength, colBlockLength);}}/*** 获取随机颜色位置列表* @param radio 填充色块几率* @return List<Point> 列表*/private static List<Point> getRandomPointList(double radio) {ArrayList<Point> points = new ArrayList<>();for (int i = 0; i < BLOCK_NUM/2; i++) {for (int j = 0; j < BLOCK_NUM; j++) {if (Math.random() < radio) {points.add(new Point(i, j));}}}addReversePoints(points);if (BLOCK_NUM % 2 == 1) {for (int i = 0; i < BLOCK_NUM; i++) {if (Math.random() < radio) {points.add(new Point(BLOCK_NUM/2, i));}}}return points;}/*** 获取随机颜色* @return Color对象*/private static Color getRandomColor() {int r, g, b;do {r = new Random().nextInt(COLOR_LIMIT);g = new Random().nextInt(COLOR_LIMIT);b = new Random().nextInt(COLOR_LIMIT);} while (evaluateColor(r, g, b));return new Color(r, g, b);}/*** 评价颜色品质,只需任意两种颜色差值大于某个规定值即可* @return boolean*/private static boolean evaluateColor(int r, int g, int b) {int rg = Math.abs(r - g);int rb = Math.abs(r - b);int gb = Math.abs(g - b);int max = rg > rb ? (rg > gb ? rg : gb) : (rb > gb ? rb : gb);return max < COLOR_DIFF_EVALUATION;}/*** 添加对称坐标* @param points point的列表*/private static void addReversePoints(List<Point> points) {ArrayList<Point> pointListCopy = new ArrayList<>(points);for (Point point : pointListCopy) {points.add(new Point((BLOCK_NUM-1-point.x), point.y));}}/*** 封装了坐标的内部类*/private static class Point {private int x;private int y;Point(int x, int y) {this.x = x;this.y = y;}}
}

效果图


Go 版本

package imageimport ("fmt""image""image/color""image/jpeg""math""math/rand""os""time"
)const (// 图片边距imgSize = 360// 图片边缘内边距padding = 30// 填充比率ratio = 0.49// 每边矩形数量blockNum = 9// 颜色差值评价值(越大颜色越鲜艳)colorDiffEvaluation = 100// 基色阶数(默认256)colorLimit = 256// 保存路径dir = "D://headImg"
)var (// 背景颜色backGroundColor = color.Gray{Y: 238}
)// 坐标点
type point struct {x, y uint
}/*** 主方法* @author LLH*/
func NewMosaicHeadImg() (err error) {// 图片初始化img := image.NewRGBA(image.Rect(0, 0, imgSize, imgSize))fillBackGround(img)// 随机颜色randomColor := getRandomColor()// 有色坐标块集合pointList := generateRandomPointList()// 填充色块fillGraph(img, randomColor, pointList)// 写IOerr = os.MkdirAll(dir, os.ModePerm)if err != nil {return}file, err := os.Create(fmt.Sprintf("%s/%d.jpg", dir, time.Now().UnixNano()))if err != nil {return}defer file.Close()err = jpeg.Encode(file, img, nil)fmt.Println("done!")return
}// 填充色块
func fillGraph(img *image.RGBA, c *color.RGBA, points *[]point) {blockLen := uint(imgSize-2*padding) / blockNum// 填充for _, p := range *points {fillRect(img, p.x*blockLen+padding, p.y*blockLen+padding, blockLen, blockLen, c)}
}// 获取随机坐标点切片
func generateRandomPointList() *[]point {points := make([]point, 0)// 获取半边随机点for x := 0; x < blockNum/2; x++ {for y := 0; y < blockNum; y++ {pointsGrowUp(&points, x, y)}}// 生成另一半的随机点addReversePoints(&points)if blockNum%2 == 1 {for i := 0; i < blockNum; i++ {pointsGrowUp(&points, blockNum/2, i)}}return &points
}// 添加随机坐标
func pointsGrowUp(points *[]point, x int, y int) {seed := getRandSeed()if seed.Float64() < ratio {*points = append(*points, point{uint(x), uint(y)})}
}// 添加对称点
func addReversePoints(points *[]point) {for _, p := range *points {*points = append(*points, point{blockNum - 1 - p.x, p.y})}
}// 获取随机颜色
func getRandomColor() *color.RGBA {var r, g, b int16for {r = randomColorBaseValue()g = randomColorBaseValue()b = randomColorBaseValue()if evaluateColor(r, g, b) {return &color.RGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: 100}}}
}// 获取随机颜色基色值
func randomColorBaseValue() int16 {seed := getRandSeed()return int16(seed.Int31() & (colorLimit - 1))
}// 获取随机数种子
func getRandSeed() *rand.Rand {seed := rand.New(rand.NewSource(time.Now().UnixNano()))time.Sleep(time.Nanosecond)return seed
}// 评价颜色鲜艳程度,足够鲜艳则返回 bool
func evaluateColor(r int16, g int16, b int16) bool {rg := math.Abs(float64(r - g))rb := math.Abs(float64(r - b))gb := math.Abs(float64(g - b))var max = math.Max(rg, rb)max = math.Max(max, gb)return max > colorDiffEvaluation
}// 填充背景色
func fillBackGround(image *image.RGBA) {fillRect(image, 0, 0, imgSize, imgSize, backGroundColor)
}// 填充矩形的颜色
func fillRect(image *image.RGBA, x0, y0 uint, width, height uint, color color.Color) {rgba := colorConverter(color)for x := x0; x < x0+width; x++ {for y := y0; y < y0+height; y++ {image.SetRGBA(int(x), int(y), rgba)}}
}// 得到类型为RGBA的颜色
func colorConverter(c color.Color) color.RGBA {r, g, b, a := c.RGBA()return color.RGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: uint8(a)}
}

实现类似于Github的随机形状、随机颜色 像素风格头像相关推荐

  1. 【原创】生成文件MD5图像,类似于GitHub的像素风格头像

    前言 我想通过文件的md5生成关于这个md5的图像,类似于GitHub的随机像素头像,用处是让这个md5更加直观,也能用于生成各种用户头像,跟GitHub一样. 网上搜了一下,没有现成的方法,只能有一 ...

  2. 设计师神器_随机形状生成器

    相信你看到过很多以不规则形状作为背景的设计图片,比如这样的 那这样的形状要怎么画?钢笔直接勾么?未免太麻烦,还不一定好看.今天,小编我就给大家推荐一个极其方便快捷的,正常网络状态可以访问的线上随机形状 ...

  3. Java背景颜色怎么设成随机的_JS实现随机改变背景颜色

    JS实现随机改变背景颜色 JS实现随机改变背景颜色 使用Js实现随便点击页面某位置就能改变页面背景颜色的功能 function changeBg(){//改变背景颜色的函数 var bgColor=& ...

  4. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(设置异常值的形状、颜色)实战

    R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(设置异常值的形状.颜色)实战 目录 R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(设置异常值的 ...

  5. Python生成中文词云图(二):不可指定词云特定的形状和颜色。

    Python生成中文词云图(二):不可指定词云特定的形状和颜色. 什么是词云? 首先,什么是词云呢?词云又叫文字云,是对文本数据中出现频率较高的"关键词"在视觉上的突出呈现,形成关 ...

  6. 自回避随机行走问题 c语言,醉汉随机行走/随机漫步问题(Random Walk Randomized Algorithm Python)...

    世界上有些问题看似是随机的(stochastic),没有规律可循,但很可能是人类还未发现和掌握这类事件的规律,所以说它们是随机发生的. 随机漫步(Random  Walk)是一种解决随机问题的方法,它 ...

  7. Python生成中文词云图(一):可指定特定的词云形状和颜色。

    Python生成中文词云图 什么是词云? 首先,什么是词云呢?词云又叫文字云,是对文本数据中出现频率较高的"关键词"在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从 ...

  8. 如何理解“伪随机”以及“随机种子”

    "真随机"与"伪随机" 真随机:就是我们传统意义上理解的"随机",随机事件如今天是否下雨,抛硬币的正反面,家门口的十字路口今天发生车祸等等. ...

  9. Unity之读取色盘(任意形状和颜色分布)颜色

    色盘是一张图,我们不用关心其形状或颜色分布,根据业务需求请美工做出该图即可. 在这里,我使用这样一张图作为色盘图: 需求:鼠标点击/按住该UI图的时候,把该位置对应的颜色值赋给模型.模型变色请看这篇博 ...

最新文章

  1. Dwr 框架简单实例
  2. 这个图像生成领域的PyTorch库火了,涵盖18+ SOTA GAN实现
  3. Spring Boot Admin 2.5.5 发布,支持在线重启服务
  4. sqlserver全文索引问题
  5. mysql连接规定时区以及编码_springboot项目中使用mysql连接遇到时区timezone问题,和编码encoding问题解决...
  6. MySQL中InnoDB引擎对索引的扩展
  7. 必须掌握的Python技巧(三)
  8. Tiny-Event-Manager 安全轻量的资源管理器
  9. Android学习资源网站 1
  10. AutoDesk CAD 2014安装VBA Enabler图文教程(附AutoCAD_2014_VBA_Win_64bit下载)
  11. 菜鸟教程 程序员学习网站
  12. 你真的了解VRP操作系统吗?华为网络设备的文件系统、设备基础管理、命令行基础一次学会
  13. 计算机2010word中的页面背景在哪里,word2010里怎样填充页面背景图片
  14. openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决
  15. switch语言的应用
  16. C语言中excit函数,2010年12月英语四级全真预测试卷及答案解析(4)
  17. L2正则化(L2 Regularization)
  18. C语言实现状态机(二)
  19. 2022-09-08 mysql/stonedb-慢SQL-记录
  20. 安装gensim失败,各种方法未果,最后注意到 error: Microsoft Visual C++ 14.0 or greater is required,终于解决

热门文章

  1. 全志tina-boot0-uboot
  2. with 语句的作用
  3. oracle中怎么列转行,oracle列转行方法总结
  4. 华为nova8什么时候上市
  5. C语言扫雷函数成绩,扫雷(C语言)
  6. 低延迟长续航手游伴侣—HyperX Cloud Buds云雀蓝牙无线游戏耳机
  7. 内储说下六微第三十一
  8. Apache Camel - 2 - Camel小栗子(File)
  9. 编 译 原 理 上机大作业<函数绘图语言解释器>
  10. 敏捷开发 DDD 管理