Presentation is loading. Please wait.

Presentation is loading. Please wait.

4장 영상 입출력 프로그램 만들기 비트맵 파일, MDI를 이용한 입출력 프로그램 (THU)

Similar presentations


Presentation on theme: "4장 영상 입출력 프로그램 만들기 비트맵 파일, MDI를 이용한 입출력 프로그램 (THU)"— Presentation transcript:

1 4장 영상 입출력 프로그램 만들기 비트맵 파일, MDI를 이용한 입출력 프로그램 2015.01.22 (THU)
발표자: 중원대학교 의료공학과 신 진솔

2 4.1 비트맵 파일 입ㆍ출력 하기

3 영상 파일의 형식 저장방식에 따른 여러 가지 파일 형식 미리 약속된 방식의 Encoding으로 픽셀 데이터를 압축하여 저장.
BMP: 압축이 필요 없는 형식 JPG, PNG, GIF 미리 약속된 방식의 Encoding으로 픽셀 데이터를 압축하여 저장. 각각의 파일 형식을 읽거나 쓰기 위해 Encoding과 Decoding을 수행 해야 함. → 파일 형식의 라이브러리를 각각 제공

4 비트맵 파일의 구조 헤더 정보 및 픽셀 데이터

5 비트맵 파일의 구조 파일 헤더(BITMAPFILEHEADER) Wingdi.h 헤더파일- BITMAPFILEHEADER구조체.
파일 식별자, 파일 크기, 픽셀 데이터 시작 위치 bfType: 비트맵 파일임을 명시 bfOffBits: 픽셀데이터가 시작되는 주소 값. bfOffBitsms 트루컬러와 하이컬러처럼 팔레트가 필요하지 않은 영상은 54 팔레트가 필요한 영상이라면 54+팔레트가 저장된 크기가 더해진 값이 저장

6 비트맵 파일의 구조 영상정보 헤더(BITMAPINFOHEADER) Wingdi.h 헤더파일에 정의
영상 크기, 채널 수, 픽셀 데이터 형식 등

7 비트맵 파일의 구조 팔레트 정보 미리 정해진 색상의 집합. 영상의 색상 수만큼 기록됨.
영상의 픽셀은 색상 값을 가지는 것이 아닌 그 픽셀이 사용하는 팔 레트 색상의 번호를 가지게 됨. 회색조 영상의 경우 {0,0,0,0}~{255,255,255,255}의 값을 가진다.

8 비트맵 파일의 구조

9 읽은 값을 영상 데이터 클래스에 할당할 때는 행의 위치를 반전 시켜 주어야 함.
비트맵 파일 읽기&쓰기 비트맵 파일에서의 픽셀 배열 비트맵 파일의 좌표 계는 반대로 사용된다. 읽은 값을 영상 데이터 클래스에 할당할 때는 행의 위치를 반전 시켜 주어야 함.

10 비트맵 파일 읽기&쓰기 비트맵 파일 읽기 쓰기 함수 LoadImage() SaveImage() 멤버 함수로 만들어 사용
CMyImage 클래스의 멤버함수로 정의 LoadImage() 파일 열기 -> 파일 헤더 읽기 -> 영상정보 헤더 읽기 -> 픽셀 데이터 읽기 SaveImage() 파일열기 -> 파일 헤더 쓰기 -> 영상 정보 헤더 쓰기 -> (팔레트 쓰기 -> ) 픽셀 데이터 쓰기 멤버 함수로 만들어 사용 Image 변수.Loadimage(파일 이름) = 파일 명에 해당하는 이미지가 불려 들어갈 수 있도록 생성

11 비트맵 파일 읽기&쓰기 – Load Image()함수
파일열기 → 파일 헤더 읽기→ 영상 정보 헤더 읽기 → 픽셀 데이터 읽기 픽셀 데이터 형의 크기가 BYTE형인지 확인하여 동작 파일명으로부터 BMP파일 형식이 맞는지 확인 빈 파일인지 확인 읽기 모드로 파일 읽어 들임

12 비트맵 파일 읽기&쓰기 – Load Image()함수
파일열기 → 파일 헤더 읽기→ 영상 정보 헤더 읽기 → 픽셀 데이터 읽기 비트맵 파일 헤더를 읽고 담기 위한 구조체 생성 파일 헤더가 BM인지 확인

13 비트맵 파일 읽기&쓰기 – Load Image()함수
파일열기 → 파일 헤더 읽기→ 영상 정보 헤더 읽기 → 픽셀 데이터 읽기 비트맵 영상 정보 헤더를 담기 위한 구조체 생성 256레벨의 회색조 영상 또는 트루 컬러 영상만 읽을 수 있도록 설정 이전에 할당한 변수와 크기가 같은지 확인한 후 같지 않으면 새로 할당 이미지 데이터 멤버 변수가 NULL인지 확인하여 기존에 할당된 메모리 반납 각 변수를 헤더에 저장

14 비트맵 파일 읽기&쓰기 – Load Image()함수
파일열기 → 파일 헤더 읽기→ 영상 정보 헤더 읽기 → 픽셀 데이터 읽기 새로운 픽셀 데이터 배열 생성 (행당 원소수 * 높이) Offset 값을 이용하여 데이터 시작 위치로 이동 상하 반전이므로 맨 밑에서부터 메모리 값 저장 파일 닫음

15 비트맵 파일 읽기&쓰기 – Save Image()함수
파일열기 → 파일 헤더 쓰기→ 영상정보 헤더 쓰기 → (팔레트 쓰기 →) 픽셀 데이터 쓰기 픽셀 데이터가 BYTE형인지 확인하여 동작 파일명으로부터 BMP파일 형식이 맞는지 확인 빈 파일인지 확인 쓰기 모드로 파일 생성

16 비트맵 파일 읽기&쓰기 – Save Image()함수
파일열기 → 파일 헤더 쓰기→ 영상정보 헤더 쓰기 → (팔레트 쓰기 →) 픽셀 데이터 쓰기 비트맵 파일 헤더를 읽고 담기 위한 구조체 생성 (파일 형식, 사이즈크기, 빈 값 2개, offset데이터 넣을 변수 생성) 파일에 구조체 작성

17 비트맵 파일 읽기&쓰기 – Save Image()함수
파일열기 → 파일 헤더 쓰기→ 영상정보 헤더 쓰기 → (팔레트 쓰기 →) 픽셀 데이터 쓰기 비트맵 영상 정보 헤더를 담을 구조체 생성 (사이즈, 너비, 높이, 1, 픽셀당 비트 수, 압축 형식, 전체 바이트 수, 저장) ↓ 파일에 영상정보 헤더 작성 팔레트 정보 작성 (회색 조 영상일 경우만 작성)

18 비트맵 파일 읽기&쓰기 – Save Image()함수
파일열기 → 파일 헤더 쓰기→ 영상정보 헤더 쓰기 → (팔레트 쓰기 →) 픽셀 데이터 쓰기 맨 밑에서 올라가며 저장 하여 데이터 저장

19 LoadImageFromDialog()함수
파일 탐색기 대화 상자를 통하여 컴퓨터 내의 영상 파일을 탐색하고 경로 획득 획득된 경로에 대하여 LoadImage() 함수 수행 LoadImageFromFileDialog.h

20 LoadImageFromDialog()함수
BMP형식의 파일을 선택 할 수 있는 대화상자를 열고 영상 파일의 경로 획득하여 영상을 읽는다

21 4.2 MFC환경에서 화면에 영상 출력하기

22 MFC 환경에서 영상을 화면에 출력하기 단일 또는 다중 문서 응용 프로그램을 이용한 화면 출력
뷰 클래스 자체가 화면 출력을 위한 클래스 GUI가 복잡해질 수 있고 여러 영상을 동시에 출력하기 불편 별도의 윈도우 생성을 이용한 화면 출력 여러 영상을 동시에 출력하기 쉬움 별도의 윈도우 생성 코드 작성 필요. 한 번 구현 한 후 계속 활용 가능

23 MDI 응용프로그램 프로젝트 생성 다중문서 응용프로그램 구조 프로그램 이름: MDIImageViewer
프로젝트 설정 MFC응용프로그램, 다중 문서 응용 프로그램 MyImage.h헤더파일을 프로젝트에 추가 다중문서 응용프로그램 구조 뷰 클래스가

24 버튼의 ID를 MENU_VIEW_IMAGE로 수정
MDI 프로그램에서 화면 출력하기 ← 기본 편집 창 영상처리-화면출력 창을 생성 버튼의 ID를 MENU_VIEW_IMAGE로 수정

25 CMDIImageViewerDoc 클래스 & CMDIImageViewerView클래스 편집
영상을 파일로부터 읽는 작업 수행 OnMenuViewImage()함수 편집 MDIImageViewerDoc.cpp파일에 자동으로 추가 MDIImageViewerDoc.cpp에 헤더 추가

26 CMDIImageViewerDoc 클래스 & CMDIImageViewerView클래스 편집
CMDIImageViewerDoc.h에 CMyImage 클래스 멤버 변수 추가 CMDIImageViewerDoc 클래스 편집하기 LoadimageFromDialog함수를 통해 입력 영상 파일 읽기 읽어들인 m_image 멤버 변수에 할당. UpdateAllViewe()함수를 호출하여 입력 영상을 화면에 출력

27 MDI 프로그램에서 화면 출력하기 CMDIImageViewerDoc 클래스 & CMDIImageViewerView클래스 편집
실제 영상의 화면 출력을 담당하는 클래스 OnDraw()함수가 그리기를 수행 OnDraw()함수는 화면 갱신 이벤트에 의하여 자동적으로 호출 (UpdateAllViews()) : 화면이 다른 창에 의해 가려져 있을 때 다시 나타나는 경우 자동적으로 추가되어 있는 OnDraw()함수를 편집

28 CMDIImageViewerDoc 클래스 & CMDIImageViewerView클래스 편집
DrawImage() 함수 실제 영상 데이터를 출력하는 함수 OnDraw함수보다 앞선 위치에 작성 Wingdi.h에 선언되어 있는 StretchDIBits()함수 사용 비트맵 헤더 정보 (BITMAPINFO 구조체)를 만들어 픽셀 데이터, 화면 위치 정보 등과 함께 StretchDIBits()함수를 호출 BIRMAPINFO 구조체

29 CMDIImageViewerDoc 클래스 & CMDIImageViewerView클래스 편집
StretchDIBits()함수 영상의 크기를 맞추어 출력해준다 Device context (DC) 윈도우 운영체제에서 화면 출력이나 프린터 출력을 위한 장치의 그리기 속성에 대한 정보를 담은 구조체 운영체제에 의해 관리됨 프로그램 안에서 그리기작업을 수행하기 위해서는 운영체제로부터 디바이스 컨텍스트의 핸들 HDC를 받아와서 사용해야 한다, GetDC() or GerWindowDC()를 이용해 받아 올수 있다 디바이스 컨텍스트의 클래스 CDC가 주어지면 멤버변수 m_hDC를 사용할 수 있다. HDC핸들은 StretchDIBits()함수를 호출 할 때 매개변수로 넘겨주게 된다 CF) Device context (DC) 운영체제에서 화면 출력을 위한 장치의 그리기 속성에 대한 정보를 담은 구조체 운영체제에 의해 관리됨 프로그램 내에서 그리기 작업을 수행하려면 운영체제로부터 DC핸들 HDC를 받아와 사용 GetDC() or GerWindowDC() DC의 클래스 CDC를 이용하여 m_hDC 사용가능, StretchDIBits()함수의 매개변수로 넘겨 사용.

30 CMDIImageViewerDoc 클래스 & CMDIImageViewerView클래스 편집
회색조 영상의 출력 24비트 컬러가 아닌 경우 화면 출력을 위해 팔레트 정보 필요 회색조 영상은 (0,0,0) ~(255,255,255)색이 담긴 길이 256의 팔레트를 사용 팔래트를 BITMAPINFO구조체의 bmiColors변수에 대입하여 사용


Download ppt "4장 영상 입출력 프로그램 만들기 비트맵 파일, MDI를 이용한 입출력 프로그램 (THU)"

Similar presentations


Ads by Google