반응형
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));
}
}
}
반응형
'🤖 Intelligent Embedded Systems > 2️⃣ Image Processing (Programming)' 카테고리의 다른 글
2️⃣ImageProcessing 포트폴리오 (0) | 2025.04.30 |
---|---|
🔒 [Python] OpenCV - Youtube 영상 (pafy) (AI_Ver2.6) (0) | 2025.04.11 |
[C++] MFC 코드 정리 (화소점 처리 기능) (0) | 2025.04.11 |
🔒 영상 처리 참고 블로그 및 사이트 (0) | 2022.03.01 |
(C/C++/MFC) 영상처리 소프트웨어 칼라 구현 - 기하학 처리 (0) | 2022.02.14 |