6월28일 자바(예외처리

2010. 6. 28. 09:142010년/6월


package net.itisn;

public class Greeting {
  static String greet(String name)
  {
    return "안녕하세요"+name+"님";
  }
  public static void main(String[] args) {
    if(args.length==0)
    {
      System.out.println("usage : java Greetin<name>");
      System.exit(1);
    }
    String msg =greet(args[0]);
    System.out.println(msg);
  }

}





우리가 C를 사용할때 main abc fsd 라고 할때
int main (args[])로 인해 main이 args[0]이다 하지만
자바에서는 args[0]이 바로 abc가 된다.
======================================================================
======================================================================
#include <windows.h>//API함수들의 원형과 사용하는 상수들이 정의 되어 있다.
#include <windows.h>
#include <math.h>
#include <iostream>
#include "0623.h"
#include "resource.h"
#include "soullex.h"
HWND hVFW;
HBITMAP hBit;
BITMAPINFO Bm;    //비트맵 정보를 가짐

HWND Hwndmain;
HDC hdc;


LPVIDEOHDR VideoHdr;
BYTE *RevData;
BYTE *imageData;
BITMAPINFO *binfo;

char str[128]; 
int iSum = 0;
int a=0;
float fnum;

RECT rt;
//라벨링 시작주소알아오기 
int Labeling(BYTE * Labelimage,BITMAPINFO* Labinfo,int icol)
{
  int cnt=0,ict; //라벨링 갯수 
  int ixt;
  int iyt;
  LONG Lbwidth4; // 가로 길이 
  LONG Lwidth;
  LONG Lheight;
  int stt;//시작주소 
  int rutaddr=0;
  int selc=0;
  
  
  Lwidth=Labinfo->bmiHeader.biWidth; //가로
  Lheight=Labinfo->bmiHeader.biHeight; //세로
  
  Lbwidth4=((Lbwidth4+3)>>2)<<2// 폭넓이 
  Lbwidth4=Lbwidth4*3;
  
  for(iyt=0;iyt<Lheight;++iyt)
  {
    for(ixt=0;ixt<Lwidth;++ixt)
    {
    
          



      if(Labelimage[iyt*Lbwidth4+ixt*3]==0//파란색이 0일때 (즉 빨간색)
      {
      
        Labelimage[iyt*Lbwidth4+ixt*3+2]=254//빨간색부분에 254를 대입 
        stt=iyt*Lbwidth4+ixt*3;      //시작주소 대입 
          
        cnt=0;
      
        while(1)
        {
          
          ict=0;
      
          
          if(Labelimage[(iyt-1)*Lbwidth4+(ixt-1)*3]==0//왼쪽밑 
          {
            ixt--;
            iyt--;
            Labelimage[(iyt)*Lbwidth4+(ixt)*3+2]=254;
            cnt++;
            ict++;
          }
          else if(Labelimage[(iyt-1)*Lbwidth4+(ixt*3)]==0//밑
          {
            iyt--;
            Labelimage[(iyt)*Lbwidth4+(ixt)*3+2]=254;
            cnt++;
            ict++;
          }
          
          else if(Labelimage[(iyt-1)*Lbwidth4+(ixt+1)*3]==0//오른쪽밑 
          {
            ixt++;
            iyt--;
            Labelimage[(iyt)*Lbwidth4+(ixt)*3+2]=254;
            cnt++;
            ict++;
            
          }
          else if(Labelimage[(iyt)*Lbwidth4+(ixt+1)*3]==0//오른쪽 
          {
            ixt++;
            Labelimage[(iyt)*Lbwidth4+(ixt)*3+2]=254;
            cnt++;
            ict++;
            
          }
          else if(Labelimage[(iyt+1)*Lbwidth4+(ixt+1)*3]==0//오른쪽 위 
          {
            ixt++;
            iyt++;
            Labelimage[(iyt)*Lbwidth4+(ixt)*3+2]=254;
            cnt++;
            ict++;
            
          }
          else if(Labelimage[(iyt+1)*Lbwidth4+(ixt)*3]==0//위 
          {
            iyt++;
            Labelimage[(iyt)*Lbwidth4+(ixt)*3+2]=254;
            cnt++;
            ict++;
            
          }
          
          else if(Labelimage[(iyt+1)*Lbwidth4+(ixt-1)*3]==0//왼쪽위 
          {
            ixt--;
            iyt++;
            Labelimage[(iyt)*Lbwidth4+(ixt)*3+2]=254;
            cnt++;
            ict++;
            
          }
          
          else if(Labelimage[(iyt)*Lbwidth4+(ixt-1)*3]==0//왼쪽  
          {
            ixt--;
            
            Labelimage[(iyt)*Lbwidth4+(ixt)*3+2]=254;
            cnt++;
            ict++;
            
          }
          
          if(ict==0)
          {
            break;
          }
          
          
          
        }
        if(cnt>selc)
        {
          rutaddr=stt;
          selc=cnt;
        }
        
        
      }
      
      



    }//첫번째 for문
    
    
    
  }//두번째 for문 
  
  
  return rutaddr;
}
//제일큰부분 색칠하기 
BYTE * Laimagedata(BITMAPINFO *Labinfo, BYTE * Laimage,int first)
{
  int ict=0//라벨링 갯수 
  int ixt;
  int iyt;
  LONG Lbwidth4; // 가로 길이 
  LONG Lwidth;
  LONG Lheight;
  //  int stt;//시작주소 
  //  int rutaddr=0;
  //  int selc=0;
  
  
  Lwidth=Labinfo->bmiHeader.biWidth;
  Lheight=Labinfo->bmiHeader.biHeight;
  
  Lbwidth4=((Lbwidth4+3)>>2)<<2;
  Lbwidth4=Lbwidth4*3;
  
for(iyt=0;iyt<Lheight;++iyt)
  {
    for(ixt=0;ixt<Lwidth;++ixt)
    {
      
  
      if(Laimage[iyt*Lbwidth4+ixt*3]!=0//파란색이 0일때 (즉 빨간색)
      {
        Laimage[iyt*Lbwidth4+ixt*3]=255;
        
      }
      else 
      {
        while(1)
        {
        
          ict=0;
        
          if(Laimage[(iyt-1)*Lbwidth4+(ixt-1)*3]==0//왼쪽밑 
          {
            ixt--;
            iyt--;
            Laimage[(iyt)*Lbwidth4+(ixt)*3+2]=255;
          
            ict++;
          }
          else if(Laimage[(iyt-1)*Lbwidth4+(ixt*3)]==0//밑
          {
            iyt--;
            Laimage[(iyt)*Lbwidth4+(ixt)*3+2]=255;
          
            ict++;
          }
          
          else if(Laimage[(iyt-1)*Lbwidth4+(ixt+1)*3]==0//오른쪽밑 
          {
            ixt++;
            iyt--;
            Laimage[(iyt)*Lbwidth4+(ixt)*3+2]=255;
          
            ict++;
            
          }
          else if(Laimage[(iyt)*Lbwidth4+(ixt+1)*3]==0//오른쪽 
          {
            ixt++;
            Laimage[(iyt)*Lbwidth4+(ixt)*3+2]=255;
          
            ict++;
            
          }
          else if(Laimage[(iyt+1)*Lbwidth4+(ixt+1)*3]==0//오른쪽 위 
          {
            ixt++;
            iyt++;
            Laimage[(iyt)*Lbwidth4+(ixt)*3+2]=255;
          
            ict++;
            
          }
          else if(Laimage[(iyt+1)*Lbwidth4+(ixt)*3]==0//위 
          {
            iyt++;
            Laimage[(iyt)*Lbwidth4+(ixt)*3+2]=255;
          
            ict++;
            
          }
          
          else if(Laimage[(iyt+1)*Lbwidth4+(ixt-1)*3]==0//왼쪽위 
          {
            ixt--;
            iyt++;
            Laimage[(iyt)*Lbwidth4+(ixt)*3+2]=255;
            
            ict++;
            
          }
          
          else if(Laimage[(iyt)*Lbwidth4+(ixt-1)*3]==0//왼쪽  
          {
            ixt--;
            
            Laimage[(iyt)*Lbwidth4+(ixt)*3+2]=255;
          
            ict++;
            
          }
          
            if(ict==0)
            {
              break;
            }
        
          
          
        }
      
        
      }
        
        
        
      }
      
      
    }
    
    
    
  
  return Laimage;
}
BOOL OnInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
  Hwndmain = hDlg;
  hdc = GetDC(hDlg);
  
  //캡쳐된 비디오 영상을 보여줄 윈도우 생성
  hVFW = capCreateCaptureWindow(TEXT("VFW"), WS_CHILD|WS_VISIBLE,0,0,1,1,hDlg,0);
  //(캡쳐될 윈도우 이름 생성, 윈도우 스타일, 시작점x좌표, 시작점y좌표, 넓이, 높이, 부모윈도우 핸들, window ID)
  
  capDriverConnect(hVFW,0);  //캡쳐윈도우와 드라이버 연결(캡쳐윈도우 핸들, 캡쳐드라이버의 인덱스)
  capPreviewRate(hVFW,1);  //프리뷰모드에서 보여질 프레임 속도(rate)설정 
  capPreview(hVFW,TRUE);   //프리뷰모드 사용여부
  capGetVideoFormat(hVFW, &Bm, sizeof(Bm)); //영상복사를 위해 사용, 포맷의 크기를 바이트로 전환
  //(캡쳐윈도우 핸들, bitmapinfo 구조체 포인터, 구조체 크기)
  
  hBit = CreateCompatibleBitmap(hdc, Bm.bmiHeader.biWidth, Bm.bmiHeader.biHeight);
  //DC에 호환하는 비트맵을 생성하여 반환(dc의 핸들, 비트맵의가로 사이즈, 비트맵의 세로 사이즈)
  
  SetDlgItemText(hDlg, ID_Size,"1.0");
  
  // 비디오 프레임이 캡쳐되었을 경우 처리하기 위한 함수를 설정해주는 매크로 함수
  if(capSetCallbackOnFrame(hVFW, FramInfo)==FALSE)
    //(캡쳐 윈도우 핸들, 콜백함수에 의해 호출되는 함수 포인터)
  {
    return FALSE;
  }
  ReleaseDC(hDlg, hdc);
  return 0;
}


BOOL OnDlgCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
  
  switch(LOWORD(wParam))
  {
  case IDCANCEL:
    EndDialog(hDlg,IDCANCEL);
    break;
  case ID_END:
    EndDialog(hDlg,IDCANCEL);
    break;
  case ID_OK:
    GetDlgItemText(hDlg,ID_Size,str,10); // 에디트박스의 값을 문자로 받아온다
    fnum = atof(str);    
    list(hDlg);
    SetRect(&rt,380,50,720,300);
    InvalidateRect(hDlg,&rt,TRUE);
    break;
  case ID_PSS:
    if(a==0)
    {
      MessageBox(hDlg, TEXT("에러라고 "), TEXT("사진 없다"), MB_OK);
      return 0;
    }
    
    idps = 1;
    
    break;
  }
  return TRUE;
}

void list(HWND hDlg)
{
  if(IsDlgButtonChecked(hDlg,ID_main)==BST_CHECKED)
  {
    a=1;    
  }  
  if(IsDlgButtonChecked(hDlg,ID_GRAY)==BST_CHECKED)
  {
    a=2;    
  }  
  if(IsDlgButtonChecked(hDlg,ID_BIRNARY)==BST_CHECKED)
  {
    a=3;    
  }  
  if(IsDlgButtonChecked(hDlg,ID_HIS)==BST_CHECKED)
  {
    a=4;  
    SetDlgItemText(hDlg, ID_Size,"1.0");
    fnum = 1.0;
  }
  if(IsDlgButtonChecked(hDlg,ID_R)==BST_CHECKED)
  {
    a=5;
    SetDlgItemText(hDlg, ID_Size,"1.0");
    fnum = 1.0;
  }  
  if(IsDlgButtonChecked(hDlg,ID_G)==BST_CHECKED)
  {
    a=6;
    SetDlgItemText(hDlg, ID_Size,"1.0");
    fnum = 1.0;
  }  
  if(IsDlgButtonChecked(hDlg,ID_B)==BST_CHECKED)
  {
    a=7;  
    SetDlgItemText(hDlg, ID_Size,"1.0");
    fnum = 1.0;
  }
  if(IsDlgButtonChecked(hDlg,ID_RABEL)==BST_CHECKED)
  {
    a=8;  
    SetDlgItemText(hDlg, ID_Size,"1.0");
    fnum = 1.0;
  }  
  
  if(IsDlgButtonChecked(hDlg,ID_Rev)==BST_CHECKED)
  {
    iSum = 1;    
  }
  else
  {
    iSum = 0;  
  }
}


BOOL BoolPaint(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
  PAINTSTRUCT ps;
  hdc = BeginPaint(hDlg,&ps);
  EndPaint(hDlg,&ps);
  
  return TRUE;
}


BOOL CALLBACK FramInfo(HWND hVFW, LPVIDEOHDR VideoHdr)
{
  
  //HDC hdc;
  HDC hMemDC;    //메모리DC
  HBITMAP OldBitmap;
  LONG NOT_width;
  LONG NOT_height;
  int checking=1;
  int firstaddr;
  capPreviewRate(hVFW, 0);   //프리뷰모드에서 보여질 프레임 속도를 0으로 설정함
  LONG chwidth,chheight;
  
  chwidth = Bm.bmiHeader.biWidth *ZOOMSIZE;
  chheight = Bm.bmiHeader.biHeight *ZOOMSIZE;
  
  hdc=GetDC(Hwndmain);
  hMemDC = CreateCompatibleDC(hdc);
  OldBitmap = (HBITMAP)SelectObject(hMemDC,hBit);
  
  
  switch(a)
  {
  case 1:
    binfo = ChangeBitmapInfo(chwidth,chheight,&Bm,24);
    imageData = ReSizeImage(binfo,&Bm,VideoHdr->lpData,24);  
    checking = 3;
    break;
  case 2:
    binfo = ChangeBitmapInfo(chwidth,chheight,&Bm,8);
    imageData = ReSizeImage(binfo,&Bm,VideoHdr->lpData,8);  
    checking = 1;
    break;
  case 3:    
    binfo = ChangeBitmapInfo(chwidth,chheight,&Bm,8);
    imageData = HisBir(binfo,&Bm,VideoHdr->lpData,a,fnum);//이진화,히스토그램
    checking = 1;
    break;
  case 4:    
    binfo = ChangeBitmapInfo(chwidth,chheight,&Bm,8);
    imageData = HisBir(binfo,&Bm,VideoHdr->lpData,a,fnum);//이진화,히스토그램
    break;
  case 5:    
    binfo = ChangeBitmapInfo(chwidth,chheight,&Bm,24);
    imageData = YCrCbData(binfo,&Bm,VideoHdr->lpData,a,fnum);
    break;
  case 6:    
    binfo = ChangeBitmapInfo(chwidth,chheight,&Bm,24);
    imageData = YCrCbData(binfo,&Bm,VideoHdr->lpData,a,fnum);
    break;
  case 7:    
    binfo = ChangeBitmapInfo(chwidth,chheight,&Bm,24);
    imageData = YCrCbData(binfo,&Bm,VideoHdr->lpData,a,fnum);
    break;
  case 8// 라벨링 적색 찾기 
    binfo = ChangeBitmapInfo(chwidth,chheight,&Bm,24);
    imageData = YCrCbData(binfo,&Bm,VideoHdr->lpData,5,fnum);
    //시작주소 
    firstaddr=Labeling(imageData,binfo,255);
    //찍기 
    imageData = Laimagedata(binfo,imageData,firstaddr);
    
  }
  
  
  if((iSum == 1&& (a!=4))
  {
    RevData = (BYTE *)malloc(Bm.bmiHeader.biSizeImage);  
    width4 = binfo->bmiHeader.biWidth*checking;
    width4 = WIDTH4(width4);
    
    NOT_height = binfo->bmiHeader.biHeight;
    NOT_width = binfo->bmiHeader.biWidth;
    for(height = 0;height < NOT_height;height++)
    {
      for(width = 0;width < NOT_width ;width++)
      {
        RevData[(height*(width4))+width*checking+0= imageData[((NOT_height-height)*(width4))+(NOT_width-width)*checking+0];  
        RevData[(height*(width4))+width*checking+1= imageData[((NOT_height-height)*(width4))+(NOT_width-width)*checking+1];  
        RevData[(height*(width4))+width*checking+2= imageData[((NOT_height-height)*(width4))+(NOT_width-width)*checking+2];  
      }
    }
  }
  height = Bm.bmiHeader.biHeight;  //캡쳐영상의 세로
  width = Bm.bmiHeader.biWidth;  //캡쳐영상의 가로  
  
  
  SetDIBitsToDevice(hdc,50,50,width,height,NULL,NULL,NULL,height,VideoHdr->lpData,&Bm,DIB_RGB_COLORS);
  if(a != 0)
  {
    if(a == 4)
    {
      SetDIBitsToDevice(hdc,width+110,50,256,height,NULL,NULL,NULL,height,imageData,binfo,DIB_RGB_COLORS);
    }
    else
    {  
      if(iSum == 1)
      {
        SetDIBitsToDevice(hdc,width+73,50,width,height,NULL,NULL,NULL,height,RevData,binfo,DIB_RGB_COLORS);
      }
      else
      {
        SetDIBitsToDevice(hdc,width+73,50,width,height,NULL,NULL,NULL,height,imageData,binfo,DIB_RGB_COLORS);
      }
    }
    if(a == 8)
    {
      SetDIBitsToDevice(hdc,width+73,50,width,height,NULL,NULL,NULL,height,imageData,binfo,DIB_RGB_COLORS);
    }
  }
  if(iSum == 1)
  {
    CapTure(binfo,RevData);
  }
  else
  {
    CapTure(binfo,imageData);
  }
  
  SelectObject(hMemDC, OldBitmap);
  DeleteDC(hMemDC);
  ReleaseDC(Hwndmain, hdc); 
  capPreviewRate(hVFW,1); //다음 프레임에는 다시 영상처리를 시작 하게 된다.
  if(RevData!=NULL)
  {
    free(RevData);
    RevData =NULL;
  }
  return 0;
  
    }
    
    void CapTure(BITMAPINFO *binfo,const BYTE* imageData)
    {
      BITMAPFILEHEADER *bmfh;
      FILE *file;
      if((idps == 1)&&(a != 0))
      {
        bmfh=(BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));
        bmfh->bfType = 0x4D42;
        bmfh->bfReserved1 = 0;
        bmfh->bfReserved2 = 0;
        bmfh->bfSize = binfo->bmiHeader.biSizeImage+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
        if((a >= 2)&&(a <= 4))
        {
          bmfh->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
        }
        else
        {
          bmfh->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
        }
        
        file = fopen("test.bmp","wb");
        
        fwrite(bmfh,sizeof(BITMAPFILEHEADER),1,file);
        if((a >= 2)&&(a <= 4))
        {
          fwrite(binfo,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256,1,file);
        }
        else
        {  
          fwrite(binfo,sizeof(BITMAPINFOHEADER),1,file);
        }
        fwrite(imageData,sizeof(BYTE),binfo->bmiHeader.biSizeImage,file);
        
        if(bmfh !=NULL)
        {
          free(bmfh);
          bmfh =NULL;
        }
        fclose(file);
        idps = 0;
      }
    }