다음을 통해 공유


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

GetContainerFormat IWICBitmapDecoder 구현하는GetContainerFormat 메서드와 동일합니다.

개수 가져오기

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 매개 변수의 경우 적절한 WICPersistOptions 과(와) 적절한 WICMetadataCreationOptions간에 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 컬렉션의 요청된 인덱스에서 메타데이터 판독기를 반환합니다.

참조

IWICMetadataBlockReader

개념

IWICBitmapFrameDecode 구현

IWICBitmapSourceTransform 구현

WIC-Enabled CODEC 작성하는 방법

Windows 이미징 구성 요소 개요