본문 바로가기
개발

GDI+ Bitmap 복사하기 C++

by 솜씨제이 2021. 1. 1.

GDI+ Bitmap을 복사본을 만들려면 아래처럼 Clone 메서드를 사용하게 됩니다.

Gdiplus::Bitmap* pBitmap = bitmap.Clone(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), bitmap.GetPixelFormat());

하지만 Clone 메소드는 깊은 복사(deep copy)가 아니라 얕은 복사(shallow copy)이기 때문에 원본을 변경하면 복사본도 변경되고 복사본을 변경하면 원본도 변경됩니다.

완전한 복사본을 만드려면 Bitmap 객체를 생성해서 원본 Bitmap을 직접 그려줍니다.

Gdiplus::Bitmap* pBitmap = new Gdiplus::Bitmap(bitmap.GetWidth(), bitmap.GetHeight(), bitmap.GetPixelFormat());
Gdiplus::Graphics* g = Gdiplus::Graphics::FromImage(pBitmap);
g->DrawImage(&bitmap, 0, 0);
delete g;

아무래도 위 코드는 Bitmap을 직접 그리기 때문에 속도가 느려서 메모리 복사를 할 수 있는 방법을 알아봤습니다.

Gdiplus::Bitmap* pBitmap = new Gdiplus::Bitmap(bitmap.GetWidth(), bitmap.GetHeight(), bitmap.GetPixelFormat());
Gdiplus::Rect rect(0, 0, bitmap.GetWidth(), bitmap.GetHeight());
Gdiplus::BitmapData bmpData;
pBitmap->LockBits(&rect, Gdiplus::ImageLockModeRead | Gdiplus::ImageLockModeWrite, pBitmap->GetPixelFormat(), &bmpData);
bitmap.LockBits(&rect, Gdiplus::ImageLockModeRead | Gdiplus::ImageLockModeUserInputBuf, pBitmap->GetPixelFormat(), &bmpData);
bitmap.UnlockBits(&bmpData);
pBitmap->UnlockBits(&bmpData);

참고로 Bitmap 바이너리 데이터를 인자로 받는 Bitmap 생성자는 해당 바이너리 데이터를 공유하기 때문에 Bitmap의 생명주기(LifeCycle) 동안 해당 바이너리 데이터를 유지해줘야 합니다.

댓글