IWICBitmapDecoder 구현
IWICBitmapDecoder
애플리케이션이 디코더를 요청할 때 코덱과의 첫 번째 상호 작용 지점은 IWICBitmapDecoder 인터페이스를 통해서입니다. 컨테이너의 최상위 속성과 컨테이너에 포함된 프레임에 대한 액세스를 제공하는 컨테이너 수준 인터페이스입니다. 컨테이너 수준 디코더 클래스의 기본 인터페이스입니다.
interface IWICBitmapDecoder : IUnknown
{
// Required methods
HRESULT QueryCapability (IStream *pIStream,
DWORD *pdwCapabilities );
HRESULT Initialize ( IStream *pIStream,
WICDecodeOptions cacheOptions );
HRESULT GetContainerFormat ( GUID *pguidContainerFormat );
HRESULT GetDecoderInfo ( IWICBitmapDecoderInfo **pIDecoderInfo );
HRESULT GetFrameCount ( UINT *pCount );
HRESULT GetFrame ( UINT index,
IWICBitmapFrameDecode **ppIBitmapFrame );
// Optional methods
HRESULT GetPreview ( IWICBitmapSource **ppIPreview );
HRESULT GetThumbnail ( IWICBitmapSource **ppIThumbnail );
HRESULT GetColorContexts ( UINT cCount,
IWICColorContext **ppIColorContexts,
UINT *pcActualCount );
HRESULT GetMetadataQueryReader ( IWICMetadataQueryReader **ppIMetadataQueryReader);
HRESULT CopyPalette ( IWICPalette *pIPalette );
}
일부 이미지 형식에는 전역 축소판 그림, 색 컨텍스트 또는 메타데이터가 있지만 많은 이미지 형식은 프레임 단위로만 제공합니다. 이러한 항목에 액세스하는 방법은 IWICBitmapDecoder에서 선택 사항이지만 IWICBitmapFrameDecode에는 필요합니다. 마찬가지로 일부 코덱은 인덱싱된 픽셀 형식을 사용하지 않으므로 두 인터페이스에서 CopyPalette 메서드를 구현할 필요가 없습니다. 선택적 IWICBitmapDecoder 메서드에 대한 자세한 내용은 가장 일반적으로 구현되는 IWICBitmapFrameDecode 구현을 참조하세요.
QueryCapability
QueryCapability 는 코덱 중재에 사용되는 방법입니다. (Windows 이미징 구성 요소 작동 방법 항목에서 검색 및 중재를 참조하세요.) 두 코덱이 동일한 이미지 형식을 디코딩할 수 있거나 두 코덱이 동일한 식별 패턴을 사용하는 패턴 충돌이 발생하는 경우 이 메서드를 사용하면 특정 이미지를 가장 잘 처리할 수 있는 코덱을 선택할 수 있습니다.
이 메서드를 호출할 때 WIC(Windows 이미징 구성 요소)는 이미지를 포함하는 실제 스트림을 전달합니다. 이미지 내의 각 프레임을 디코딩하고 메타데이터 블록을 통해 열거할 수 있는지 확인하여 이 디코더가 전달된 특정 파일 스트림과 관련하여 어떤 기능을 가지고 있는지 정확하게 선언해야 합니다. 이는 모든 디코더에 중요하지만 TIFF(태그가 지정된 이미지 파일 형식) 컨테이너를 기반으로 하는 이미지 형식에 특히 중요합니다. 검색 프로세스는 레지스트리의 디코더와 연결된 패턴을 실제 이미지 파일의 패턴과 일치시켜 작동합니다. 레지스트리에서 식별 패턴을 선언하면 이미지 형식의 이미지에 대해 디코더가 항상 검색됩니다. 그러나 디코더는 다른 형식의 이미지에 대해 여전히 검색될 수 있습니다. 예를 들어 모든 TIFF 컨테이너에는 TIFF 이미지 형식에 대한 유효한 식별 패턴인 TIFF 패턴이 포함됩니다. 즉, 검색 중에 TIFF 스타일 컨테이너를 기반으로 하는 모든 이미지 형식에 대한 이미지 파일에서 식별 패턴이 두 개 이상 발견됩니다. 하나는 TIFF 패턴이고 다른 하나는 실제 이미지 형식 패턴이 됩니다. 가능성이 낮지만 관련 없는 다른 이미지 형식 간에도 패턴 충돌이 있을 수 있습니다. 이것이 검색 및 중재가 2단계 프로세스인 이유입니다. QueryCapability에 전달된 이미지 스트림이 실제로 고유한 이미지 형식의 유효한 instance 있는지 항상 확인합니다. 또한 코덱이 사양을 소유하지 않은 이미지 형식을 디코딩하는 경우 QueryCapability 구현은 코덱이 구현하지 않는 이미지 형식 사양에 따라 유효할 수 있는 기능이 있는지 검사 합니다. 이렇게 하면 사용자가 불필요한 디코딩 오류가 발생하지 않거나 코덱으로 예기치 않은 결과를 얻을 수 있습니다.
이미지에서 작업을 수행하기 전에 스트림의 현재 위치를 저장해야 메서드에서 반환하기 전에 원래 위치로 복원할 수 있습니다. 기능을 지정하는 WICBitmapDecoderCapabilities 열거형은 다음과 같이 정의됩니다.
enum WICBitmapDecoderCapabilities
{
WICBitmapDecoderCapabilitySameEncoder,
WICBitmapDecoderCapabilityCanDecodeAllImages,
WICBitmapDecoderCapabilityCanDecodeSomeImages,
WICBitmapDecoderCapabilityCanEnumerateMetadata,
WICBitmapDecoderCapabilityCanDecodeThumbnail
}
인코더가 이미지를 인코딩한 경우에만 WICBitmapDecoderCapabilitySameEncoder 를 선언해야 합니다. 컨테이너의 각 프레임을 디코딩할 수 있는지 확인한 후 일부 프레임을 디코딩할 수 있지만 일부 프레임을 디코딩할 수 있는 경우 WICBitmapDecoderCapabilityCanDecodeSomeImages 를 선언합니다. 모든 프레임을 디코딩할 수 있는 경우 WICBitmapDecoderCapabilityCanDecodeAllImages 또는 프레임을 디코딩할 수 없는 경우 둘 다 선언합니다. (이 두 열거형은 상호 배타적입니다. WICBitmapDecoderCapabilityCanDecodeAllImages를 반환하는 경우 WICBitmapDecoderCapabilityCanDecodeSomeImages 는 무시됩니다.) 이미지 컨테이너의 메타데이터 블록을 열거할 수 있는지 확인한 후 WICBitmapDecoderCapabilityCanEnumerateMetadata 를 선언합니다. 모든 프레임에서 썸네일을 검사 필요가 없습니다. 전역 미리 보기가 있고 디코딩할 수 있는 경우 WICBitmapDecoderCapabilityCanDecodeThumbnail을 선언할 수 있습니다. 전역 축소판 그림이 없으면 프레임 0의 축소판 그림을 디코딩하려고 시도합니다. 이러한 위치 중 하나에 축소판 그림이 없으면 이 기능을 선언하지 마세요.
이 메서드에 전달된 이미지 스트림과 관련하여 디코더의 기능을 확인한 후 이 디코더가 이 이미지에서 수행할 수 있는지 확인한 WICBitmapDecoderCapabilities 를 사용하여 OR 작업을 수행하고 결과를 반환합니다. 반환하기 전에 스트림을 원래 위치로 복원해야 합니다.
Initialize
초기화 는 특정 이미지를 디코딩하기 위해 디코더를 선택한 후 애플리케이션에서 호출됩니다. 이미지 스트림이 디코더에 전달되고 호출자는 필요에 따라 파일의 메타데이터를 처리하기 위한 WICDecodeOptions 캐시 옵션을 지정할 수 있습니다.
enum WICDecodeOptions
{
WICDecodeMetadataCacheOnDemand,
WICDecodeMetadataCacheOnLoad
}
일부 애플리케이션은 다른 애플리케이션보다 메타데이터를 더 많이 사용합니다. 대부분의 애플리케이션은 이미지 파일의 모든 메타데이터에 액세스할 필요가 없으며 필요에 따라 특정 메타데이터를 요청합니다. 다른 애플리케이션은 파일 스트림을 열어 두고 메타데이터에 액세스해야 할 때마다 디스크 I/O를 수행하는 대신 모든 메타데이터를 미리 캐시합니다. 호출자가 메타데이터 캐시 옵션을 지정하지 않으면 기본 캐싱 동작은 요청 시 캐시되어야 합니다. 즉, 애플리케이션이 해당 메타데이터에 대해 특정 요청을 할 때까지 메타데이터를 메모리에 로드하지 않아야 합니다. 애플리케이션이 WICDecodeMetadataCacheOnLoad를 지정하는 경우 메타데이터는 즉시 메모리에 로드되고 캐시되어야 합니다. 메타데이터가 로드 시 캐시되면 메타데이터가 캐시된 후 파일 스트림이 해제될 수 있습니다.
GetContainerFormat
GetContainerFormat을 구현하려면 디코더가 인스턴스화되는 이미지의 이미지 형식 GUID만 반환합니다. 이 메서드는 IWICMetadataBlockReader 및 IWICBitmapEncoder에서도 구현됩니다.
GetDecoderInfo
GetDecoderInfo 는 IWICBitmapDecoderInfo 개체를 반환합니다. IWICBitmapDecoderInfo 개체를 얻으려면 다음 예제와 같이 디코더의 GUID를 IWICImagingFactory의 CreateComponentInfo 메서드에 전달한 다음, IWICBitmapDecoderInfo 인터페이스를 요청합니다.
IWICComponentInfo* pComponentInfo = NULL;
HRESULT hr;
hr = m_pImagingFactory->CreateComponentInfo(CLSID_This, &pComponentInfo);
hr = pComponentInfo->QueryInterface(IID_IWICBitmapDecoderInfo, (void**)ppIDecoderInfo);
GetFrameCount
GetFrameCount 는 컨테이너의 프레임 수를 반환합니다. 일부 컨테이너 형식은 여러 프레임을 지원하고 다른 컨테이너는 컨테이너당 하나의 프레임만 지원합니다.
GetFrame
GetFrame 은 IWICBitmapDecoder 인터페이스에서 중요한 메서드입니다. 프레임에 실제 이미지 비트가 포함되어 있고 이 메서드에서 반환된 프레임 디코더 개체는 요청된 이미지의 실제 디코딩을 수행하는 개체이기 때문입니다. 디코더를 작성할 때 구현해야 하는 다른 개체입니다. 프레임 디코더에 대한 자세한 내용은 IWICBitmapFrameDecode 구현을 참조하세요.
GetPreview
GetPreview 는 이미지의 미리 보기를 반환합니다. 미리 보기에 대한 자세한 내용은 IWICBitmapEncoder 구현 인터페이스의 IWICBitmapEncoder 구현 메서드를 참조하세요.
이미지 형식에 포함된 JPEG 미리 보기가 포함된 경우 JPEG 디코더를 작성하여 디코딩하는 대신 미리 보기 및 미리 보기를 디코딩하기 위해 WIC 플랫폼과 함께 제공되는 JPEG 디코더에 위임하는 것이 좋습니다. 이렇게 하려면 스트림에서 미리 보기 이미지 데이터의 시작을 찾고 IWICImagingFactory에서 CreateDecoderFromStream 메서드를 호출합니다.
IWICBitmapDecoder* pPreviewDecoder = NULL;
IWICBitmapFrameDecode* pPreviewFrame = NULL;
IWICBitmapSource* pPreview = NULL;
HRESULT hr;
hr = m_pImagingFactory->CreateDecoderFromStream(
m_pStream, NULL,
WICDecodeMetadataCacheOnDemand, &pPreviewDecoder);
hr = pPreviewDecoder->GetFrame(0, pPreviewFrame);
hr = pPreviewFrame->QueryInterface(IID_IWICBitmapSource, (void**)&pPreview);
관련 항목
-
참조
-
개념