先来一张效果图
这些头像都来自微信好友的,放大看这不过是一张众多头像拼成的大图,缩小或远看能够发现这些头像其实拼出了一个有趣的图案。这个实现思路并不复杂(这个思路暂时只针对黑白的图片,如果要支持彩图会更复杂一点,可以了解下 foto-mosaik-edda)
- 首先需要一张“参考图片”和大量小图片(最好都是方形的,头像是个很好的选择)
- 计算每一张方形小图片的平均灰度值,计算公式为 gray = (77*red + 150*green + 29*blue + 128) >> 8,这个公式是根据人对于不同色彩敏感程度而得出的
- 每张图片计算出的平均灰度值都在0~255,再按照灰度值区间分成4组,每个区间的跨度是256/4=64,当然也可以多一点,这是为了更容易匹配对应的像素点。
- 将参考图片压缩成较小的尺寸,上面这张图是压成50x50,计算每个像素点的灰度值,同样划分为4个区间,最后在区间对应分组里随机选择一张图片摆在对应的像素点上。
- 这个随机选择的算法也是有一定讲究的,我们希望的效果是尽量避免相同的图片相邻摆放
代码实现
GraphicsMosaicHandler.java(用于处理主要逻辑)
package com.yotwei.core;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by YotWei on 2018/3/26.
*/
public class GraphicsMosaicHandler {
public int handle(String srcPath, String dstPath) throws Exception {
//read origin image
Util.message("正在读入图片...");
BufferedImage inputImg = ImageIO.read(new File(srcPath));
BufferedImage outputImg = new BufferedImage(
inputImg.ge