자바 그림에서 글자 찾기

자바 그림에서 글자 찾기

 

원하는 텍스트, 폰트종류, 폰트크기를 input하면
화면 상에서 해당 글자를 찾아내는 메소드를 만들었음
한계점은 정확히 폰트 종류, 폰트 크기, 자간이 같아야만 찾아낸다는 점이다.

 

1. 텍스트를 그림(bufferdImage)으로 만든다. 이를 스몰이미지라고 하자.

2. 현재 화면을 스크린샷 찍는다. 빅 이미지라고 하자.

3. 스물 이미지가 빅 이미지에 포함되어 있는지 확인한다(4중 포문).

 

이 때, 가장 처음 발견된 폰트색깔을 기억한 후

뒤에 나오는 폰트색깔과 일치하는지를 점검한다.

(이렇게 하면 찾는 글자가 검은색이든 흰색이든 찾아낼 수 있다)

 

한계: 정확히 같은 폰트종류와 크기, 자간이어야만 찾아낸다.

——————————————————————————-

package com;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
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=txtToImg(“글자인식”, “돋움”, 16);//16);
 
  //스크린샷 찍음
  BufferedImage scrn=screenShot();
 
  //그림1과 스크린샷을 비교
  boolean includ=includeImg(scrn, bimg);
 
  System.out.println(includ);
 }
 //////////////////////////////////////////////////////////////
 //글자를 그림으로 변경
 public static BufferedImage txtToImg(String str,String fontName,int fontSize){
  //int fontSize=i+1;
  //String str=”휴지통”;
 
  BufferedImage img = new BufferedImage(fontSize*str.length(), (int)(fontSize*1), BufferedImage.TYPE_INT_RGB);
 
  Graphics2D graphics = img.createGraphics();
 
  //흰색으로 색칠
  graphics.fillRect(0, 0, fontSize*str.length(), (int)(fontSize*1));
  //graphics.setBackground(new Color(255,100,50));
  graphics.setColor(new Color(0,0,0));
  graphics.setFont(new Font(fontName, 0, fontSize));
 
  //글자를 출력
  graphics.drawString(str, 0, (int)(fontSize*0.9));
 
  File file=new File(“c:/a/make.bmp”);
  try{
    ImageIO.write(img, “bmp”, file);
  }catch(Exception ex){System.out.println(ex.getMessage());}
 
  return img;
 }
 ///////////////////////////////////////////////////////////
 //화면 스크린샷을 버퍼드 이미지에 저장하는 메소드
 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, “bmp”, new File(“c:/a/res.bmp”));
  
  }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++){
   
 int fontColor=-9999;
 
    //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);
      //같으면
      int bigRGB=bigImg.getRGB(i, j);
      int smallRGB=smImg.getRGB(i-xs, j-ys);
     
      Color bigClr=new Color(bigRGB);
      Color smallClr=new Color(smallRGB);

      if(smallRGB==-1){//작은 그림이 흰색이라면 배경
    //폰트 색이 지정되어있지 않다면 스킵
       if(fontColor==-9999){//폰트색이 지정되어있지 않다면
        res=true;
        continue;
       }
       else{
        //폰트 색이 지정되어 있다면
        if(bigRGB!=fontColor){
         //폰트색과 배경색이 다르다면 스킵
         res=true;
               continue;
        }
        else{
         //폰트색과 배경색이 같으면 안됨
         res=false;
            break;
        }
       }
      }
      else{//작은 그림이 흰색이 아니라면 글자
       if(fontColor==-9999){//폰트색이 지정되어있지 않다면
        fontColor=bigRGB;//큰그림의 현재색을 기억함(이것이 폰트색 기준이됨)
        res=true;
        continue;
       }
       else{
        //폰트색이 지정되어 있다면
        if(bigRGB==fontColor){
         //지정색과 같을 경우엔 스킵
         res=true;
               continue;
        }
        else{
         res=false;
            break;
        }
       }
      }
     }
     if(res==false){break;}//다르면 나감
    }
    if(res==true){
     
     System.out.println(“발견좌표:”+xs+”,”+ys+” w:”+smImg.getWidth()+” h:”+smImg.getHeight());
    
       BufferedImage scrn=null;//버퍼드이미지 선언
       try{
        //스크린샷 찍기
        Robot robot=new Robot();
        scrn=robot.createScreenCapture(new Rectangle(xs, ys, smImg.getWidth(), smImg.getHeight()));
       
        //스크린샷 파일화
        ImageIO.write(scrn, “bmp”, new File(“c:/a/result.bmp”));
       
       }catch(Exception ex){System.out.println(ex.getMessage());}
   
     break;
    }
   }
   if(res==true){break;}
  }
  return res;
 }

}