🤖 Intelligent Embedded Systems/2️⃣ Image Processing (Programming)

[C++] MFC 코드 정리 (MFC_Ver 2.0)

koko1177 2025. 4. 11. 23:30
반응형

0.  전역 변수 - Doc.h

	// 입력 영상 배열
	unsigned char** m_inImage = NULL;
	// 출력 영상 배열
	unsigned char** m_outImage = NULL;

	// 입력 이미지 크기 (행/열)
	int m_inH = 0;
	int m_inW = 0;
	// 출력 이미지 크기 (행/열)
	int m_outH = 0;
	int m_outW = 0;

 


 

1.  이미지 파일 열기 (입력 이미지) - Doc.cpp

// 이미지 파일 열기 (입력)
BOOL CGrayScaleAlpha1Doc::OnOpenDocument(LPCTSTR lpszPathName)
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;

	// TODO:  여기에 특수화된 작성 코드를 추가합니다.
	CFile File;

	// 중요!! 입력 영상의 크기 확인
	File.Open(lpszPathName, CFile::modeRead | CFile::typeBinary);			// = rfp.open(filename, "rb");
	// 메모리 누수 방지
	free2D(m_inImage, m_inH);	

	long fLength = File.GetLength();			// 512*512, = 262144
	m_inH = m_inW = (int)sqrt((double)fLength);

	// 입력 영상 메모리 동적 할당
	m_inImage = malloc2D(m_inH, m_inW);

	// 파일 --> 메모리 Loading
	for (int i = 0; i < m_inH; i++)
		File.Read(m_inImage[i], m_inW);

	// 파일 닫기
	File.Close();

	return TRUE;
}

 


 

2.  이미지 파일 저장 - Doc.cpp

// 이미지 파일 저장
BOOL CGrayScaleAlpha1Doc::OnSaveDocument(LPCTSTR lpszPathName)
{
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	CFile File;

	// 중요!! 입력 영상의 크기 확인
	File.Open(lpszPathName, CFile::modeCreate | CFile::modeWrite);

	// 메모리 --> 파일 Save
	for (int i = 0; i < m_outH; i++)
		File.Write(m_outImage[i], m_outW);

	// 파일 닫기
	File.Close();

	MessageBox(NULL, L"성공했음", L"저장", NULL);

	return TRUE;
	// return 	CDocument::OnSaveDocument(lpszPathName);		// 이름 입력 받기
}

 


 

3.  입/출력 이미지 메모리 해제 - Doc.cpp

// 입/출력 이미지 메모리 해제
void CGrayScaleAlpha1Doc::OnCloseDocument()
{
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	free2D(m_inImage, m_inH);
	free2D(m_outImage, m_outH);

	CDocument::OnCloseDocument();
}

 


 

4.  2차원 배열 생성 함수 (동적할당) - Doc.cpp

// 2차원 배열 생성 함수 (동적 할당)
unsigned char** CGreyScaleImageVer2BetaDoc::malloc2D(int h, int w)
{
	// C++ 일 때만 사용 가능
	// TODO: 여기에 구현 코드 추가.
	unsigned char** retMemory;			// retMemory == inImage

	// 입력영상(inImage)의 메모리 할당.										// C++일 때 new와 delete 연산자를 사용			==> 속도가 훨씬 빠름
	retMemory = new unsigned char* [h];		// C++ 자체 
	for (int i = 0; i < h; i++)
		retMemory[i] = new unsigned char[w];

	return retMemory;

	// C와 C++ 둘 다 사용 가능
	/*
	// TODO: 여기에 구현 코드 추가.
	unsigned char** retMemory;			// retMemory == inImage

	// 입력영상(inImage)의 메모리 할당
	retMemory = (unsigned char**)malloc(h * sizeof(unsigned char*));					// unsigned char 뒤에 * 잊지 말기!
	for (int i = 0; i < h; i++) 				// 가로 픽셀, 세로 픽셀 바뀔 때 범위 주의!
		retMemory[i] = (unsigned char*)malloc(w * sizeof(unsigned char));

	return retMemory;
	*/
}

 


 

5.  free 함수 (메모리 할당 해제 함수부) - Doc.cpp

// free 함수 (메모리 할당 해제 함수부)
void CGreyScaleImageVer2BetaDoc::free2D(unsigned char** memory, int h)
{
	// C++ 일 때만 사용 가능
	// TODO: 여기에 구현 코드 추가
	if (memory == NULL)
		return;

	// 메모리 해제
	for (int i = 0; i < h; i++)
		delete memory[i];		// == free(memory[i]);

	delete memory;		// == free(memory);
	memory = NULL;

	// C, C++ 둘 다 사용 가능
	/*
	// TODO: 여기에 구현 코드 추가
	if (memory == NULL)
		return;

	// 메모리 해제
	for (int i = 0; i < h; i++)
		free(memory[i]);

	free(memory);
	memory = NULL;
	*/
}

 


 

6.  이미지 화면 출력 - View.cpp

// 이미지 화면 출력
void CGrayScaleAlpha1View::OnDraw(CDC* pDC)
{
	CGrayScaleAlpha1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
	int px;

	// 원본 이미지 화면 출력
	for (int i = 0; i < pDoc->m_inH; i++) {
		for (int k = 0; k < pDoc->m_inW; k++) {
			px = pDoc->m_inImage[i][k];
			pDC->SetPixel(k + 5, i + 5, RGB(px, px, px));
		}
	}

	// 결과 이미지 화면 출력
	for (int i = 0; i < pDoc->m_outH; i++) {
		for (int k = 0; k < pDoc->m_outW; k++) {
			px = pDoc->m_outImage[i][k];
			pDC->SetPixel(pDoc->m_outH + k + 5 + 5, i + 5, RGB(px, px, px));
		}
	}
}

 

 


 

반응형