用Java实现的简易马赛克拼图

  • 什么是马赛克拼图
  • 效果图
  • 原理
  • 所有代码

什么是马赛克拼图

马赛克拼图 简单来说就是远远看上去是一张大图,放大之后会发现其实是由许多张不同的小图组成

效果图

如果准备的照片更多的话,效果会更好一些



原理

这个的原理其实不难
以下是我的处理方法:
1.选择一张目标图案。先将这张图片压缩,(图片太大的话处理的量会比较大),计算每个像素点的rgb值。
2.需要大量的图片。我是用python写了一个简单的爬虫,先爬取几百张图片存起来。先压缩图片(同样是为了减少处理量),计算每张图片的平均rgb值。(需要爬虫代码可私戳)
3.选取与目标图案每个像素点的rgb最相近的图片放在相应的位置。最后将图片进行拼接即可。

一开始我是先利用rgb计算每个像素点的灰度值和每张图片的灰度值进行比较,但是这个方法对黑白图片比较有效,彩色图片的话呈现的效果就不大理想。后来改变了方法,比较的时候综合了红色分量绿色分量蓝色分量的差值,就能比较好的适合彩色图片。

所有代码

public class OutputTwo {double[][][] block;String name;int bit;//大图每行每列几个int smallSize;//小图压缩后单位int smallMounts;//仓库中所有小图数量double grays[][];public OutputTwo(String bigPhoto, int smallMounts, int bit, int smallSize) throws IOException {name=bigPhoto;this.bit=bit;this.smallSize=smallSize;this.smallMounts=smallMounts;grays = new double[smallMounts][1];for(int i=0;i<smallMounts;i++){//将所有图片rgb值储存下来grays[i]=calculate(System.getProperty("user.dir")+"/src/smallPhotos/"+(i+1)+".jpg");}//将大图压缩File imageFile = new File(System.getProperty("user.dir")+"/src/bigPhotos/"+bigPhoto);BufferedImage image = ImageIO.read(imageFile);image =resize(image,bit,bit);int width =image.getWidth();int height =image.getHeight();block =new double[ width][height][2];System.out.println(width);//计算每个像素点的rgb值 并储存下来for(int i=0;i<width;i++){for(int j=0;j<height;j++){int rgb=image.getRGB(i,j)& 0xFFFFFF;double r=(rgb & 0xff0000)>>16;double g=(rgb &0xff00)>>8;double b=(rgb & 0xff);block[i][j][0]=r;block[i][j][3]=g;block[i][j][4]=b;}}finish();}//拼接图片private void finish() throws IOException {BufferedImage ImageNew = new BufferedImage(smallSize*bit, smallSize*bit, BufferedImage.TYPE_INT_RGB);int height_i = 0;int width_i = 0;int [] ImageArrays = new int[smallSize * smallSize];for (int i = 0; i < block.length; i++) {for(int j=block[i].length-1;j>=0;j--){int index=0;double min =0;min=(grays[0][0]-block[i][j][0])*(grays[0][0]-block[i][j][0])+( grays[0][5]-block[i][j][6])*( grays[0][7]-block[i][j][8])+( grays[0][9]-block[i][j][10])*( grays[0][11]-block[i][j][12]);for(int y=0;y<grays.length;y++){double temp=(grays[y][0]-block[i][j][0])*(grays[y][0]-block[i][j][0])+( grays[y][13]-block[i][j][14])*( grays[y][15]-block[i][j][16])+( grays[y][17]-block[i][j][18])*( grays[y][19]-block[i][j][20]);index=min>temp?y:index;min=min>temp?temp:min;//找到平均rgb值与该像素点的rgb值相近的图片 替代该像素点的位置}File imageFile = new File(System.getProperty("user.dir")+"/src/smallPhotos/"+(index+1)+".jpg");BufferedImage image = ImageIO.read(imageFile);image =resize(image,smallSize,smallSize);ImageArrays = image.getRGB(0,0,image.getWidth(),image.getHeight(),ImageArrays,0,image.getWidth());ImageNew.setRGB(width_i, height_i, smallSize, smallSize, ImageArrays, 0, smallSize);width_i+=smallSize;}width_i=0;height_i+=smallSize;System.out.println(i+"ok");}ByteArrayOutputStream out = new ByteArrayOutputStream();ImageIO.write(ImageNew, "jpg", out);// 图片写入到输出流中ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());BufferedImage newImage = ImageIO.read(in);File outputfile = new File(System.getProperty("user.dir")+"/src/results/"+name+"——two.jpg");ImageIO.write(newImage, "jpg", outputfile);}//计算平均rgb值private double[] calculate(String Photo) throws IOException {File imageFile = new File(Photo);BufferedImage image = ImageIO.read(imageFile);image =resize(image,smallSize,smallSize);double ave[]=new double[3];image.getSource();int width =image.getWidth();int height =image.getHeight();for(int i=0;i<width;i++){for(int j=0;j<height;j++){int rgb=image.getRGB(i,j)& 0xFFFFFF;ave[0]+=((rgb & 0xff0000)>>16)*1.0/(height*width);ave[1]+=((rgb & 0xff00)>>8)*1.0/(height*width);ave[2]+=((rgb & 0xff))*1.0/(height*width);}}return ave;}//压缩图片private static BufferedImage resize(BufferedImage source, int targetW,int targetH) {int type = source.getType();BufferedImage target = null;double sx = (double) targetW / source.getWidth();double sy = (double) targetH / source.getHeight();// 这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放// 则将下面的if else语句注释即可
//        if (sx < sy) {//            sx = sy;
//            targetW = (int) (sx * source.getWidth());
//        } else {//            sy = sx;
//            targetH = (int) (sy * source.getHeight());
//        }if (type == BufferedImage.TYPE_CUSTOM) { // handmadeColorModel cm = source.getColorModel();WritableRaster raster = cm.createCompatibleWritableRaster(targetW,targetH);boolean alphaPremultiplied = cm.isAlphaPremultiplied();target = new BufferedImage(cm, raster, alphaPremultiplied, null);} elsetarget = new BufferedImage(targetW, targetH, type);Graphics2D g = target.createGraphics();// smoother than exlax:g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC);g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));g.dispose();return target;}public static void main(String[] args) throws IOException {OutputTwo output =new OutputTwo("timg.jpeg",576,200,32);System.out.println("ok");}
}

用Java实现的简易马赛克拼图相关推荐

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

    先来一张效果图 这些头像都来自微信好友的,放大看这不过是一张众多头像拼成的大图,缩小或远看能够发现这些头像其实拼出了一个有趣的图案.这个实现思路并不复杂(这个思路暂时只针对黑白的图片,如果要支持彩图会 ...

  2. 用java实现一个简易自动提款机

    用java实现一个简易自动提款机,且有以下要求 如何实现呢?首先,我们定义一个用户类User,同时根据要求设计好属性(本人部分命名没有使用驼峰命名法,不够规范).因为一个人可能有多个卡,卡号又不能重复 ...

  3. Java多线程编写简易飞机大战(一)

    ** Java多线程编写简易飞机大战(一) ** 利用多线程编写飞机大战,主要有3个关键: ①继承Thread类,重写run方法: ②线程工作代码在run方法中写: ③启动时,调用线程对象的start ...

  4. Java中的实现马赛克效果以及灰度效果----整张图片

    ** Java中的实现马赛克效果以及灰度效果-----整张图片 ** 实现该效果的思路: 我们知道图片是由一个一个的像素组成的,比如一张图片的分辨率为800 * 800,则它是由800个像素 * 80 ...

  5. JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser

    转载自 JSOUP 教程-- Java爬虫,简易入门,秒杀htmlparser 关于爬虫,之前一直用做第一个站的时候,记得那时候写的 爬虫  是爬sina 的数据,用的就是 htmlparser  可 ...

  6. opengl实现三维动画简单代码_使用Python简单实现马赛克拼图!内附完整代码

    今天小编带大家使用python简单实现马赛克拼图,内容比以往会稍长一些,各位看官老爷可以慢慢细读,若有不足之处还望请斧正,闲话不多说,请看文章. 先看原图: 效果图: 思路: 拼图的原理其实很简单,就 ...

  7. Java案例:简易记事本

    Java案例:简易记事本 一.案例演示 二.涉及知识点 1.窗口(JFrame) 2.标签(JLabel) 3.文本区(JTextArea) 4.菜单 5.文件读写 6.事件处理 7.工具栏   三. ...

  8. python 马赛克拼图_使用 python 做到马赛克拼图

    死宅一枚.爬取5000张二次元妹子的图片,生成了头图. 接下来看看怎么实现的: 使用 Scrapy 框架爬取5000张二次元图 使用 opencv 批量格式化图片 将图片按照RGB值的均方根排序,实现 ...

  9. 马赛克 拼图 python_使用Python的马赛克艺术。

    马赛克 拼图 python In my previous article, I have explored an interesting format of representing images c ...

最新文章

  1. 第五章 文件和目录管理
  2. create-react-app搭建环境+Less+element+router+flux状态管理
  3. python编写异常处理_Python 简明教程 --- 23,Python 异常处理
  4. 迅为linux下串口,迅为IMX6ULL开发板Linux RS232/485驱动实验(上)
  5. linux网卡固件名,修改CentOS7网卡名称为传统名称eth0格式
  6. python scapy模块安装_python scapy模块安装与依赖模块
  7. 因一个 Bug,Cassandra 4.0 暂停发布
  8. 华为暂没有推出鸿蒙手机计划;苹果否认 iPhone 辐射超标;Kotlin 1.3.50 发布 | 极客头条...
  9. webstrom配置一键修复ESLint的报错
  10. 服务器系统怎样设置定时开关机,如何配置服务器定时开关机
  11. Java NumberFormat,DecimalFormat保存小数位数
  12. 由西云数据运营的中国第二个AWS区域正式向客户提供服务
  13. 根据标题自动生成图片程序,使用教程,并附程序下载
  14. 嗨!亲爱的朋友们,欢迎您光临我的…
  15. Intel Edison
  16. 多伦多大学计算机专业硕士,多伦多大学计算机硕士专业 看你满足录取要求吗...
  17. MySQL性能调优(6)解读58同城数据库设计军规30条
  18. UE4 反射系统(UBT和UHT)介绍
  19. Facebook广告组如何复制到其他广告系列中
  20. 从gitlab下载公司项目代码流程(还有git的学习和使用)

热门文章

  1. 奈奎斯特定律和香农定理
  2. “ORA-01017(:用户名/口令无效; 登录被拒绝)”解决办法
  3. 卷积神经网络表情识别,神经网络表情识别
  4. CrystalDiskMark硬盘检测软件及下载地址
  5. 机器学习教学 plt.scatter()绘制散点图
  6. 软件安全学习笔记——C语言
  7. 可满足性问题 SAT、3SAT
  8. 笨方法学python3怎么样_在python3中如何实现《笨方法学Python》ex11中的效果
  9. Android中的图片加载
  10. php视频播放地址,视频网站播放地址获取方法