用Java实现简单的“马赛克拼图”

本文介绍如何使用Java实现简单的马赛克拼图效果。通过计算小图片的平均灰度值并将其分组,然后将参考图片压缩并用分组的小图片替换像素点,达到拼接成有趣图案的目的。文章提供了代码实现,并展示了最终效果。
摘要由CSDN通过智能技术生成

先来一张效果图


这些头像都来自微信好友的,放大看这不过是一张众多头像拼成的大图,缩小或远看能够发现这些头像其实拼出了一个有趣的图案。这个实现思路并不复杂(这个思路暂时只针对黑白的图片如果要支持彩图会更复杂一点,可以了解下 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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值