F.R.I.D.A.Y.

Direct2D - WIC IWICFormatConverter 본문

DEV/Direct2D

Direct2D - WIC IWICFormatConverter

F.R.I.D.A.Y. 2021. 4. 29. 20:39
반응형

 비트맵의 포맷을 변경하는 IWICFormatConverter


IWICFormatConverter

 비트맵은 꽤 다양한 형식을 가지고 있습니다. 애초에 형식이라는게 비트맵 생성자가 비트맵 형식을 설명해주는 것으로 어떻게 만들던 상관은 없죠.[# 뭐 성능 좋은 형식이라면 금상첨화지만] 그러나 사용자가 요구하는 비트맵 형식이 있기도 합니다. Direct2D가 그 예입니다.

 

Direct2D - WIC를 이용해 이미지 그리기

 WIC는 Windows Imaging Component라는 이름을 가진 코덱 프레임워크이다. # 해당 내용은 Direct2D의 기본 구조를 알고 있어야 진행이 원활합니다. # 해당 내용은 다음 포스트를 기반에 두고 있습니다. WIC  

pang2h.tistory.com

 여기에서 잠깐 소개 했지만, Direct2D에서 이미지를 출력하려면 Direct2D가 이해하는 스타일로 포맷을 변경해주어야 합니다. MS docs에서는 GUID_WICPixelFormat32bppPBGRA로 변경하는 것을 권장하고 있습니다.

더보기

# 다른 포맷 GUID를 사용하면?

 저도 잘 모르겠습니다. 포맷이 변경되면 다른 문제가 생길까 싶어서 아래 항목으로 테스트를 진행해봤지만 이미지는 정상적으로 출력되었습니다.

  • GUID_WICPixelFormat32bppPRGBA

 정확한 내용은 좀 더 알아봐야겠습니다. 이 두 번째 인자가 무엇을 의미하는지 말이죠.

 

구현

 IWICFormatConverter 객체의 구현은 IWICImagingFactory에서 이루어집니다.

IWICImagingFactory* pWicFactory;
IWICFormatConverter* pConverter;
// IWICImagingFactory 객체는 이미 생성되어 있다고 가정한다.

pWicFactory->CreateFormatConverter(&pConverter);

 

사용

 IWICFormatConverter 또한 IWICBitmapSource를 기반으로 생성된 인터페이스입니다. 따라서 Initialize 메서드를 이용해 변형을 가할 수 있습니다.

IWICBitmapFrameDecode* pFrame;
IWICFormatConverter* pConverter;

pConverter->Initialize(pFrame, GUID_WICPixelFormat32bppPBGRA,
	WICBitmapDitherTypeNone, nullptr, 0.0f, WICBitmapPaletteTypeCustom);

 

재사용 불가

 IWICFormatConverter는 생성 - 초기화 - 해제가 한 묶음입니다. 따라서 생성 - 초기화 - 초기화의 과정이 불가합니다.

 

 두 비트맵 프레임 데이터가 존재한다고 할 때, 각 비트맵 프레임의 포맷을 변경하기 위해서는 생성-초기화-해제-생성-초기화-해제의 과정을 거쳐야합니다.

ID2D1Bitmap* pBitmap1, pBitmap2;
ID2D1HwndRenderTarget* pRT;
IWICImagingFactory* pWicFactory;
IWICBitmapFrameDecode *pFrame1, *pFrame2;
// 위 객체들은 모두 구현되어 있다고 가정한다.

IWICFormatConverter* pConverter;

// 첫 번째 이미지 프레임 포맷 변환
pWicFactory->CreateFormatConverter(&pConverter);
pConverter->Initialize(pFrame1, GUID_WICPixelFormat32bppPBGRA,
	WICBitmapDitherTypeNone, nullptr, 0.0f, WICbitmapPaletteTypeCustom);

pRT->CreateBitmapFromWicBitmap(pConverter, nullptr, &pBitmap1);

pConverter->Release();


// 두 번째 이미지 프레임 포맷 변환
pWicFactory->CreateFormatConvereter(&pConvereter);
pConverter->Initialize(pFrame2, GUID_WICPixelFormat32bppPBGRA,
	WICBitmapDitherTypeNone, nullptr, 0.0f, WICBitmapPaletteTypeCustom);
    
pRT->CreateBitmapFromWicBitmap(pConverter, nullptr, &pBitmap2);

pConverter->Release();

 

# index

728x90
반응형

'DEV > Direct2D' 카테고리의 다른 글

Direct2D - WIC IWICBitmapFlipRotator  (0) 2021.05.04
Direct2D - WIC IWICBitmapClipper  (0) 2021.05.01
Direct2D - WIC IWICBitmapScaler  (0) 2021.04.29
Direct2D - WIC IBitmapSource  (0) 2021.04.28
Direct2D - WIC를 이용해 이미지 그리기  (1) 2021.04.24
Comments