자바 그림비교 메소드 (bufferedImage 비교)

자바 그림비교 메소드 (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;
 }

}