大题思路我在知乎有回答

在这里大概讲下代码。我实现的比较粗糙,只能使用正方形的图片,如有其他需要可以自行改动。

下面是主要代码。
这里面有俩自定义的类,VectorParser(实现AimParser接口,用于像素替代算法的实现,其中parse()函数输入原料图片的rgb数组和目标图片对象,返回一个二维数组,其中每个数代表一个原料图片在其数组中的索引,将用该图片替换相应像素)和DefaultSamping(实现PicSampling接口,返回采样后的图片对象,我只是简单的用默认的采样方法改变了图片大小,大家可以根据需要修改)

public class ImageStitch {public static int len = 25;BufferedImage aim = null;BufferedImage work = null;BufferedImage srcsOld[] = null;BufferedImage srcs[] = null;int rgbs[][] = null;int aimOfSrc[][];int numSrc = 0;public ImageStitch(File aim, File[] srcs) throws IOException {//原料图片个数numSrc = srcs.length;// 初始化插值后原料图片数组this.srcs = new BufferedImage[numSrc];                       //初始化原料图片的数组srcsOld = new BufferedImage[numSrc];//初始化图片的rgb数组this.rgbs = new int[numSrc][];// 读入目标图片(要拼的图片)this.aim = ImageIO.read(aim);                                               DefaultSampling sampling = new DefaultSampling();for (int i = 0; i < numSrc; ++i) {// 读入源(材料)图片并获取rgb数组srcsOld[i] = ImageIO.read(srcs[i]);//对图片进行插值this.srcs[i]  = sampling.sampling(srcsOld[i]);int width = this.srcs[i].getWidth();int height = this.srcs[i].getHeight();this.rgbs[i] = new int[width * height];//获取图片的rgb数组this.rgbs[i] = this.srcs[i].getRGB(0, 0, width, height, this.rgbs[i], 0, width);}}public void parseAim(AimParser aimParser) {//得到替换像素的图片的索引的数组aimOfSrc = aimParser.parse(rgbs, aim);//作品图片初始化work = new BufferedImage(aim.getWidth() * len, aim.getHeight() * len, BufferedImage.TYPE_INT_RGB);int x = 0, y = 0;for(int i = 0; i < aimOfSrc.length; ++i){x = 0;for(int j = 0; j < aimOfSrc[i].length; ++j){//将小图片填入大图片中work.setRGB(x, y, len, len, rgbs[aimOfSrc[j][i]], 0, len);x += len;}y += len;}//写图片到硬盘FileOutputStream ops;try {ops = new FileOutputStream(new File("D:/Photo/stitch/znh.jpg"));ImageIO.write(work, "jpg", ops);ops.flush();ops.close();System.out.println("Success!");} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {File aim = new File("D:/Photo/stitch/z5.jpg");File[] srcs = new File[6];srcs[0] = new File("D:/Photo/stitch/s1.jpg");srcs[1] = new File("D:/Photo/stitch/s4.jpg");srcs[2] = new File("D:/Photo/stitch/s3.jpg");srcs[3] = new File("D:/Photo/stitch/s5.jpg");srcs[4] = new File("D:/Photo/stitch/5.jpg");srcs[5] = new File("D:/Photo/stitch/2.jpg");ImageStitch imageStitch = new ImageStitch(aim, srcs);imageStitch.parseAim(new VectorParser());}}

AimParser接口和PicSampling接口

public interface AimParser {public int[][] parse(int[][] rgbs, BufferedImage aim);
}public interface PicSampling {public BufferedImage sampling(BufferedImage aim);
}

VectorParser 回答中取平均色值和选取替换图片的过程

public class VectorParser implements AimParser {int[][] rgbs = null;int[] averageR = null;int[] averageG = null;int[] averageB = null;@Overridepublic int[][] parse(int[][] r, BufferedImage aim) {int width = aim.getWidth();int height = aim.getHeight();int[][] aimOfSrc = new int[height][width];rgbs = r;averageR = new int[rgbs.length];averageG = new int[rgbs.length];averageB = new int[rgbs.length];for (int i = 0; i < rgbs.length; ++i) {for (int j = 0; j < rgbs[i].length; ++j) {averageR[i] += (rgbs[i][j] & 0xff0000) >> 16;averageG[i] += (rgbs[i][j] & 0xff00) >> 8;averageB[i] += rgbs[i][j] & 0xff;}averageR[i] /= rgbs[i].length;averageG[i] /= rgbs[i].length;averageB[i] /= rgbs[i].length;}for (int j = 0; j < height; ++j) {for (int i = 0; i < width; ++i) {int rgb = aim.getRGB(i, j);aimOfSrc[j][i] = choose(rgb);}}return aimOfSrc;}private int choose(int rgb) {int index = 0;int min = 2147483647;int r = (rgb & 0xff0000) >> 16;int g = (rgb & 0xff00) >> 8;int b = rgb & 0xff;for (int i = 0; i < rgbs.length; ++i) {int temp = (int)(Math.pow(averageR[i] - r, 2) + Math.pow(averageG[i] - g, 2) + Math.pow(averageB[i] - b, 2));if(temp < min){min = temp;index = i;}}return index;}
}

DefaultSampling

public class DefaultSampling implements PicSampling{@Overridepublic BufferedImage sampling(BufferedImage aim) {BufferedImage ret = new BufferedImage(ImageStitch.len, ImageStitch.len, BufferedImage.TYPE_INT_RGB);ret.getGraphics().drawImage(aim, 0, 0, ImageStitch.len, ImageStitch.len, null);return aim;}
}

下面是效果图



That’s all.
有什么说的不清楚的地方随时提问。

千图成像(用图片拼图片)的java教程相关推荐

  1. python千人成像_Python实现千图成像:从图片爬取到图片合成

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  2. Python---如何实现千图成像:初级篇(从图片爬取到图片合成)

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  3. python 爬取图片_Python实现千图成像:从图片爬取到图片合成

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  4. python 透明图片合成_Python实现千图成像:从图片爬取到图片合成

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  5. ps入门第20天_ps批处理_ps动作的编辑与创建 案例:千图成像

    一前言 二操作步骤 1.录制动作 ①窗口---动作---创建文件夹 ②创建新动作---命名 ③点击开始记录 ④点击裁剪---按住shift---裁剪出正方形 ⑤文件---存储为 找个任意的文件夹存放即 ...

  6. 千图网爬图片(BeautifulSoup)

    import requests from bs4 import BeautifulSoup import os #导入os模块class TuKuSpider():""" ...

  7. java多图片上传json_[Java教程]SpringMVC框架五:图片上传与JSON交互

    [Java教程]SpringMVC框架五:图片上传与JSON交互 0 2018-08-07 22:00:42 在正式图片上传之前,先处理一个细节问题: 每一次发布项目,Tomcat都会重新解压war包 ...

  8. java图片简单爬虫_[Java教程]使用jsoup进行简单的爬虫操作爬取图片

    [Java教程]使用jsoup进行简单的爬虫操作爬取图片 0 2015-12-01 17:00:27 package com.guanglan.util;import java.io.File;imp ...

  9. java点击图片发出声音_[Java教程]点击放大图片

    [Java教程]点击放大图片 0 2017-11-18 22:00:06 body{ text-align:center} div{ margin:50px auto} function clik(t ...

  10. java 浏览器访问图片不显示_[Java教程]重新上传图片后 地址不变 浏览器加载不到的问题...

    [Java教程]重新上传图片后 地址不变 浏览器加载不到的问题 0 2016-05-27 07:00:50 做项目的时候遇到一个问题: 上传文件以后,相同的地址,第一次加载没有问题,当你操作次数过快, ...

最新文章

  1. 美媒:中关村取代硅谷获评全球最大科技中心
  2. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件
  3. 数模学习笔记——微分方程(传染病模型)
  4. 【项目管理】敏捷原则
  5. Java容器---Set: HashSet TreeSet LinkedHashSet
  6. NoSQL介绍(七)
  7. python定义一个1xn矩阵_Python实现的矩阵类实例
  8. js控制时间显示格式
  9. 用 3 只“鸽子”,告诉你闪电网络如何改变加密消息传递方式!
  10. 什么标签用于在表单中构建复选框_以下 ( ) 标签用于在表单中构建复选框 。_IP通信技术答案_学小易找答案...
  11. 学习总结以及对接下来的规划
  12. 关于分布函数连续性的运用
  13. 竞赛资讯|阿里小蜜机器人跨语言短文本匹配算法竞赛
  14. 计算机主板结构分为at,2.2.1 计算机主板结构(1)
  15. 计算机文件夹操作教案,文件文件和文件夹教案
  16. 放肆一点又何妨(一)-银川与腾格里沙漠
  17. 商家商品上架流程(没有)
  18. php购物车登录用cookie,php利用cookies实现购物车的方法_PHP
  19. 一个大学教授在美国的生活
  20. mapinfo的tab图层汉字乱码_如何解决MapInfo打开文字乱码的问题

热门文章

  1. web服务器利用线程响应http请求,多线程实现的HTTP应用服务器(HTTPWebServer)Mutu 0.2 alpha连载I...
  2. Excel十个让你事半功倍的函数
  3. 职业生涯步步高(转)
  4. 个人居间服务,劳务费用怎样合理节税?自然人代开3个点
  5. django+javascrpt+python实现私有云盘代码
  6. 2023年湖北取得中级工程师职称多久后可以评高级?
  7. 快手和抖音怎么打开微信小程序
  8. 2023年贵州省职业技能大赛“网络安全” 项目比赛任务书
  9. Linux服务器挂掉,使之自动重启脚本
  10. Java: 猜拳游戏