Windows 이미징 구성 요소의 작동 방식

검색 및 중재

이미지를 디코딩하려면 먼저 해당 이미지 형식을 디코딩할 수 있는 적절한 코덱을 찾아야 합니다. 대부분의 시스템에서 지원되는 이미지 형식은 하드 코딩되므로 검색 프로세스가 필요하지 않습니다. WIC(Windows 이미징 구성 요소) 플랫폼은 확장 가능하므로 이미지의 형식을 식별하고 적절한 코덱과 일치시킬 수 있어야 합니다.

런타임 검색을 지원하려면 각 이미지 형식에 해당 형식에 적합한 디코더를 식별하는 데 사용할 수 있는 식별 패턴이 있어야 합니다. (새 파일 형식의 경우 고유하게 보장되므로 식별 패턴에 GUID를 사용하는 것이 좋습니다.) 식별 패턴은 해당 이미지 형식을 준수하는 각 이미지 파일에 포함되어야 합니다. 각 디코더에는 디코딩할 수 있는 이미지 형식의 식별 패턴 또는 패턴을 지정하는 레지스트리 항목이 있습니다. 애플리케이션이 이미지를 열어야 하는 경우 WIC에서 디코더를 요청합니다. WIC는 레지스트리에서 사용 가능한 디코더를 조회하고 각 레지스트리 항목에서 이미지 파일에 포함된 패턴과 일치하는 식별 패턴을 확인합니다. 디코더 레지스트리 항목에 대한 자세한 내용은 인코더별 레지스트리 항목을 참조하세요.

WIC는 이미지의 식별 패턴과 일치하는 단일 디코더를 찾으면 디코더의 instance 만들고 이미지 파일을 전달합니다. WIC가 둘 이상의 일치 항목을 찾은 경우 일치하는 각 디코더에서 QueryCapability 라는 메서드를 호출하여 서로 중재하고 가장 일치하는 항목을 찾습니다. 자세한 내용은 IWICBitmapDecoder 구현QueryCapabilities 섹션을 참조하세요.

디코딩

적절한 디코더를 선택하고 인스턴스화한 후 애플리케이션은 디코더에 직접 연결합니다. 디코더에는 다양한 인터페이스를 통해 구현하는 몇 가지 책임이 있습니다. 이러한 서비스는 다음과 같이 분류할 수 있습니다.

  • 컨테이너 수준 서비스
  • 프레임 수준 서비스
  • 메타데이터 열거형 서비스
  • 네이티브 디코더 변환
  • 진행률 알림 및 취소 지원
  • 원시 처리 서비스

컨테이너 수준 서비스에는 최상위 썸네일(지원되는 경우), 미리 보기, 색 컨텍스트, 색상표(해당하는 경우) 및 컨테이너 형식을 검색하고 컨테이너 내의 개별 이미지 프레임에 대한 액세스 권한을 제공하는 것이 포함됩니다. (일부 컨테이너는 단일 프레임만 포함하지만 TIFF(태그가 지정된 이미지 파일 형식)와 같은 컨테이너는 여러 프레임을 포함할 수 있습니다. 이 서비스 집합에는 디코더 자체에 대한 정보 및 특정 이미지 파일과 관련된 기능도 포함됩니다.

개별 프레임에는 고유한 썸네일이 있으며 프레임 수준에서 노출되는 고유한 색 컨텍스트, 색상표 및 기타 속성이 있을 수도 있습니다. 그러나 프레임 수준에서 수행되는 가장 중요한 작업은 해당 프레임에 대한 이미지 비트의 실제 디코딩입니다.

WIC는 가장 일반적인 메타데이터 형식(IFD, EXIF, IPTC, XMP, APP0, APP1 및 기타 형식)에 대한 메타데이터 판독기를 제공하며 타사 메타데이터 형식에 대한 확장성도 지원합니다. 이렇게 하면 메타데이터 구문 분석에 대한 책임의 코덱이 해제됩니다. 그러나 코덱은 메타데이터 블록을 열거하고 각 블록에 대한 메타데이터 판독기를 요청합니다. WIC는 메타데이터 처리기의 레지스트리 항목에서 패턴과 일치하는 블록 헤더의 패턴을 기반으로 코덱에 대해 수행하는 것과 동일한 방식으로 메타데이터 처리기에 대한 검색을 수행합니다. 자세한 내용은 인코더별 레지스트리 항목을 참조하세요.

디코더는 기본적으로 변환 작업을 지원할 필요는 없지만 이렇게 하면 더 나은 최종 사용자 환경을 제공하는 상당한 성능 최적화가 가능합니다. 예를 들어 애플리케이션은 이미지를 렌더링하기 전에 이미지에서 수행할 다양한 변환(크기 조정, 자르기, 회전 및 픽셀 형식 변환)의 파이프라인을 만들 수 있습니다. 파이프라인 변환에 대한 자세한 내용은 IWICBitmapSource를 참조하세요. 변환 파이프라인을 만든 후 애플리케이션은 파이프라인의 최종 변환을 요청하여 이미지 원본에 모든 변환을 적용한 결과 비트맵을 생성합니다. 이때 디코더 자체가 변환 작업을 수행할 수 있는 경우 WIC는 요청된 변환 중 수행할 수 있는 변환을 묻습니다. 디코더가 수행할 수 없는 요청된 변환은 디코딩된 이미지에서 WIC에 의해 수행된 후 호출자에게 반환됩니다. 이 최적화된 변환 파이프라인은 특히 디코딩 프로세스 중에 일부 또는 모든 변환을 수행할 수 있는 경우 메모리에서 각 변환을 순차적으로 수행하는 것보다 더 나은 성능을 제공합니다.

진행률 알림 및 취소 지원을 사용하면 애플리케이션이 긴 작업에 대한 진행률 알림을 요청하고 애플리케이션이 사용자에게 너무 오래 걸리는 작업을 취소할 수 있는 기회를 제공할 수 있습니다. 이는 사용자가 작업을 취소할 수 없는 경우 프로세스가 중단된 것을 느끼고 애플리케이션을 닫아 취소하려고 할 수 있기 때문에 중요합니다.

이러한 인터페이스는 WIC 사용 디코더 구현 섹션에 자세히 설명되어 있습니다.

원시 처리 서비스에는 노출, 대비 및 선명화와 같은 카메라 설정 조정 또는 원시 비트를 처리하기 전에 색 공간 변경이 포함됩니다.

Encoding

디코더와 마찬가지로 인코더는 인터페이스를 통해 구현해야 하는 책임이 있습니다. 인코더가 제공하는 서비스는 디코더가 제공하는 서비스를 보완합니다. 단, 이미지 데이터를 읽지 않고 작성합니다. 인코더는 다음 범주의 서비스도 제공합니다.

  • 컨테이너 수준 서비스
  • 프레임 수준 서비스
  • 메타데이터 열거형 및 업데이트 서비스
  • 진행률 알림 및 취소 지원

인코더에 대한 컨테이너 수준 서비스에는 최상위 썸네일(지원되는 경우), 미리 보기 및 팔레트(해당하는 경우)를 설정하고 개별 이미지 프레임을 반복하여 컨테이너로 직렬화할 수 있습니다.

인코더에 대한 프레임 수준 서비스는 이미지 데이터, 썸네일 및 연결된 색상표 또는 기타 구성 요소를 읽지 않고 작성하는 것을 제외하고 디코더에 대한 서비스를 미러.

또한 인코더에 대한 메타데이터 열거 서비스에는 작성할 메타데이터 블록을 반복하고 적절한 메타데이터 작성기를 호출하여 메타데이터를 디스크로 직렬화하는 것이 포함됩니다.

이러한 인터페이스는 WIC 사용 인코더 구현 섹션에 자세히 설명되어 있습니다.

코덱의 수명

WIC 코덱은 단일 이미지를 처리하도록 인스턴스화되며 일반적으로 수명이 짧습니다. 이미지가 로드되고 이미지가 닫혀 있을 때 해제될 때 만들어집니다. 애플리케이션은 겹치는 수명과 동시에 많은 수의 코덱을 사용할 수 있으며(수백 개의 이미지가 포함된 디렉터리를 스크롤하는 경우) 여러 애플리케이션이 동시에 이 작업을 수행할 수 있습니다.

일부 코덱은 수명 범위가 있는 프로세스의 수명으로 범위가 지정되지만 WIC 코덱의 경우는 그렇지 않습니다. Windows Vista 사진 갤러리, Windows Explorer 및 사진 뷰어뿐만 아니라 다양한 다른 응용 프로그램은 WIC를 기반으로 하며 코덱을 사용하여 이미지와 썸네일을 표시합니다. 코덱의 수명 범위가 프로세스의 수명으로 범위가 지정된 경우 Windows Vista Explorer 이미지 또는 썸네일이 표시될 때마다 해당 이미지를 디코딩하기 위해 인스턴스화된 코덱은 다음에 사용자가 컴퓨터를 다시 시작할 때까지 메모리에 유지됩니다. 코덱이 언로드되지 않으면 해당 리소스는 시스템의 다른 구성 요소에서 사용할 수 없으므로 사실상 "유출"됩니다.

코덱을 WIC로 사용하도록 설정하는 방법

  1. 이미지를 디코딩하고 메타데이터 블록을 반복하는 데 필요한 WIC 인터페이스를 노출하는 컨테이너 수준 디코더 클래스 및 프레임 수준 디코더 클래스를 구현합니다. 이렇게 하면 모든 WIC 기반 애플리케이션이 표준 이미지 형식과 상호 작용하는 것과 동일한 방식으로 코덱과 상호 작용할 수 있습니다.
  2. 이미지를 인코딩하고 메타데이터 블록을 이미지 파일로 직렬화하는 데 필요한 WIC 인터페이스를 노출하는 컨테이너 수준 인코더 클래스 및 프레임 수준 인코더 클래스를 구현합니다.
  3. 컨테이너 형식이 TIFF 또는 JPEG 컨테이너를 기반으로 하지 않는 경우 일반적인 메타데이터 형식(EXIF, XMP)에 대한 메타데이터 처리기를 작성해야 할 수 있습니다. 그러나 TIFF 기반 또는 JPEG 기반 컨테이너 형식을 사용하는 경우 시스템 제공 메타데이터 처리기에 위임할 수 있으므로 필요하지 않습니다.
  4. 모든 이미지 파일에 고유한 식별 패턴(GUID 권장)을 포함합니다. 이렇게 하면 검색하는 동안 이미지 형식을 코덱과 일치시킬 수 있습니다. 기존 이미지 형식에 대한 WIC 래퍼를 작성하는 경우 인코더가 항상 해당 이미지 형식에 고유한 이미지 파일에 쓰는 비트 패턴을 찾고 이를 식별 패턴으로 사용해야 합니다.)
  5. 설치 시 코덱을 등록합니다. 이렇게 하면 레지스트리의 식별 패턴을 이미지 파일에 포함된 패턴과 일치시켜 런타임에 코덱을 검색할 수 있습니다.
  6. Windows 7을 기준으로 WIC를 사용하려면 코덱이 COM 아파트 형식 "Both"여야 합니다. 즉, 다중 스레드 시나리오에서 아파트 간 호출자 및 호출자를 처리하기 위해 적절한 잠금을 수행해야 합니다. 자세한 내용은 다중 스레드 아파트 지원에 대한 다음 섹션을 참조하세요.
  7. 64비트 플랫폼 지원: Windows 7의 경우 WIC에서는 타사 WIC 코덱을 32비트 및 64비트 네이티브 이진 파일로 모두 제공해야 합니다. 또한 32비트 양식은 64비트 시스템에서 설치 및 실행되어야 하며, 타사 Windows 7 코덱 설치 관리자는 64비트 시스템에 32비트 및 64비트 이진 파일을 모두 설치해야 합니다.

WIC의 다중 스레드 아파트 지원

MTA(다중 스레드 아파트먼트) 내의 개체는 MTA 내의 스레드 수에 따라 동시에 호출될 수 있습니다. 이렇게 하면 다중 코어 시스템 및 특정 서버 시나리오에서 성능이 향상됩니다. 또한 MTA의 WIC 코덱은 다른 STA 아파트의 스레드 간 호출과 관련된 마샬링 비용 없이 MTA의 다른 개체를 호출할 수 있습니다. Windows 7에서는 JPEG, TIFF, PNG, GIF, ICO 및 BMP를 비롯한 MTA를 지원하도록 모든 기본 제공 WIC 코덱이 업데이트되었습니다. MTA를 지원하도록 타사 코덱을 작성하는 것이 좋습니다. MTA를 지원하지 않는 타사 코덱은 마샬링으로 인해 다중 스레드 애플리케이션에서 상당한 성능 비용을 발생합니다. MTA 지원을 사용하도록 설정하려면 타사 코덱에서 적절한 동기화를 구현해야 합니다. 이러한 동기화 기술의 정확한 구현은 이 문서의 scope. COM 개체 동기화에 대한 자세한 내용은 COM 스레딩 모델 이해 및 사용을 참조하세요.

개념

소개(WIC 사용 코덱을 작성하는 방법)

WIC 사용 디코더 구현

WIC 사용 코덱을 작성하는 방법

Windows 이미징 구성 요소 개요

WIC 메타데이터 개요