Program Analysis

MFC Bitmap Clipboard Copy

누구용 2022. 8. 30. 10:26

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