WIC 메타데이터 개요

이 항목에서는 WIC(Windows 이미징 구성 요소)에서 제공하는 이미징 메타데이터 지원을 소개합니다. 이미지 메타데이터 읽기 및 쓰기, 메타데이터 쿼리 언어 및 메타데이터 처리기 확장성을 소개합니다.

이미지 메타데이터는 이미지 파일 내에 포함된 데이터로, 이미지 또는 이미지의 크기를 캡처하는 데 사용되는 디바이스와 같이 이미지에 대한 추가 정보를 제공합니다. 이미지 파일 자체에 포함되어 있지만 이 메타데이터는 렌더링 데이터의 일부가 아닙니다. WIC는 XMP(Extensible Metadata Platform), EXIF(Exchangeable Image File) 및 Png tEXt(텍스트 데이터)를 비롯한 몇 가지 일반적인 메타데이터 형식에 대해 이 메타데이터를 읽고 쓸 수 있는 인터페이스를 제공합니다.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

사전 요구 사항

이 항목을 이해하려면 Windows 이미징 구성 요소 개요에 설명된 대로 WIC 인코더 및 디코더 인터페이스 및 관련 COM(구성 요소 개체 모델) 구성 요소에 대해 잘 알고 있어야 합니다. 또한 현재 사용 중인 일부 이미징 메타데이터 형식을 일반적으로 숙지하는 데 도움이 됩니다.

소개

메타데이터는 이미지에 대한 확장된 정보를 제공합니다. 이 정보는 여러 가지 방법으로 사용할 수 있습니다. 이미지에는 설명, 등급, 범주 태그 및 저작권 정보와 같은 메타데이터가 포함될 수 있습니다. 메타데이터에 액세스하면 자산 관리, 파일 위치 또는 저작권 정보 확인과 같은 작업을 더 쉽게 수행할 수 있습니다. 예를 들어 Windows Vista의 Windows 사진 갤러리를 사용하면 이미지에 설명 및 범주 태그를 추가할 수 있습니다. 이렇게 하면 이미지를 더 잘 검색하고 이미지를 분류하는 편리한 방법을 사용할 수 있습니다. 애플리케이션은 WIC API 및 일반적인 메타데이터 형식을 사용하여 이미지에 대한 이러한 유형의 메타데이터를 쉽게 작성하거나 읽을 수 있습니다.

다음 다이어그램에서는 포함된 메타데이터 블록 및 메타데이터 항목을 포함하는 JPEG 파일의 내용을 보여 줍니다.

등급 메타데이터가 있는 jpeg 이미지

이 예제 이미지에서 메타데이터는 이미지 프레임 내의 이미지 파일에 포함됩니다. JPEG 형식은 여러 이미지 프레임을 지원하지 않으므로 메타데이터는 개념적으로 이 단일 프레임에 연결됩니다. TIFF와 같은 여러 프레임을 지원하는 형식에는 이 다이어그램과 같이 각 이미지 프레임에 연결된 메타데이터가 있을 수 있습니다. 현재는 일반적이지 않고 네이티브 이미지 코덱에서 지원되지 않지만 일부 이미지 형식은 이미지 프레임 외부의 메타데이터를 지원할 수도 있습니다. WIC는 이미지의 개별 프레임 외부에서 프레임 수준 메타데이터와 메타데이터를 모두 처리할 수 있을 만큼 유연합니다.

이미지 메타데이터 읽기

WIC API는 애플리케이션이 이미지 메타데이터를 쉽게 읽고 쓸 수 있도록 하는 COM 구성 요소를 제공합니다.

메타데이터를 읽는 기본 방법은 메타데이터 쿼리 판독기(IWICMetadataQueryReader)를 사용하여 특정 메타데이터 항목에 액세스하는 것입니다. 메타데이터 쿼리 판독기 구성 요소는 코덱에 의해 구현되며 디코더 수준 또는 더 일반적인 방법인 개별 이미지 프레임을 통해 액세스할 수 있습니다. 다음 코드에서는 쿼리 판독기 GetMetadataQueryReader 메서드를 사용하여 개별 프레임에 대한 쿼리 판독기 액세스 방법을 보여 줍니다.

// Get the query reader
if (SUCCEEDED(hr))
{
    hr = pFrameDecode->GetMetadataQueryReader(&pQueryReader);
}

쿼리 판독기는 특정 메타데이터에 대한 정보를 가져오는 메서드와 검색할 메타데이터 항목을 지정하는 수단을 제공합니다. 다음 코드는 쿼리 식을 사용하여 App1 중첩 이미지 파일 디렉터리(IFD) 블록 내에서 특정 메타데이터 항목을 요청합니다. 이 작업은 쿼리 판독기 GetMetadataByName 메서드를 사용하여 수행됩니다. 다음 코드에서는 쿼리 판독기를 사용하여 MicrosoftPhoto 등급 값을 가져오는 방법을 보여 줍니다.

PROPVARIANT value;
PropVariantInit(&value);

LPCWSTR pwzRatingQuery = L"/app1/ifd/{ushort=18249}";

if (SUCCEEDED(hr))
{
    hr = pQueryReader->GetMetadataByName(pwzRatingQuery, &value);
}

앞의 예제에서 pwzRatingQuery 변수는 메타데이터 항목 MicrosoftPhoto 등급에 액세스하기 위한 쿼리 문자열입니다. 이 문자열은 메타데이터 쿼리 언어를 사용하여 만들어집니다. 이 문자열을 만들려면 메타데이터 형식 및 메타데이터 쿼리 언어에 대한 지식이 있어야 개별 메타데이터 항목을 검색할 수 있습니다. 메타데이터 쿼리 언어에 대한 자세한 내용은 메타데이터 쿼리 언어 개요를 참조하세요.

백그라운드에서 쿼리 판독기는 메타데이터 판독기(IWICMetadataReader)를 사용하여 쿼리 식에 설명된 메타데이터에 액세스합니다. 쿼리 판독기를 사용하는 것 외에도 메타데이터 판독기에서 직접 액세스하여 메타데이터를 읽을 수도 있습니다. 블록 판독기(IWICMetadataBlockReader) 인터페이스를 쿼리하여 디코더 또는 개별 프레임에서 메타데이터 판독기를 가져올 수 있습니다.

이미지 메타데이터 작성

메타데이터 작성 프로세스는 메타데이터 쿼리 작성기(IWICMetadataQueryWriter)가 사용된다는 점을 제외하고 읽는 방식과 비슷합니다. 쿼리 작성기 인터페이스는 이미지 인코더에 의해 구현되며 쿼리 판독기에서와 같이 메타데이터는 인코더와 개별 프레임 모두에서 액세스됩니다(이미지 형식 지원에 따라 다름).

다음 코드에서는 인코더 프레임에서 쿼리 작성기를 가져오고 이전에 읽은 등급 값을 제거하는 방법을 보여 줍니다.

// Get the frame's query writer
if (SUCCEEDED(hr))
{
    hr = pFrameEncode->GetMetadataQueryWriter(&pFrameQWriter);
}

if (SUCCEEDED(hr))
{
    hr = pFrameQWriter->RemoveMetadataByName(L"/app1/ifd/{ushort=18249}");
}

메타데이터를 작성하는 또 다른 방법은 빠른 메타데이터 업데이트를 사용하는 것입니다. 빠른 메타데이터 인코딩은 이미지 파일을 다시 인코딩할 필요 없이 이미지 메타데이터를 작성하는 방법입니다. 이 작업은 메타데이터 형식의 패딩된 영역에 새 메타데이터 정보를 작성하여 수행됩니다. 빠른 메타데이터 인코더(IWICFastMetadataEncoder)는 이미지 디코더를 기반으로 구성 요소 팩터리에서 가져옵니다. 그런 다음 빠른 메타데이터 인코더는 메타데이터를 작성하는 데 사용되는 쿼리 작성기를 가져옵니다. 마지막으로, 빠른 인코더는 변경 내용을 커밋합니다.

다음 코드에서는 빠른 메타데이터 인코더를 가져와서 MicrosoftRating 값을 작성하는 방법을 보여 줍니다.

if (SUCCEEDED(hr))
{
    IWICFastMetadataEncoder *pFME = NULL;
    IWICMetadataQueryWriter *pFMEQW = NULL;

    hr = pFactory->CreateFastMetadataEncoderFromFrameDecode(
        pFrameDecode,
        &pFME);

    if (SUCCEEDED(hr))
    {
        hr = pFME->GetMetadataQueryWriter(&pFMEQW);
    }

    if (SUCCEEDED(hr))
    {
        // Add additional metadata
        PROPVARIANT value;

        PropVariantInit(&value);

        value.vt = VT_UI4;
        value.uiVal = 99;
        hr = pFMEQW->SetMetadataByName(L"/app1/ifd/{ushort=18249}", &value);

        PropVariantClear(&value);
    }

    if (SUCCEEDED(hr))
    {
        hr = pFME->Commit();
    }
}

모든 메타데이터 형식이 빠른 메타데이터를 지원하는 것은 아닙니다. 빠른 메타데이터 인코딩을 지원하는 기본적으로 지원되는 형식을 확인하려면 이 문서의 뒷부분에 있는 지원되는 메타데이터 형식 섹션의 표를 참조하세요.

백그라운드에서 쿼리 작성기는 메타데이터 작성기(IWICMetadataWriter)를 사용하여 쿼리 식에 설명된 메타데이터를 작성합니다. 쿼리 판독기를 사용하는 것 외에도 메타데이터 작성기에 직접 액세스하여 메타데이터를 작성할 수도 있습니다. 블록 작성기(IWICMetadataBlockWriter) 인터페이스에 대한 쿼리를 사용하여 디코더 또는 개별 프레임에서 메타데이터 작성기를 가져올 수 있습니다.

메타데이터 확장성

앞에서 설명한 것처럼 WIC는 일반적인 메타데이터 형식에 대한 메타데이터를 읽고 쓸 수 있는 여러 메타데이터 처리기를 제공합니다. 그러나 기본적으로 지원되지 않는 일부 메타데이터 형식이 있습니다. 따라서 WIC는 메타데이터 지원을 다른 형식으로 확장할 수 있는 추가 메타데이터 처리기를 만들기 위한 API를 제공합니다.

다른 메타데이터 형식을 완벽하게 지원하려면 메타데이터를 읽을 메타데이터 판독기와 메타데이터를 작성하는 메타데이터 작성기라는 두 가지 유형의 처리기를 개발해야 합니다. 이러한 두 처리기는 일반적으로 특정 형식에 대해 쌍으로 구현되지만 이는 요구 사항이 아닙니다. 읽기 기능 또는 쓰기 기능만 필요한 경우가 있을 수 있습니다.

WIC API를 사용한 메타데이터 확장성에 대한 자세한 내용은 메타데이터 확장성 개요를 참조하세요.

지원되는 메타데이터 형식

WIC는 몇 가지 일반적인 메타데이터 형식을 지원합니다. 다음 표에서는 지원되는 메타데이터 형식, 해당 버전, 메타데이터 형식을 지원하는 이미지 형식 및 메타데이터 형식이 빠른 메타데이터 인코딩을 지원하는지 여부를 나열합니다. 빠른 메타데이터 인코딩에 대한 자세한 내용은 이 문서의 앞부분에 있는 이미지 메타데이터 작성 섹션을 참조하세요.

지원되는 메타데이터 형식 메타데이터 사양 버전 이미지 형식 지원 빠른 메타데이터 인코딩 지원
App0 JFIF 1.02 JPEG No
앱 1 JFIF 1.02 JPEG, TIFF No
App13 Unknown JPEG, TIFF No
IFD TIFF 6.0 JPEG, TIFF Yes
Irb Unknown JPEG, TIFF No
Exif Exif 2.2 JPEG, TIFF Yes
Xmp XMP 1.0(2005년 9월) JPEG, TIFF Yes
GPS Exif 2.2 JPEG, TIFF Yes
Iptc IPTC 4.0 JPEG, TIFF Yes
텍스트 PNG 1.2 PNG No

 

참고

IPTC는 블록 크기가 증가하는 경우에만 FME를 지원합니다. IPTC는 패딩을 지원하지 않기 때문에

 

메타데이터 구성 요소 요약

다음 표에서는 메타데이터를 지원하는 WIC 인터페이스와 해당 구성 요소에 대해 설명합니다. 이러한 구성 요소는 이미지의 메타데이터에 대한 액세스를 제공합니다. 이러한 구성 요소에 대한 자세한 내용은 Windows 이미징 구성 요소 개요를 참조하세요.

구성 요소 Description
비트맵 디코더(IWICBitmapDecoder)
  • 이미지 스트림을 읽고 사용 가능한 비트맵 원본을 생성합니다. TIFF(태그가 지정된 이미지 파일 형식) 또는 JPEG(Joint Photographic Experts Group)와 같은 컨테이너 형식과 연결됩니다.
  • IWICMetadataBlockReader 인터페이스를 구현하여 프레임 내에 없는 디코더의 데이터 스트림에 있는 모든 메타데이터 블록을 열거합니다.
  • 쿼리 판독기를 노출하여 프레임 내에 없는 이미지와 연결된 메타데이터를 읽습니다.
비트맵 프레임 디코딩(IWICBitmapFrameDecode)
  • 디코더가 보유한 이미지 스트림에서 개별 프레임에 액세스합니다.
  • IWICMetadataBlockReader 인터페이스를 구현하여 프레임의 데이터 스트림에 있는 모든 메타데이터 블록을 열거합니다.
  • 쿼리 식을 사용하여 프레임과 연결된 메타데이터를 읽을 쿼리 판독기를 노출합니다.
비트맵 인코더(IWICBitmapEncoder)
  • 이미지 스트림에 비트맵 원본을 씁니다. TIFF 또는 JPEG와 같은 컨테이너 형식과 연결됩니다.
  • IWICMetadataBlockWriter 인터페이스를 구현하여 인코더의 데이터 스트림에 쓸 메타데이터 블록 목록을 작성합니다.
  • 쿼리 식을 사용하여 이미지와 연결된 메타데이터를 작성하는 쿼리 작성기를 노출합니다.
비트마 프레임 인코딩(IWICBitmapFrameEncode)
  • 인코더가 보유하는 스트림으로 인코딩할 프레임을 만듭니다.
  • IWICMetadataBlockWriter 인터페이스를 구현하여 프레임의 데이터 스트림에 쓸 메타데이터 블록 목록을 빌드합니다.
  • 쿼리 식을 사용하여 프레임과 연결된 메타데이터를 작성하는 쿼리 작성기를 노출합니다.

 

다음 표에서는 WIC 메타데이터 구성 요소에 대해 설명합니다. 이러한 구성 요소를 사용하면 이전 표에 나열된 구성 요소에 의해 노출된 이미지에서 메타데이터를 읽고 쓸 수 있습니다.

구성 요소 설명
메타데이터 쿼리 판독기(IWICMetadataQueryReader)
  • 쿼리 문자열을 사용하고 기본 메타데이터 계층 구조를 탐색하여 메타데이터를 가져옵니다.
메타데이터 쿼리 작성기(IWICMetadataQueryWriter)
  • 쿼리 문자열을 사용하고 기본 메타데이터 계층 구조를 탐색하여 메타데이터를 가져오고, 설정하고, 제거합니다.
메타데이터 블록 판독기(IWICMetadataBlockReader)
  • 메타데이터 계층 구조의 맨 위에 있는 IWICMetadataReader 개체의 읽기 전용 컬렉션을 관리하고 모든 메타데이터 블록을 열거할 수 있도록 합니다.
  • 비트맵 디코더 및 디코딩된 비트맵 프레임에 의해 구현됩니다.
  • 사용자 지정 코덱을 위해 타사 구성 요소 개발자가 구현합니다.
메타데이터 블록 작성기(IWICMetadataBlockWriter)
  • 메타데이터 계층 구조의 맨 위에 있는 IWICMetadataWriter 개체의 읽기 및 쓰기 컬렉션을 관리합니다.
  • 비트맵 인코더 및 비트맵 프레임 인코딩에 의해 구현됩니다.
  • 사용자 지정 코덱을 위해 타사 구성 요소 개발자가 구현합니다.
메타데이터 판독기(IWICMetadataReader)
  • 메타데이터 스트림을 구문 분석하고 메타데이터 항목의 읽기 전용 컬렉션을 관리합니다. EXIF, IFD 및 XMP와 같은 메타데이터 형식과 연결됩니다.
  • 형식 및 ID 쌍이 지정되면 값을 반환하는 사전 역할을 합니다.
  • 사용자 지정 메타데이터 형식에 대해 타사 구성 요소 개발자가 구현합니다.
메타데이터 기록기(IWICMetadataWriter)
  • 메타데이터 스트림을 구문 분석 및 직렬화하고 메타데이터 항목의 읽기/쓰기 컬렉션을 관리합니다.
  • 사용자 지정 메타데이터 형식에 대해 타사 구성 요소 개발자가 구현합니다.
빠른 메타데이터 인코더IWICFastMetadataEncoder
  • 이미지를 다시 인코딩하지 않고 메타데이터를 현재 위치에서 업데이트하는 메타데이터 계층 구조에 쓰기 위한 의미 체계를 노출합니다.

 

개념

Windows 이미징 구성 요소 개요

메타데이터 쿼리 언어 개요

이미지 메타데이터 읽기 및 쓰기 개요

메타데이터 확장성 개요

방법: 메타데이터를 사용하여 JPEG 이미지 다시 인코딩