일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래밍
- Kotlin
- Win32
- 백준
- 티스토리
- 배열
- c
- Tips프로그래밍강좌
- Javascript
- c++
- 리뷰
- 함수
- Windows
- VS ERROR
- 지식나눔강좌
- Desktop
- Visual Studio
- CS
- tipssoft
- 문법
- 알고리즘
- Programming
- 이지스퍼블리싱
- Tips강좌
- Direct2D
- c#
- 포인터
- doit코틀린프로그래밍
- 연산자
- 김성엽
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
Direct2D - WIC IWICFormatConverter 본문
비트맵의 포맷을 변경하는 IWICFormatConverter
IWICFormatConverter
비트맵은 꽤 다양한 형식을 가지고 있습니다. 애초에 형식이라는게 비트맵 생성자가 비트맵 형식을 설명해주는 것으로 어떻게 만들던 상관은 없죠.[# 뭐 성능 좋은 형식이라면 금상첨화지만] 그러나 사용자가 요구하는 비트맵 형식이 있기도 합니다. Direct2D가 그 예입니다.
여기에서 잠깐 소개 했지만, 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
'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 |