Clipboard에 데이터를 복사하려하는데 비트맵의 모든 데이터를 넣으면 에러가 발생합니다.
어떤 데이터를 복사해 주어야하는지 알아보겠습니다.
비트맵 파일의 구조를 먼저 알아보겠습니다.
비트맵은 File Header, Info Header, Pixel Data 로 이루어져있습니다.
각 14 Byte, 40 Byte, 3*Data Byte가 할당됩니다
여기서 Data는 BGR데이터로 상하반전되어 들어가기 떄문에 주의가 필요합니다.
이는 Intel CPU에서 Reverse Word 방식을 사용하기 떄문에
Byte단위로 역순으로 저장하면 word나 dword단위로 읽으면 정방향으로 입력되기 떄문입니다.
// ARGB byte a = read(1);
byte r = read(1);
byte g = read(1);
byte b = read(1);
dword color = (a << 24) | (r << 16) | (g<<8) | (b);
// BGRA dword color = read(4);
비트맵 데이터를 Clipboard에 저장할때는 File Header 정보(14 Byte)를 제외하고 데이터를 복사해주어야 합니다.
제가 작성한 코드는 아래와 같습니다.
CRect rect;
GetClientRect(&rect);
BITMAPINFOHEADER info;
memset(&info, 0, sizeof(BITMAPINFOHEADER));
BYTE* pBuff = NULL;
CreateDIBitmap(rect.Width(), rect.Height(), info, &pBuff);
HANDLE handle = (HANDLE)::GlobalAlloc(GHND, sizeof(info) + info.biSizeImage);
if (handle != NULL)
{
BYTE* pData = (BYTE*)::GlobalLock((HGLOBAL)handle);
memcpy(pData, &info, sizeof(info));
memcpy(pData + sizeof(info), pBuff, info.biSizeImage);
::GlobalUnlock((HGLOBAL)handle);
if(OpenClipboard())
{
EmptyClipboard();
SetClipboardData(CF_DIB, handle);
CloseClipboard();
}
::GlobalFree(handle);
}
delete[] pBuff;
OpenGL의 이미지를 Clipboard에 복사하기 위하여 CreateDIBitmap를 함수를 사용하여 Pixel Data를 가져왔습니다.
데이터를 별도로 읽는 경우 Pixel 형식에 주의가 필요합니다.
참고한 사이트 입니다.
BMP 파일 형식에 대한 궁금증.. - GpgStudy 포럼
2D, 3D, 다각형, 픽셀 등 게임의 그래픽 프로그래밍에 관한 포럼입니다. 운영자: 류광 비회원 전체글 글쓴이: 비회원 » 2008-10-19 02:25 이번에 학교과제로 bmp->jpeg컨버팅 하면서 BMP파일구조에 대해서
gpgstudy.com
'Program Analysis' 카테고리의 다른 글
BandiCam Recording 기능 분석 (0) | 2022.07.29 |
---|