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

Direct2D - WIC IBitmapSource 본문

DEV/Direct2D

Direct2D - WIC IBitmapSource

F.R.I.D.A.Y. 2021. 4. 28. 18:05
반응형

  픽셀 집합을 나타내는 WIC의 기본 단위


IBitmapSource

 앞으로 이미지를 불러와서 진행하는 것이 많을텐데, 그 과정에서 IBitmapSource에 무엇이 있는지 알아볼 필요가 있습니다. 이 구조를 많은 메서드에서 이용하기 때문이죠.

 

하위 인터페이스

 

Bitmap Sources Overview - Win32 apps

This topic introduces bitmap sources, a core Windows Imaging Component (WIC) component that represents the bitmap pixels of an image.

docs.microsoft.com

 이 페이지에서 보면 다음과 같은 대상이 이 인터페이스를 상속받아 구현되어 있다고 말합니다.

연산의 방식

 WIC의 작업은 메서드를 활용해 이미지를 조절하더라도 그 결과가 전달한 변수에 즉각적으로 대응하지 않습니다. 만일 크기 조정을 위해 IWICBitmapScaler를 이용했다면 아래와 같은 결과를 낳죠.

 IWICBitmapSource 인터페이스로 구현된 이미지의 크기를 조정하기 위해 IWICBitmapScaler를 생성하고 그 안의 Initialize 메서드를 이용해 크기를 조절했다면 기존 IWICBitmapSource 이미지의 크기가 줄어드는 것이 아닌, IWICBitmapSource를 베이스로 연산된 결과를 IWICBitmapScaler 객체가 저장을 하고 있습니다.

 

코드 예제

 우리는 아무것도 변형하지 않은 이미지를 출력할 때는 IWICBitmapFrameDecoder를 IWICFormatConverter에 넣어서 이미지 포맷을 수정하고 이를 ID2D1HwndRenderTarget에 넣어서 D2D 이미지를 생성 및 출력했습니다.

 

 IWICFormatConverter의 Initialize 메서드의 원형을 보면 다음과 같습니다.

HRESULT Initialize(
  IWICBitmapSource      *pISource,
  REFWICPixelFormatGUID dstFormat,
  WICBitmapDitherType   dither,
  IWICPalette           *pIPalette,
  double                alphaThresholdPercent,
  WICBitmapPaletteType  paletteTranslate
);

 포맷을 변형할 대상인 첫 번째 인자의 타입이 IWICBitmapSource입니다. 즉, 변형을 가했다면 IWICBitmapFrameDecode를 다시 만들것이 아니라 변형을 가한 데이터를 그대로 넣을 수 있는 것입니다.

 

ID2D1HwndRenderTarget *pRT;
ID2D1Bitmap* pBitmap;

IWICImagingFactory* pWicFactory;
IWICBitmapDecoder* pDecoder;
IWICBitmapFrameDecode* pFrame;
IWICBitmapScaler* pScaler;
IWICFormatConverter* pConverter;
// 관련 객체가 모두 생성되었다고 가정

pWicFactory->CreateBitmapFromFilename(..., &pDecoder);
// 파일 불러오기
pDecoder->GetFrame(0, &pFrame);
// 이미지 프레임 추출
pScaler->Initialize(pFrame, ...);
// 변형

pConverter->Initialize(pScaler, ...);
// 최종 데이터 포맷 변경

pRT->CreateBitmapFromWicBitmap(pConverter, nullptr, &pBitmap);
// D2D에서 사용가능한 비트맵 형식으로 로드

 

# index

728x90
반응형
Comments