자바 그림비교 메소드 (bufferedImage 비교)
bufferedImage를 비교하는 메소드는 다음과 같다. 이 메소드는 그림 두 개가 크기(getWidth, getHeight)와 색상값(getRGB)이 완벽히 같은지 비교한다.
//버퍼상의 이미지 두 개를 비교하는 메소드
boolean bufferedImagesEqual(BufferedImage img1, BufferedImage img2) {
if (img1.getWidth() == img2.getWidth() && img1.getHeight() == img2.getHeight()) {
for (int x = 0; x < img1.getWidth(); x++) {
for (int y = 0; y < img1.getHeight(); y++) {
if (img1.getRGB(x, y) != img2.getRGB(x, y))
return false;
}
}
} else {
return false;
}
return true;
}
————————————————————————————————–
이를 발전시키면 작은 그림이 큰 그림에 포함되는지 확인하는 메소드를 만들 수 있다.
버퍼상의 이미지 두 개를 비교해서 큰 이미지 속에 작은 이미지가 포함하는지 알아낼 수 있다.
package com;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class SecondClass {
public static void main(String[] args) {
//그림1을 얻어옴
BufferedImage bimg=null;
try{
File file=new File(“c:/a/00.bmp”);
bimg=ImageIO.read(file);
}catch(Exception ex){System.out.println(ex.getMessage());}
//스크린샷 찍음
BufferedImage scrn=screenShot();
//그림1과 스크린샷을 비교
boolean includ=includeImg(scrn, bimg);
System.out.println(includ);
}
//화면 스크린샷을 버퍼드 이미지에 저장하는 메소드
public static BufferedImage screenShot(){
//스크린샷하기
BufferedImage scrn=null;//버퍼드이미지 선언
try{
//해상도 구하기
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
//스크린샷 찍기
Robot robot=new Robot();
scrn=robot.createScreenCapture(new Rectangle(0, 0, (int)screenSize.getWidth(), (int)screenSize.getHeight()));
//스크린샷 파일화
//ImageIO.write(scrn, “jpeg”, new File(“c:/a/res.jpeg”));
}catch(Exception ex){System.out.println(ex.getMessage());}
return scrn;
}
//큰 그림에 작은 그림이 속하는지(포함하는지) 검사하는 메소드
public static boolean includeImg(BufferedImage bigImg, BufferedImage smImg){
boolean res=false;
for(int xs=0;xs<bigImg.getWidth()-smImg.getWidth();xs++){
for(int ys=0;ys<bigImg.getHeight()-smImg.getHeight();ys++){
//System.out.println(xs+” “+ys+”를 검사”);
for(int i=xs;i<xs+smImg.getWidth();i++){
for(int j=ys;j<ys+smImg.getHeight();j++){
//System.out.println(i+” “+j);
if(bigImg.getRGB(i, j)!=smImg.getRGB(i-xs, j-ys)){
//픽셀값을 비교해서 다르면 체크
res=false;
break;
}
else{
res=true;
}
}
if(res==false){break;}//다르면 나감
}
if(res==true){
System.out.println(“발견좌표:”+xs+”,”+ys+” w:”+smImg.getWidth()+” h:”+smImg.getHeight());
break;
}
}
if(res==true){break;}
}
return res;
}
}