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의 기본 단위


Index

  • IBitmapSource
    • 하위 인터페이스
    • 연산의 방식
    • 코드 예제

Script from F.R.I.D.A.Y


IBitmapSourcecopy^

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

 

하위 인터페이스copy^

 

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

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

연산의 방식copy^

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

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

 

코드 예제copy^

 우리는 아무것도 변형하지 않은 이미지를 출력할 때는 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에서 사용가능한 비트맵 형식으로 로드

 

728x90
반응형
Comments