IWICMetadataBlockReader 구현

IWICMetadataBlockReader

여러 메타데이터 블록이 이미지 내에 존재하는 경우가 많으며, 각 블록은 서로 다른 형식의 정보를 노출합니다. WIC(Windows 이미징 구성 요소) 모델에서 메타데이터 처리기는 디코더와 같이 런타임에 검색할 수 있는 고유한 구성 요소입니다. 각 메타데이터 형식에는 별도의 처리기가 있으며, 이러한 각 메타데이터 처리기는 처리하는 메타데이터 형식을 지원하는 모든 이미지 형식과 함께 사용할 수 있습니다. 따라서 이미지 형식이 EXIF, XMP, IPTC 또는 다른 형식을 지원하는 경우 WIC와 함께 제공되는 이러한 형식에 대해 표준 메타데이터 처리기를 활용할 수 있으며 직접 작성할 필요가 없습니다. 물론 새 메타데이터 형식을 만드는 경우 표준 형식과 마찬가지로 런타임에 검색되고 호출되는 메타데이터 처리기를 작성해야 합니다.

참고

이미지 형식이 TIFF(태그가 지정된 이미지 파일 형식) 또는 JPEG 컨테이너를 기반으로 하는 경우 새 메타데이터 또는 독점 메타데이터 형식을 개발하지 않는 한 메타데이터 처리기를 작성할 필요가 없습니다. TIFF 및 JPEG 컨테이너에서 메타데이터 블록은 IFD 내에 있으며 각 컨테이너에는 다른 IFD 구조가 있습니다. WIC는 IFD 구조를 탐색하고 표준 메타데이터 처리기에 위임하여 해당 컨테이너 형식의 메타데이터에 액세스하는 두 컨테이너 형식 모두에 대한 IFD 처리기를 제공합니다. 따라서 이미지 형식이 이러한 컨테이너 중 하나를 기반으로 하는 경우 WIC IFD 처리기를 자동으로 활용할 수 있습니다. 그러나 고유한 최상위 메타데이터 구조가 있는 독점 컨테이너 형식이 있는 경우 IFD 처리기와 마찬가지로 해당 최상위 구조를 탐색하고 적절한 메타데이터 처리기에 위임할 수 있는 처리기를 작성해야 합니다.)

 

WIC는 일관된 인터페이스 집합을 통해 모든 이미지 형식으로 동일한 방식으로 작업할 수 있는 애플리케이션에 대한 추상화 계층을 제공하는 것과 마찬가지로, WIC는 메타데이터 형식과 관련하여 코덱 작성자를 위한 추상화 계층을 제공합니다. 앞에서 설명한 것처럼 코덱 작성자는 일반적으로 이미지에 있을 수 있는 다양한 메타데이터 형식으로 직접 작업할 필요가 없습니다. 그러나 모든 코덱 작성자는 각 블록에 대해 적절한 메타데이터 처리기를 검색하고 인스턴스화할 수 있도록 메타데이터 블록을 열거하는 방법을 제공합니다.

프레임 수준 디코딩 클래스에서 이 인터페이스를 구현해야 합니다. 이미지 형식이 개별 이미지 프레임 외부에 전역 메타데이터를 노출하는 경우 컨테이너 수준 디코더 클래스에서 구현해야 할 수도 있습니다.

interface IWICMetadataBlockReader : IUnknown
{
   // All methods required
   HRESULT GetContainerFormat ( GUID *pguidContainerFormat );
   HRESULT GetCount ( UINT *pcCount );
   HRESULT GetEnumerator ( IEnumUnknown **ppIEnumMetadata );
   HRESULT GetReaderByIndex ( UINT nIndex, IWICMetadataReader **ppIMetadataReader );
}

GetContainerFormat

GetContainerFormatIWICBitmapDecoder 구현GetContainerFormat 메서드와 동일합니다.

GetCount

GetCount 는 프레임과 연결된 최상위 메타데이터 블록 수를 반환합니다.

GetEnumerator

GetEnumerator 는 호출자가 프레임의 메타데이터 블록을 열거하고 해당 메타데이터를 읽는 데 사용할 수 있는 열거자를 반환합니다. 이 메서드를 구현하려면 메타데이터의 각 블록에 대한 메타데이터 판독기를 만들고 메타데이터 판독기 컬렉션을 열거하는 열거형 개체를 구현해야 합니다. 열거형 개체는 IEnumUnknown 을 구현해야 하므로 ppIEnumMetadata 매개 변수에서 반환할 때 IEnumUnknown으로 캐스팅할 수 있습니다.

열거형 개체를 구현할 때 IWICMetadataBlockReader 개체를 처음 만들 때 또는 열거형 개체를 처음 만들 때 모든 메타데이터 판독기를 만들거나 IEnumUnknown::Next 메서드의 구현 내에서 지연적으로 만들 수 있습니다. 대부분의 경우 지연적으로 만드는 것이 더 효율적이지만 다음 예제에서는 블록 판독기가 모두 생성자에 만들어 공간을 절약합니다.

public class MetadataReaderEnumerator : public IEnumUnknown
{
   UINT m_current;
   UINT m_blockCount;
   IWICMetadataReader** m_ppMetadataReader;
   IStream* m_pStream;

   MetadataReaderEnumerator() 
   {
       // Set m_blockCount to the number of metadata blocks in the frame. 
      ...
      m_ppMetadataReader = IWICMetadataReader*[m_blockCount];
       m_current = 0;

      for (UINT x=0; x < m_blockCount; x++) 
      {
         // Find the position in the file where the xth
         // block of metadata lives and seek m_piStream 
         // to that position.
         ...

         m_pComponentFactory->CreateMetadataReaderFromContainer(
            GUID_ContainerFormatTiff,
                        NULL,
                        WICPersistOptions.WICPersistOptionsDefault | 
            WICMetadataCreationOptions.WICMetadataCreationDefault, 
                        m_pStream, &m_ppMetadataReader[x]);
        }
    }

    // Implementation of IEnumUnknown and IUnknown interfaces
    ...
}

메타데이터 판독기를 만들려면 CreateMetadataReaderFromContainer 메서드를 사용합니다. 이 메서드를 호출할 때 guidContainerFormat 매개 변수에서 컨테이너 형식의 GUID를 전달합니다. 메타데이터 판독기에 대한 공급업체 기본 설정이 있는 경우 pGuidVendor 매개 변수에서 기본 공급 업체의 GUID를 전달할 수 있습니다. 예를 들어 회사에서 메타데이터 처리기를 작성하고 있는 경우 직접 사용하려는 경우 공급업체 GUID를 전달할 수 있습니다. 대부분의 경우 NULL만 전달하고 시스템에서 적절한 메타데이터 판독기를 선택하도록 합니다. 특정 공급업체를 요청하고 해당 공급업체에 메타데이터 판독기가 컴퓨터에 설치된 경우 WIC는 해당 공급업체의 판독기를 반환합니다. 그러나 요청된 공급업체에 컴퓨터에 메타데이터 판독기가 설치되어 있지 않고 사용 가능한 적절한 메타데이터 판독기가 있는 경우 기본 공급 업체가 아니더라도 해당 판독기가 반환됩니다. 컴퓨터에 블록의 메타데이터 형식에 대한 메타데이터 판독기가 없는 경우 구성 요소 팩터리는 메타데이터 블록을 BLOB(Binary Large Object)로 처리하고 파일에서 메타데이터 블록을 구문 분석하지 않고 역직렬화하는 알 수 없는 메타데이터 처리기를 반환합니다.

dwOptions 매개 변수의 경우 적절한 WICMetadataCreationOptions를 사용하여 적절한 WICPersistOptions 간에 OR 작업을 수행합니다. WICPersistOptions는 컨테이너를 배치하는 방법을 설명합니다. Little-endian이 기본값입니다.

enum WICPersistOptions
{   
   WICPersistOptionDefault,
   WICPersistOptionLittleEndian,
   WICPersistOptionBigEndian,
   WICPersistOptionStrictFormat,
   WICPersistOptionNoCacheStream,
   WICPersistOptionPreferUTF8
};

WICMetadataCreationOptions는 컴퓨터에서 특정 블록의 메타데이터 형식을 읽을 수 있는 메타데이터 판독기가 없는 경우 UnknownMetadataHandler를 다시 가져올지 여부를 지정합니다. WICMetadataCreationAllowUnknown 이 기본값이며 항상 UnknownMetadtataHandler 만들기를 허용해야 합니다. UnknownMetadataHandler는 인식할 수 없는 메타데이터를 BLOB으로 처리합니다. 구문 분석할 수는 없지만 BLOB으로 스트림에 기록되며 인코딩하는 동안 스트림에 다시 기록될 때 그대로 유지됩니다. 이렇게 하면 시스템과 함께 제공되지 않는 독점 메타데이터 또는 메타데이터 형식에 대한 메타데이터 처리기를 안전하게 만들 수 있습니다. 메타데이터는 그대로 유지되므로 이를 인식하는 컴퓨터에 처리기가 없더라도 적절한 메타데이터 처리기가 나중에 설치될 때 메타데이터는 계속 존재하며 읽을 수 있습니다. UnknownMetadataHandler 만들기를 허용하지 않으면 인식할 수 없는 메타데이터를 삭제하거나 덮어씁니다. 이는 데이터 손실의 한 형태입니다.

참고

독점 메타데이터에 대한 고유한 메타데이터 처리기를 작성하는 경우 메타데이터 블록 자체 외부의 항목에 대한 참조를 포함해서는 안 됩니다. UnknownMetadataHandler는 메타데이터를 그대로 유지하더라도 파일을 편집할 때 메타데이터가 이동되고 자체 블록 외부의 모든 항목에 대한 참조는 더 이상 유효하지 않습니다.

 

enum WICMetadataCreationOptions
{
   WICMetadataCreationDefault = 0x00000000,
   WICMetadataCreationAllowUnknown = WICMetadataCreationDefault,
   WICMetadataCreationFailUnknown = 0x00010000,
   WICMetadataCreationMask = 0xFFFF0000
};

pIStream 매개 변수는 디코딩하는 실제 스트림입니다. 스트림을 전달하기 전에 판독기를 요청하는 메타데이터 블록의 시작을 찾아야 합니다. IStream의 현재 위치에 있는 메타데이터 블록에 대한 적절한 메타데이터 판독기가 ppiReader 매개 변수에 반환됩니다.

GetReaderByIndex

GetReaderByIndex 는 컬렉션의 요청된 인덱스에 있는 메타데이터 판독기를 반환합니다.

참조

IWICMetadataBlockReader

개념

IWICBitmapFrameDecode 구현

IWICBitmapSourceTransform 구현

WIC-Enabled CODEC를 작성하는 방법

Windows 이미징 구성 요소 개요