java大图是否包含小图java实现-很Low

jar代码,与框架无关,写的很Low,能够达到大图包含小图的目的,无需第三方JAR包:

package com.raiyi.pict;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

/**
 * 大图是否包含小图,主要思路是将大图rgb的值转成二维数组,为了方面计算再转成List,
 * 同理小图也是,然后确认包含关系
 * 
 * @author Nana
 *
 */
public class PictRGBCompare {

	public static void main(String[] args) {

		long start = System.currentTimeMillis();

		int[][] p1 = getImageGRB("D://t1.jpg");// 大图,转二位数组
		int[][] p10 = getImageGRB("D://t10.jpg"); // 小图,转二位数组

		List<List<String>> al21 = array2List(p1);// 转list
		List<List<String>> al210 = array2List(p10);// 转list
		System.out.println(al210);

		int trueCount = 0; // 大图包含小图rgb值的行数
		for (int al210i = 0; al210i < al210.size(); al210i++) {// 遍历小的集合
			List<String> al210iLoops = al210.get(al210i);
			for (int al21i = 0; al21i < al21.size(); al21i++) {// 遍历大的集合
				List<String> al21iLoops = al21.get(al21i);
				if (al21iLoops.containsAll(al210iLoops)) {
					// System.out.print(al21i + ",");
					trueCount++; // FIXME:此处可能存在问题
				}
			}
			// System.out.println(al210i);
		}

		if (trueCount >= al210.size()) {// 包含行数出现的次数大于等于小图的行数默认包含,此处太暴力了,XXX:美好一点的话判断小图的出现大图的起始位置及结束位置,其他包含的排除
			System.out.println("包含");
		} else {
			System.out.println("不包含");
		}

		System.out.println("cost time : " + System.currentTimeMillis() - start);
	}

	@SuppressWarnings("unused")
	private static void formatArrays(int[][] num) {
		for (int x = 0; x < num.length; x++) { // 定位行
			for (int y = 0; y < num[x].length; y++) { // 定位每行的元素个数
				System.out.print(addZeroForNum(num[x][y] + "") + ",");
			}
			System.out.println();
		}
	}

	/**
	 * 转数组
	 * 
	 * @param aas
	 * @return
	 */
	private static List<List<String>> array2List(int[][] aas) {
		List<List<String>> listTest = new ArrayList<List<String>>();
		for (int i = 0; i < aas.length; i++) {
			List<String> columnList = new ArrayList<String>();
			for (int j = 0; j < aas[i].length; j++) {
				columnList.add(addZeroForNum(aas[i][j] + ""));
			}
			listTest.add(columnList);
		}
		return listTest;
	}

	/**
	 * 左补齐8位,输出的rbg集合方便对比,为啥是8位?因为RGB的最大值是FFFFFF=16777215
	 * 
	 * @param str
	 * @return
	 */
	private static String addZeroForNum(String str) {
		int strLen = str.length();
		if (strLen < 8) {
			while (strLen < 8) {
				StringBuffer sb = new StringBuffer();
				sb.append("0").append(str);// 左补0
				str = sb.toString();
				strLen = str.length();
			}
		}
		return str;
	}

	/**
	 * 根据BufferedImage获取图片RGB数组
	 * 
	 * @param bfImage
	 * @return
	 */
	public static int[][] getImageGRB(String pictPath) {
		File file = new File(pictPath);
		BufferedImage bi = null;
		try {
			bi = ImageIO.read(file);
		} catch (IOException e) {
			e.printStackTrace();
		}

		int width = bi.getWidth();
		int height = bi.getHeight();
		int[][] result = new int[height][width];
		for (int h = 0; h < height; h++) {
			for (int w = 0; w < width; w++) {
				result[h][w] = bi.getRGB(w, h) & 0xFFFFFF;
			}
		}
		return result;
	}
}


随便写的

评论区

JFinal

2018-05-18 11:07

感谢分享

热门分享

扫码入社