기본 이미지 클래스 구조 만들기
class Image
{
public:
enum class IMAGE_LOAD_TYPE
{
Resource, // 프로젝트 자체 포함 이미지
File, // 외부에서 업로드할 이미지
Empty, // 자체 생산할 이미지
End
};
typedef struct tagImageInfo
{
DWORD resID; // 리소스 고유 ID
HDC hMemDC; // 그리기 주관 객체 핸들
HBITMAP hBitmap; // 이미지 정보
HBITMAP hOldBIt; // 기존 이미지 정보
int width;
int height;
BYTE loadType; // 로드 타입
tagImageInfo()
{
resID = 0;
hMemDC = nullptr;
hBitmap = nullptr;
hOldBIt = nullptr;
width = 0;
height = 0;
loadType = (BYTE)IMAGE_LOAD_TYPE::Empty;
}
} IMAGE_INFO, * LPIMAGE_INFO;
private:
LPIMAGE_INFO imageInfo;
public:
// 빈 비트맵 이미지를 만드는 함수
HRESULT Init(int width, int height);
// 파일로부터 이미지를 로드하는 함수
HRESULT Init(const wchar_t* filePath, int width, int height);
// 화면 출력 함수
void Render(HDC hdc, int destX = 0, int destY = 0);
void Render(HDC hdc, int destX, int destY, int frameIndex);
// 메모리 해제
void Release();
};
이미지 생성
HRESULT Image::Init(const wchar_t* filePath, int width, int height)
{
HDC hdc = GetDC(g_hWnd);
imageInfo = new IMAGE_INFO();
imageInfo->resID = 0;
imageInfo->hMemDC = CreateCompatibleDC(hdc);
imageInfo->hBitmap = (HBITMAP)LoadImage(g_hInstance, filePath, IMAGE_BITMAP, width, height, LR_LOADFROMFILE);
imageInfo->hOldBIt = (HBITMAP)SelectObject(imageInfo->hMemDC, imageInfo->hBitmap);
imageInfo->width = width;
imageInfo->height = height;
imageInfo->loadType = (BYTE)IMAGE_LOAD_TYPE::File;
ReleaseDC(g_hWnd, hdc);
if (imageInfo->hBitmap == nullptr)
{
Release();
return E_FAIL;
}
return S_OK;
}
GetDC(HWND)
:
- 특정 윈도우의 디바이스 컨텍스트(Device Context, DC)를 가져오는 역할
CreateCompatibleDC(HDC)
:
- 주어진 디바이스 컨텍스트(DC)와 호환되는 메모리 디바이스 컨텍스트(Memory DC)를 생성
- 주로 오프스크린(off-screen) 렌더링을 수행하거나 임시 그래픽 작업을 처리하는 데 유용
이미지 출력
void Image::Render(HDC hdc, int destX, int destY,
int frameIndex, int row, int col)
{
BitBlt(
hdc,
// 복사 목적지 DC
destX, destY,
// 복사 목적지 위치
imageInfo->width/col, imageInfo->height/row,
// 원본에서 복사될 크기
imageInfo->hMemDC,
// 원본 DC
imageInfo->width/col * (frameIndex % col),
imageInfo->height/row * (frameIndex / col),
// 원본 복사 시작 위치
SRCCOPY
// 복사 옵션
);
}
BitBlt
- 디바이스 컨텍스트(DC) 간에 비트맵 데이터(픽셀 배열) 를 복사하거나 이동하는 데 사용
- 주로 화면(디스플레이 DC) 또는 메모리 DC 간에 데이터를 전송하거나 그래픽 작업을 수행하기 위해 활용