3 1 On Open Document On Open Document

  • Slides: 16
Download presentation

[실습하기 3 -1] On. Open. Document 함수를 이용한 파일 입력 프로그램 ③ On. Open.

[실습하기 3 -1] On. Open. Document 함수를 이용한 파일 입력 프로그램 ③ On. Open. Document 함수가 다음과 같은 형태로 추가됨. 여기서 프로그램을 추 가하여 영상 데이터를 입력하게 됨 BOOL CImage. Processing. Doc: : On. Open. Document(LPCTSTR lpsz. Path. Name) { if(!CDocument: : On. Open. Document(lpsz. Path. Name)) return FALSE; // TODO: Add your specialized creation code here return TRUE; } 2

[실습하기 3 -1] On. Open. Document 함수를 이용한 파일 입력 프로그램 ⑤ On. Open.

[실습하기 3 -1] On. Open. Document 함수를 이용한 파일 입력 프로그램 ⑤ On. Open. Document로 이동하여 함수 재정의 BOOL CImage. Processing. Doc: : On. Open. Document(LPCTSTR lpsz. Path. Name) { if (!CDocument: : On. Open. Document(lpsz. Path. Name)) return FALSE; CFile; // 파일 객체 선언 File. Open(lpsz. Path. Name, CFile: : mode. Read | CFile: : type. Binary); // 파일 열기 대화상자에서 선택한 파일을 지정하고 읽기 모드 선택 // 이 책에서는 영상의 크기 256*256, 512*512, 640*480만을 사용한다. if(File. Get. Length() == 256*256){ // RAW 파일의 크기 결정 m_height = 256; m_width = 256; } else if(File. Get. Length() == 512*512){ // RAW 파일의 크기 결정 m_height = 512; m_width = 512; } else if(File. Get. Length() == 640*480){ // RAW 파일의 크기 결정 m_height = 480; m_width = 640; } else{ Afx. Message. Box(L"Not Support Image Size"); // 해당 크기가 없는 경우 return 0; } m_size = m_width * m_height; // 영상의 크기 계산 m_Input. Image = new unsigned char [m_size]; // 입력 영상의 크기에 맞는 메모리 할당 for(int i = 0 ; i<m_size ; i++) m_Input. Image[i] = 255; // 초기화 File. Read(m_Input. Image, m_size); // 입력 영상 파일 읽기 File. Close(); // 파일 닫기 } return TRUE; 3

[실습하기 3 -1] On. Open. Document 함수를 이용한 파일 입력 프로그램 ⑥ CImage. Processing.

[실습하기 3 -1] On. Open. Document 함수를 이용한 파일 입력 프로그램 ⑥ CImage. Processing. View 클래스로 이동하여 On. Draw 함수를 재정의하여 영상 데이터를 출력함. void CImage. Processing. View: : On. Draw(CDC* p. DC) { CImage. Processing. Doc* p. Doc = Get. Document(); // 도큐먼트 클래스 참조 ASSERT_VALID(p. Doc); int i, j; unsigned char R, G, B; for(i=0 ; i<p. Doc->m_height ; i++){ for(j=0 ; j<p. Doc->m_width ; j++){ R = G = B = p. Doc->m_Input. Image[i*p. Doc->m_width+j]; p. DC->Set. Pixel(j+5, i+5, RGB(R, G, B)); } } } 4

[실습하기 3 -3] On. Save. Document 함수를 이용한 파일 출력 프로그램 ③ On. Save.

[실습하기 3 -3] On. Save. Document 함수를 이용한 파일 출력 프로그램 ③ On. Save. Document 함수를 재정의함. BOOL CImage. Processing. Doc: : On. Save. Document(LPCTSTR lpsz. Path. Name) { CFile; // 파일 객체 선언 CFile. Dialog Save. Dlg(FALSE, L"raw", NULL, OFN_HIDEREADONLY); // raw 파일을 다른 이름으로 저장하기를 위한 대화상자 객체 선언 ④ if(Save. Dlg. Do. Modal() == IDOK){ // Do. Modal 멤버 함수에서 저장하기 수행 File. Open(Save. Dlg. Get. Path. Name(), CFile: : mode. Create | CFile: : mode. Write); // 파일 열기 File. Write(m_Input. Image, m_size); // 파일 쓰기 [저장] 버튼을 클릭// →파일 [다른닫기 이름으로 저장] 대화상자에서 저장할 File. Close(); 을}입력해 프로그램 저장 파일 이름 return CDocument: : On. Save. Document(lpsz. Path. Name); } 5

[실습하기 3 -4] 영상 축소 프로그램 → 다음과 같이 On. Down. Sampling 함수 작성

[실습하기 3 -4] 영상 축소 프로그램 → 다음과 같이 On. Down. Sampling 함수 작성 void CImage. Processing. Doc: : On. Down. Sampling() { int i, j; CDown. Sample. Dlg dlg; if(dlg. Do. Modal() == IDOK) // 대화상자의 활성화 여부 { m_Re_height = m_height / dlg. m_Down. Sample. Rate; // 축소 영상의 세로 길이를 계산 m_Re_width = m_width / dlg. m_Down. Sample. Rate; // 축소 영상의 가로 길이를 계산 m_Re_size = m_Re_height * m_Re_width; // 축소 영상의 크기를 계산 m_Output. Image = new unsigned char [m_Re_size]; // 축소 영상을 위한 메모리 할당 for(i=0 ; i<m_Re_height ; i++){ for(j=0 ; j<m_Re_width ; j++){ m_Output. Image[i*m_Re_width + j] = m_Input. Image[(i*dlg. m_Down. Sample. Rate*m_width)+dlg. m_Down. Sample. Rate*j]; // 축소 영상을 생성 } } 7

[실습하기 3 -4] 영상 축소 프로그램 ⑩ 다음과 같이 View 클래스의 On. Down. Sampling

[실습하기 3 -4] 영상 축소 프로그램 ⑩ 다음과 같이 View 클래스의 On. Down. Sampling 함수 작성 void CImage. Processing. View: : On. Down. Sampling() { // TODO: Add your command handler code here CImage. Processing. Doc* p. Doc = Get. Document(); // Doc 클래스 참조 ASSERT_VALID(p. Doc); p. Doc->On. Down. Sampling(); // Doc 클래스에 On. Down. Sampling 함수 호출 Invalidate(TRUE); // 화면 갱신 } 8

[실습하기 3 -4] 영상 축소 프로그램 ⑪ 처리된 결과를 화면에 표시하기 위해 On. Draw

[실습하기 3 -4] 영상 축소 프로그램 ⑪ 처리된 결과를 화면에 표시하기 위해 On. Draw 함수를 다음과 같이 재정의 void CImage. Processing. View: : On. Draw(CDC* p. DC) { CImage. Processing. Doc* p. Doc = Get. Document(); // Doc 클래스 참조 ASSERT_VALID(p. Doc); // TODO: add draw code for native data here int i, j; unsigned char R, G, B; // 입력 영상 출력 for(i = 0 ; i<p. Doc->m_height ; i++){ for(j = 0 ; j<p. Doc->m_width ; j++){ R = p. Doc->m_Input. Image[i*p. Doc->m_width+j]; G = B = R; p. DC->Set. Pixel(j+5, i+5, RGB(R, G, B)); } } // 축소된 영상 출력 for(i = 0 ; i<p. Doc->m_Re_height ; i++){ for(j = 0 ; j<p. Doc->m_Re_width ; j++){ R = p. Doc->m_Output. Image[i*p. Doc->m_Re_width+j]; G = B = R; p. DC->Set. Pixel(j+p. Doc->m_width+10, i+5, RGB(R, G, B)); } } } 9

[실습하기 3 -5] 영상 확대 프로그램 ⑤ Up. Sample. Dlg 대화상자를 Doc 클래스에서 사용하기

[실습하기 3 -5] 영상 확대 프로그램 ⑤ Up. Sample. Dlg 대화상자를 Doc 클래스에서 사용하기 위해 Image. Processing. Doc. cpp 파일의 윗부분에 Up. Sample. Dlg. h 코드를 포함시킴 #include #include "stdafx. h" "Image. Processing. Doc. h" "Down. Sample. Dlg. h" "Up. Sample. Dlg. h" → Doc 클래스에 On. Up. Sampling 함수를 추가함 10

[실습하기 3 -5] 영상 확대 프로그램 void CImage. Processing. Doc: : On. Up. Sampling()

[실습하기 3 -5] 영상 확대 프로그램 void CImage. Processing. Doc: : On. Up. Sampling() { int i, j; CUp. Sample. Dlg dlg; if(dlg. Do. Modal() == IDOK){ // Do. Modal 대화상자의 활성화 여부 m_Re_height = m_height * dlg. m_Up. Sample. Rate; // 확대 영상의 세로 길이 계산 m_Re_width = m_width * dlg. m_Up. Sample. Rate; // 확대 영상의 가로 길이 계산 m_Re_size = m_Re_height * m_Re_width; // 확대 영상의 크기 계산 m_Output. Image = new unsigned char[m_Re_size]; // 확대 영상을 위한 메모리 할당 for(i=0 ; i<m_Re_size ; i++) m_Output. Image[i] = 0; // 초기화 for(i=0 ; i<m_height ; i++){ for(j=0 ; j<m_width ; j++){ m_Output. Image[i*dlg. m_Up. Sample. Rate*m_Re_width + dlg. m_Up. Sample. Rate*j]= m_Input. Image[i*m_width + j]; } // 재배치하여 영상 확대 } } } 11

[실습하기 3 -5] 영상 확대 프로그램 ⑥ View 클래스의 On. Up. Sampling 함수를 다음과

[실습하기 3 -5] 영상 확대 프로그램 ⑥ View 클래스의 On. Up. Sampling 함수를 다음과 같이 작성 void CImage. Processing. View: : On. Up. Sampling() { // TODO: Add your command handler code here CImage. Processing. Doc* p. Doc = Get. Document(); // Doc 클래스 참조 ASSERT_VALID(p. Doc); p. Doc->On. Up. Sampling(); // Doc 클래스에 On. Up. Sampling 함수 호출 } Invalidate(TRUE); // 화면 갱신 ⑦ 결과 영상 12

[실습하기 3 -6] 양자화 프로그램 void CImage. Processing. Doc: : On. Quantization() { CQuantization.

[실습하기 3 -6] 양자화 프로그램 void CImage. Processing. Doc: : On. Quantization() { CQuantization. Dlg dlg; if(dlg. Do. Modal() == IDOK) // 양자화 비트 수를 결정하는 대화상자의 활성화 여부 { int i, j, value, LEVEL; double HIGH, *TEMP; m_Re_height = m_height; m_Re_width = m_width; m_Re_size = m_Re_height * m_Re_width; m_Output. Image = new unsigned char[m_Re_size]; // 양자화 처리된 영상을 출력하기 위한 메모리 할당 TEMP = new double [m_size]; // 입력 영상 크기(m_size)와 동일한 메모리 할당 LEVEL=256; // 입력 영상의 양자화 단계(28=256) HIGH=256. ; value = (int)pow(2, dlg. m_Quant. Bit); // 양자화 단계 결정(예 : 24=16) for(i=0 ; i<m_size ; i++){ for(j=0 ; j<value ; j++){ if(m_Input. Image[i] >=(LEVEL/value)*j && m_Input. Image[i]<(LEVEL/value)*(j+1)){ TEMP[i]=(double)(HIGH/value)*j; // 양자화 수행 } } } for(i=0 ; i<m_size ; i++){ m_Output. Image[i] = (unsigned char)TEMP[i]; // 결과 영상 생성 } } } 14

[실습하기 3 -6] 양자화 프로그램 ⑥ View 클래스에서 Doc 클래스의 On. Quantization 함수를 호출하고

[실습하기 3 -6] 양자화 프로그램 ⑥ View 클래스에서 Doc 클래스의 On. Quantization 함수를 호출하고 화면을 갱 신할 수 있도록 프로그램 작성 void CImage. Processing. View: : On. Quantization() { // TODO: Add your command handler code here CImage. Processing. Doc* p. Doc = Get. Document(); // Doc 클래스 참조 ASSERT_VALID(p. Doc); p. Doc->On. Quantization(); // Doc 클래스에 On. Quantization 함수 호출 } Invalidate(TRUE); // 화면 갱신 ⑦ 결과 영상 15

Thank you

Thank you