Chapter 14. 비트맵과 Bitblt 함수
1. 비트맵 기초
* Windows Program에서 그림 정보를 저장하기 위한 두 가지 방법
▶ 비 트 맵 : 이미지의 픽셀들에 대응하는 비트들의 2차우너 직사각형 배열
비트맵을 구성하는 각 픽셀의 값은 이 격자 단위 내에서 이미지의 평균 색상을 나타낸다.
디지털화된 사진이나 비디오 캡쳐와 같은 실세계에서 시작된 매우 복잡한 이미지에 자주 사용.
▶ 메타파일 : 그림의 디지털 표현이 아닌, 그림에 대한 기술(description)이다.
메타파일은 건축 도면과 같이 사람 혹은 기계가 만들어낸 이미지에 더 적당.
(메타파일의 자세한 내용은 18장을 공부하면서 다시 언급하기로 하자.)
* 비트맵과 메타 파일의 차이
☞ 래스터 그래픽(raster graphic)과 벡터 그래픽(vector graphic)의 차이에 해당한다.
래스터 그래픽 : 출력 장치를 불연속적인 픽셀로 취급
벡터 그래픽 : 출력 장치를 선과 채워진 객체를 그릴 수 있는 데카르트 좌표계로 취급
[오늘날 대부분의 그래픽 출력 장치는 래스터 장치다.]
* 비트맵의 두가지 결점
1. 비트맵은 장치 의존성과 관련된 문제에 영향을 받기 쉽다. 가장 분명한 장치 의존성은 색상이다.
2. 비트맵은 많은 양의 저장 공간을 필요로 한다.
* 비트맵의 한가지 장점
속도! 메타파일을 렌더릴 하는 것보다 비트맵을 비디오 디스플레이에 복사하는 것이 훨씬 빠르다.
2. 비트맵 치수
비트맵은 직사각형이며 공간 치수를 갖는다.
[ 공간 치수(SPATIAL DIMENSION)란? 이미지의 폭과 높이(픽셀 단위)를 뜻한다. ]
비트맵의 치수를 간단히 표기할 때는 관습적으로 폭을 앞에 놓는다. 예를 들어 폭이 9픽셀이고 높이가 6픽셀이면 9x6 이라고 나타낼 수 있다.
색상과 비트맵
비트맵은 공간 치수 뿐만 아니라 색상 치수도 갖는다. 색상치수는 각 픽셀에 필요한 비트 수를 뜻하며, 때로 비트맵의 색상 깊이(color depth) 혹은 비트 카운트(bit-count) 혹은 픽셀당 비트(bits per pixel, bpp) 수라고 한다.
한 비트맵 내에서 각 픽셀당 색상 비트 수는 동일!
픽셀당 1비트인 비트맵 = 2레벨(level) or 2색(bicolor) or 흑백(monochrome) 비트맵
흑백 비트맵에서 각 픽셀은 0 또는 1이다.
추가적인 색상을 표현하려면 픽셀당 더 많은 비트가 필요하다. 가능한 색상 수는 2에 비트 카운트 만큼의 제곱 이다.
즉, 2비트면 4색상, 4비트면 16색상, 8비트면 256색상, 16비트면 65536색상이 된다.
GDI의 비트맵 지원
윈도우즈 GDI(Graphic Device Interface)는 버전 1.0부터 비트맵을 지원했다. 하지만 윈도우즈 3.0 이전에 윈도우즈가 지원한 유일한 비트맵은 GDI 객체이다.
윈도우즈 3.0부터 장치 독립적인 비트맵(device-independent bitmap, DIB)이라는 새로운 비트맵 포맷이 정의되었다.
DIB는 픽셀 비트틀이 RGB 색상에 어떻게 대응하는지 알려주는 자신의 색상 테이블을 포함한다.
3. 비트 블록 전송
우선 비디오 디스플레이의 한 영역에서 다른 영역으로 이미지를 복사함으로써, 비트맵 세계로의 여행을 시작해 보자!
이것은 강력한 함수인 BitBlt( )이 하는 작업이다.
Bitblt( '비트 블릿'이라고 읽는다.)은 bit-block transfer(비트 블록 전송)를 뜻한다.
BitBlt( )은 픽셀 이동기(pixel mover), 혹은 래스터 블래스터(raster blaster, bitblt 연산을 위한 특별한 하드웨어)다.
실제로 BitBlt( )은 픽셀들에 대해 비트별 연산을 수행하며 몇가지 흥미로운 효과를 만들어 낼 수 있다.
간단한 BitBlt 프로그램을 첨부하였다. 이 프로그램은 시스템 메뉴 아이콘을 클라이언트 영역에 복사한다.
[ 첨부 - BITBLT ]
* BITBLT 프로그램에서...
목적지 디바이스 컨텍스트 = 윈도우의 클라이언트 영역
☞ 이 디바이스 컨텍스트 핸들을 얻을 때 → BeginPaint( )를 사용
소스 디바이스 컨텍스트 = 애플리케이션의 전체 윈도우
☞ 이 디바이스 컨택스트 핸들을 얻을 때 → GetWindowDC( ) 를 사용
이 두 디바이스 컨텍스트는 동일한 물리적 장치를 참조하지만 좌표 원점은 서로 다르다!
BitBlt ( hdcDst, // hdcDst와 hdcSrc는 같은 디바이스 컨텍스트가 될 수 있다.
xDst, yDst, // 이미지가 복사될 좌상단 모서리의 좌표 지점
cx, cy, // 이미지의 폭과 높이
hdcSrc,
xSrc, ySrc, // 소스 이미지의 좌상단 모서리의 좌표 지점
dwROP // 래스터 연산(raster operation)
);
BitBlt( )의 가장 중요한 제약
: 두 개의 디바이스 컨텍스트가 '호환(compatible)' 되어야 한다는 것!
비트맵 늘이기
만약 이미지를 복사하면서 크기를 늘이거나 줄이고 싶다면 StretchBlt( )을 사용하면 된다.
StretchBlt (hdcDst, xDst, yDst, cxDst, cyDst,
hdcSrc, xSrc, ySrc, cxSrc, cySrc, dwROP );
[첨부 STRETCH -- 비트맵 늘이기]
댓글 없음:
댓글 쓰기