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) 동안 해당 바이너리 데이터를 유지해줘야 합니다.
'개발' 카테고리의 다른 글
CentOS Apache 환경에 Laravel 배포 (0) | 2024.11.15 |
---|---|
VC++ 2017에서 개발한 COM DLL 등록 문제 (0) | 2018.11.29 |
[MySQL] 서브 쿼리(하위 질의) (0) | 2018.08.22 |
[MySQL] 테이블 결합하기(JOIN) (0) | 2018.08.01 |
[MySQL] 추출 결과 합치기(UNION) (0) | 2018.08.01 |
댓글