더북(TheBook)

이로써 ImageTool 프로그램에 반전 기능 추가가 완료되었다. 실제로 프로그램을 실행하여 반전 기능을 테스트해보도록 하자. ImageTool 프로그램을 실행하여 [파일] > [열기...] 메뉴 항목을 선택하고 lenna.bmp 파일을 열어보자. 그리고 다시 메뉴에서 [이미지] > [반전]을 선택하여 반전 기능이 정상적으로 동작하는지 확인해보자. 그림 6-7은 lenna.bmp 파일에 대하여 반전 기능을 수행한 결과 화면을 보여준다. 반전된 결과 영상이 새 창으로 나타나고, 프로그램 아래 출력창에는 반전 기능이 실행되었음이 표시되었다.

그림 6-7 ImageTool 프로그램에서 영상의 반전 실행 결과
Note | 반전 메뉴 항목에 대한 UpdateCommandUI 이벤트 처리

현재 구현한 반전 기능은 그레이스케일 영상에서만 정상적으로 동작한다. 트루컬러 비트맵 영상에 대해 반전 메뉴를 선택하면 프로그램이 오작동하거나 비정상 종료할 수 있다. 그러므로 그레이스케일 비트맵이 아닌 경우에는 반전 메뉴를 아예 실행할 수 없도록 하는 것이 안전하다. 이를 위해 [반전] 메뉴에서 UPDATE_COMMAND_UI 메시지 형식에 대한 이벤트 처리기 함수 OnUpdateImageInverse를 추가하고, 아래와 같이 코드를 입력하면 그레이스케일 영상에서만 [반전] 메뉴를 선택할 수 있게 된다.

void CImageToolDoc::OnUpdateImageInverse(CCmdUI *pCmdUI)
{
    pCmdUI->Enable(m_Dib.GetBitCount() == 8);
}

참고로 이 책에서 제공하는 소스 코드에서는 모두 UPDATE_COMMAND_UI 메시지 형식에 대한 이벤트 처리기 함수를 추가하였다. 다만 이에 대해서는 책에서 따로 설명하지 않았으니 참고하기 바란다.

Note | 결과 영상을 새 창으로 띄우지 않기

이 책에서는 영상 처리 이론이 적용된 결과 영상을 모두 새 창으로 표시하도록 코드를 작성하였다. 새 창으로 결과를 보여주면 원본 영상과 결과 영상을 서로 비교하기 쉽기 때문이다. 그러나 만약 결과 영상을 새 창으로 보여주는 대신 원본 영상을 대체하도록 프로그램을 구성하고 싶으면 다음과 같은 형태로 코드를 작성하면 된다.

void CImageToolDoc::OnImageInverse()
{
    CONVERT_DIB_TO_BYTEIMAGE(m_Dib, img)
    IppInverse(img);
    IppImageToDib(img, m_Dib);

    AfxPrintInfo(_T("[반전] 영상 이름: %s"), GetTitle());
    UpdateAllViews(NULL);
}

위 함수에서 결과 영상인 img를 다시 CImageToolDoc 클래스의 멤버 변수인 m_Dib로 변환하면 결과 영상이 원본 영상을 대체하게 된다. 그리고 함수 맨 마지막에 AfxNewBitmap 함수 대신 UpdateAllViews 함수를 호출하여 뷰 클래스가 화면을 다시 그리도록 설정해야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.