다음을 통해 공유


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 전달된 이미지 스트림이 실제로 사용자 고유의 이미지 형식의 유효한 인스턴스인지 확인합니다. 또한 코덱이 사양을 소유하지 않는 이미지 형식을 디코딩하는 경우 QueryCapability 구현에서 코덱이 구현하지 않는 이미지 형식 사양에 따라 유효할 수 있는 기능이 있는지 확인해야 합니다. 이렇게 하면 사용자가 불필요한 디코딩 오류가 발생하지 않거나 코덱으로 예기치 않은 결과를 얻을 수 있습니다.

이미지에서 작업을 수행하기 전에 스트림의 현재 위치를 저장해야 메서드에서 반환하기 전에 원래 위치로 복원할 수 있습니다. 기능을 지정하는 WICBitmapDecoderCapabilities 열거형은 다음과 같이 정의됩니다.

enum WICBitmapDecoderCapabilities
{   
   WICBitmapDecoderCapabilitySameEncoder,
   WICBitmapDecoderCapabilityCanDecodeAllImages,
   WICBitmapDecoderCapabilityCanDecodeSomeImages,
   WICBitmapDecoderCapabilityCanEnumerateMetadata,
   WICBitmapDecoderCapabilityCanDecodeThumbnail
}

동일한 인코더가 이미지를 인코딩한 경우에만 WICBitmapDecoderCapabilitySameEncoder 선언해야 합니다. 컨테이너의 각 프레임을 디코딩할 수 있는지 여부를 확인한 후 일부 프레임을 디코딩할 수 있는 경우 WICBitmapDecoderCapabilityCanDecodeSomeImages 선언하거나, 모든 프레임을 디코딩할 수 있는 경우 WICBitmapDecoderCapabilityCanDecodeAllImages를. 또는 모든 프레임을 디코딩할 수 없는 경우 둘 다 선언합니다. (이 두 열거형은 상호 배타적입니다. WICBitmapDecoderCapabilityCanDecodeAllImages반환하는 경우 WICBitmapDecoderCapabilityCanDecodeSomeImages 무시됩니다.) 이미지 컨테이너의 메타데이터 블록을 열거할 수 있는지 확인한 후 WICBitmapDecoderCapabilityCanEnumerateMetadata 선언합니다. 모든 프레임에서 썸네일을 확인할 필요는 없습니다. 전역 미리 보기가 있고 디코딩할 수 있는 경우 WICBitmapDecoderCapabilityCanDecodeThumbnail선언할 수 있습니다. 전역 축소판 그림이 없으면 프레임 0의 축소판 그림을 디코딩하려고 시도합니다. 이러한 위치 중 하나에 축소판 그림이 없으면 이 기능을 선언하지 마세요.

이 메서드에 전달된 이미지 스트림과 관련하여 디코더의 기능을 확인한 후 이 디코더가 이 이미지에서 수행할 수 있는지 확인한WICBitmapDecoderCapabilities를 사용하여 OR 작업을 수행하고 결과를 반환합니다. 반환하기 전에 스트림을 원래 위치로 복원해야 합니다.

초기화

디코더를 선택하여 특정 이미지를 디코딩한 후 애플리케이션에서 초기화가 호출됩니다. 이미지 스트림은 디코더에 전달되고 호출자는 파일의 메타데이터를 처리하기 위해 WICDecodeOptions 캐시 옵션을 선택적으로 지정할 수 있습니다.

enum WICDecodeOptions
{
   WICDecodeMetadataCacheOnDemand,
   WICDecodeMetadataCacheOnLoad
}

일부 애플리케이션은 다른 애플리케이션보다 메타데이터를 더 많이 사용합니다. 대부분의 애플리케이션은 이미지 파일의 모든 메타데이터에 액세스할 필요가 없으며 필요에 따라 특정 메타데이터를 요청합니다. 다른 애플리케이션은 메타데이터에 액세스해야 할 때마다 파일 스트림을 열어 두고 디스크 I/O를 수행하는 대신 모든 메타데이터를 미리 캐시합니다. 호출자가 메타데이터 캐시 옵션을 지정하지 않는 경우 기본 캐싱 동작은 요청 시 캐시되어야 합니다. 즉, 애플리케이션이 해당 메타데이터에 대해 특정 요청을 할 때까지 메타데이터를 메모리에 로드하지 않아야 합니다. 애플리케이션이 WICDecodeMetadataCacheOnLoad지정하는 경우 메타데이터는 메모리에 즉시 로드되고 캐시되어야 합니다. 메타데이터가 로드 시 캐시되면 메타데이터가 캐시된 후 파일 스트림이 해제될 수 있습니다.

GetContainerFormat

getContainerFormat구현하려면 디코더가 인스턴스화되는 이미지의 이미지 형식 GUID를 반환하기만 하면됩니다. 이 메서드는 IWICMetadataBlockReaderIWICBitmapEncoder에도 구현됩니다.

GetDecoderInfo

GetDecoderInfoIWICBitmapDecoderInfo 개체를 반환합니다. IWICBitmapDecoderInfo 개체를 얻으려면 다음 예제와 같이 디코더의 GUID를 IWICImagingFactoryCreateComponentInfo 메서드에 전달한 다음, 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 이미지의 미리 보기를 반환합니다. 미리 보기에 대한 자세한 논의는 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);

참조

IWICBitmapDecoder

IWICBitmapFrameDecode

개념

디코더 인터페이스

IWICBitmapCodecProgressNotification (디코더) 구현

WIC-Enabled CODEC 작성하는 방법

Windows 이미징 구성 요소 개요