MFC BITMAP 구조체
프로그래밍 2011. 6. 17. 14:48 |비트맵 데이터 포인터와, 비트맵의 가로크기, 세로 크기, 픽셀컬러정보 이렇게 4가지만
있으면 복사나 변형등의 작업을 할수 있습니다. 일단 기본적으로 자르거나 하는 작업은
단순한 알고리즘이면 됩니다. (알고리즘이라고 말할것 까지도 없습니다... )
자그럼 먼저 분석에 들어갑니다 -_-;
typedef struct tagBITMAP // bm
{
LONG bmType; // 비트맵 타입
LONG bmWidth; // 비트맵 가로크기
LONG bmHeight; // 비트맵 세로 크기
LONG bmWidthBytes; // 비트맵 가로 바이트 수 (Scan Line)
WORD bmPlanes; // 컬러패널의 수
WORD bmBitsPixel; // 픽셀 비트 수
LPVOID bmBits; // 비트맵 데이터 포인터 (형에상관없는 void 포인터)
} BITMAP;
이게 BITMAP 의 구조 입니다..
자그럼 다필요 없고 어찌보면 Low 하게 복사를 하는 함수를 하나 만들어 보죠...
void BitMapCopy( BITMAP *nDest, BITMAP *nSrc, int nStartX, int nStartY, int nWidth, int nHeight )
{
int i, j, p;
unsigned char *TDestP = ( unsigned char* )nDest->bmBits;
unsigned char *TSrcP = nSrc->bmBits
int TPixelBitC = ( nSrc->bmBitsPixel / 8 );
if( TDestP == NULL ) // 비트맵 데이터 영역이 할당이 안되어 있다면 할당해 준다.
{
nDest->bmBits = new unsigned char[ ( nWidth * nHeight ) * ( TPixelBitC / 8 ) ];
nDest->bmWidth = nWidth;
nDest->bmHeight = nHeight;
nDest->bmBitsPixel = nSrc->bmBitsPixel;
nDest->bmType = nSrc->bmType;
TDestP = ( unsigned char* )nDest->bmBits;
}
// 잘라서 저장 한다.
for( i = 0 ; i < nHeight ; i++ ) // 복사할 세로 크기
{
for( j = 0 ; j < nWidth ; j++ ) // 복사할 가로 크기
{
// 읽어올 위치 저장할 위치를 구한다. (비트맵은 선형이다.)
int TLoadPos = ( ( ( nStartY + i ) * nSrc->bmWidth ) + ( nStartX + j ) ) * TPixelBitC;
int TSavePos = ( ( i * nWidth ) + j ) * TPixelBitC;
// 한 픽셀씩 바이트 단위로 복사 한다.
for( p = 0 ; p < TPixelBitC ; p++ )
{
TDestP[ TSavePos+p ] = TSrcP[ TLoadPos+p ];
}
}
}
}
편의상 메모리할당은 new를 사용했습니다. Only Ansi C 를 사용하신다면 malloc 나
기타 다른 할당을 사용해 주시면 되고요.. 제거할때는 new는 delete 로 malloc는
free 를사용해 주시면됩니다. 사용법 은..
BitMapCopy( 대상 비트맵, 원본 비트맵, 가로시작위치, 세로시작위치, 가로크기,세로크기);
여기서 가로 시작 위치는 자를 시작 위치를 말하는겁니다 (세로도 마찬가지) 크기만큼
잘라주게 되어있 습니다. 메모리 할당을 미리 해준 상황이라면 특별한 조치는 안해도
상관없습니다만, 이미지 크기나 비트맵 정보는 따로 기입해 주셔야하고, 메모리 할당이
안되어있다던가 또는 NULL 로 기입되어있다면 위으 소스에서 처럼 직접 할당하고
정보 넣어 줍니다. 스켄라인 크기도 넣어야하는데 (귀찮아서 -_-;;) 넣진 않았습니다;;
조금 까다로운 부분이 픽셀 크기에 따라 처리해주는게 다른데.. 제가 짠 소스에서는
어떤 필셀이든 다 복사할수있긴 합니다만; (직접돌려보지않아서 문제가있을수도;)
잘될껍니다. 그럼 도움이 되셨길....
'프로그래밍' 카테고리의 다른 글
JNI string type 다루는 법 (0) | 2011.07.12 |
---|---|
Local Repository 에서 SVN 사용하기 (0) | 2011.07.09 |
안드로이드 시스템 rw로 마운트하기 (0) | 2011.05.03 |
Linux or UINX dlopen 사용예제 (0) | 2011.03.15 |
C++ 구조체 포인터의 값을 C# 구조체 배열로 가져오기 (0) | 2011.03.14 |