반응형
|
Bitmap 파일 읽어서 SetDIBitsToDevice, StretchDIBits 이용해 표현하기 |
|
개발환경 : Visual Studio 2010, windows 7 32 bit |
이 예제는 비트맵 파일을 읽어와서 화면에 표현하는 내용이다.
파일을 읽어온후 비트맵 file 구조체인 BITMAPFILEHEADER 를
분리해내고 DIB 에 해당하는 내용을 읽어들인다.
화면에 표현해주는 함수로 두가지를 사용하였는데 그 내용은
다음과 같다.
SetDIBitsToDevice : 비트맵 전체 또는 일부를 원본 크기 그대로 출력
StretchDIBits : 비트맵을 원하는 크기로 확대 축소 하여 출력
내용을 보면 StretchDIBits 가 더 많이 활용할 것 같다. 화면에 맞게
출력해주는 경우가 많을 것이기 때문이다.
CFile file;
BITMAPFILEHEADER bmfh;
DWORD dwFileSize, dwDibSize;
BYTE* pDib = new BYTE[dwDibSize];
// 테스트 bmp 읽어오기
file.Open(_T("test.bmp"), CFile::modeRead | CFile::shareDenyWrite, NULL);
dwFileSize = (DWORD)file.GetLength();
// 전체사이즈에서 BITMAPFILEHEADER 을 빼면 DIB 사이즈가 된다
dwDibSize = dwFileSize - sizeof(BITMAPFILEHEADER);
file.Read(&bmfh, sizeof(BITMAPFILEHEADER));// fileheader 구조체 읽기
file.Read(pDib, dwDibSize);// DIB 읽기
file.Close();
BITMAPINFOHEADER* pBmh = (BITMAPINFOHEADER*)pDib;
int nWidth = pBmh->biWidth;
int nHeight = pBmh->biHeight;
int nBit = pBmh->biBitCount;
BYTE* lpBits = NULL;
// 실제 데이타 위치
if (nBit > 8)
{
lpBits = (BYTE*)pDib + sizeof(BITMAPINFOHEADER);
}
else
{
lpBits = (BYTE*)pDib + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1<<nBit);
}
// 데이타 화면에 표현
CClinetDC dc(this);
// StretchDIBits 이용
::StretchDIBits(dc.m_hDC, // handle to device context
nWidth + 10, // x-coordinate of upper-left corner of dest. rectangle
0, // y-coordinate of upper-left corner of dest. rectangle
nWidth, // width of destination rectangle
nHeight, // height of destination rectangle
0, // x-coordinate of upper-left corner of source rectangle
0, // y-coordinate of upper-left corner of source rectangle
nWidth, // width of source rectangle
nHeight, // height of source rectangle
lpBits, // address of bitmap bits
(LPBITMAPINFO)pDib,//LPBITMAPINFO address of bitmap data
DIB_RGB_COLORS, // usage flags
SRCCOPY);// raster operation code
// SetDIBitsToDevice 이용
::SetDIBitsToDevice(dc.m_hDC,// handle to device context
0,
0,
nWidth,
nHeight,
0,// x-coordinate of lower-left corner of source rect.
0,// y-coordinate of lower-left corner of source rect.
0,// first scan line in array
nHeight,// number of scan lines
lpBits,// address of array with DIB bits
(LPBITMAPINFO)pDib,// address of structure with bitmap info.
DIB_RGB_COLORS);
반응형
'기타 언어 > C# & MFC' 카테고리의 다른 글
| OpenCV 에서 IplImage 구조체 데이터 초기화 하기 (0) | 2013.04.29 |
|---|---|
| Visual C++ 2010 fatal error LNK1123: failure during conversion to COFF 에러발생시 (8) | 2013.04.26 |
| OpenCV2.4 에서 raw 파일 로딩하기 (0) | 2013.04.18 |
| MFC 콘솔(Cmd) 에 로그 출력하기 (0) | 2013.04.13 |
| MFC VC2010 링크에러 fatal error LNK1104 (0) | 2013.04.05 |
| CEdit 박스에 Enter 키를 눌렀을때 줄바꿈 적용 (0) | 2011.03.14 |
| MFC VC++ 탭 순서 변경하기 (2) | 2011.03.11 |
| 컬러비트 배경색 16 쓰기 (1) | 2010.08.31 |

