Share via


IWICBitmapEncoder 구현

IWICBitmapEncoder

이 인터페이스는 IWICBitmapDecoder 인터페이스에 대응하며 이미지 파일을 인코딩하기 위한 시작점입니다. IWICBitmapDecoder가 이미지 컨테이너에서 컨테이너 수준 속성 및 개별 프레임을 검색하는 데 사용되는 것처럼 IWICBitmapEncoder는 컨테이너 수준 속성을 설정하고 개별 이미지 프레임을 컨테이너로 직렬화하는 데 사용됩니다. 컨테이너 수준 인코더 클래스에서 이 인터페이스를 구현합니다.

interface IWICBitmapEncoder : public IUnknown
{
   // Required methods
   HRESULT Initialize ( IStream *pIStream,
              WICBitmapEncoderCacheOption cacheOption );
   HRESULT GetContainerFormat ( GUID *pguidContainerFormat );
   HRESULT GetEncoderInfo ( IWICBitmapEncoderInfo **pIEncoderInfo );
   HRESULT CreateNewFrame ( IWICBitmapFrameEncode **ppIFrameEncode,
              IPropertyBag2 **ppIEncoderOptions );
   HRESULT Commit ( void );

   // Optional methods
   HRESULT SetPreview ( IWICBitmapSource *pIPreview );
   HRESULT SetThumbnail ( IWICBitmapSource *pIThumbnail );
   HRESULT SetColorContexts ( UINT cCount,
              IWICColorContext **ppIColorContext );
   HRESULT GetMetadataQueryWriter ( IWICMetadataQueryWriter 
              **ppIMetadataQueryWriter );
   HRESULT SetPalette ( IWICPalette *pIPalette);
};

IWICBitmapDecoder 구현에서 설명한 대로 일부 이미지 형식에는 전역 썸네일, 색 컨텍스트 또는 메타데이터가 있지만 많은 이미지 형식은 프레임 단위로만 제공합니다. 따라서 이러한 설정 방법은 IWICBitmapEncoder에서 선택 사항이지만 IWICBitmapFrameEncode에 필요합니다. IWICBitmapFrameEncode에서 가장 일반적으로 구현되는 IWICBitmapFrameEncode 섹션의 IWICBitmapEncoder에서 선택 사항인 메서드에 대해 설명합니다.

전역 썸네일을 지원하지 않는 경우 IWICBitmapEncoder의 SetThumbnail 메서드에서 WINCODEC_ERR_CODECNOTHUMBNAIL 반환합니다. 컨테이너 수준 팔레트를 지원하지 않거나 인코딩 중인 이미지에 인덱싱된 형식이 없는 경우 SetPalette 메서드에서 WINCODEC_ERR_PALETTEUNAVAILABLE 반환합니다. 지원되지 않는 다른 메서드의 경우 WINCODEC_ERR_UNSUPPORTEDOPERATION 반환합니다.

Initialize

Initialize 는 인스턴스화된 후 IWICBitmapEncoder 에서 호출된 첫 번째 메서드입니다. 이미지 스트림은 인코더에 전달되고 호출자는 필요에 따라 캐시 옵션을 지정할 수 있습니다. 디코더의 경우 스트림은 읽기 전용이지만 인코더에 전달된 스트림은 인코더가 모든 이미지 데이터 및 메타데이터를 직렬화하는 쓰기 가능한 스트림입니다. 인코더의 캐시 옵션도 다릅니다.

enum WICBitmapEncoderCacheOption
{
   WICBitmapEncoderCacheInMemory,
   WICBitmapEncoderCacheTempFile,
   WICBitmapEncoderNoCache
}

애플리케이션은 인코더에 메모리의 이미지 데이터를 캐시하거나, 임시 파일에 캐시하거나, 캐싱 없이 디스크 파일에 직접 쓰도록 요청할 수 있습니다. 임시 파일에 데이터를 캐시하라는 메시지가 표시되면 인코더는 디스크에 임시 파일을 만들고 메모리에 캐싱하지 않고 해당 파일에 직접 씁니다. 호출자가 캐시 없음 옵션을 선택하면 다음 프레임을 만들기 전에 각 프레임을 순서대로 커밋해야 합니다.

GetContainerFormat

GetContainerFormatIWICBitmapDecoder 구현GetContainerFormat 메서드와 동일한 방식으로 구현됩니다.

GetEncoderInfo

GetEncoderInfoIWICBitmapEncoderInfo 개체를 반환합니다. IWICBitmapEncoderInfo 개체를 얻으려면 인코더의 GUID를 IWICImagingFactoryCreateComponentInfo 메서드에 전달한 다음, IWICBitmapEncoderInfo 인터페이스를 요청하면 됩니다.

GetDecoderInfo 아래의 IWICBitmapDecoder 구현의 예제를 참조하세요.

CreateNewFrame

CreateNewFrameIWICBitmapDecoderGetFrame에 대응하는 인코더입니다. 이 메서드는 컨테이너 내의 특정 프레임에 대한 이미지 데이터를 실제로 직렬화하는 개체인 IWICBitmapFrameEncode 개체를 반환합니다.

WIC(Windows 이미징 구성 요소)의 이점 중 하나는 애플리케이션이 동일한 방식으로 모든 이미지 형식으로 작업할 수 있도록 하는 추상화 계층을 제공한다는 것입니다. 그러나 모든 이미지 형식이 정확히 동일한 것은 아닙니다. 일부 이미지 형식에는 다른 이미지 형식에는 없는 기능이 있습니다. 애플리케이션이 이러한 고유한 기능을 활용할 수 있도록 하려면 코덱이 이를 노출할 수 있는 방법을 제공해야 합니다. 인코더 옵션의 목적입니다. 코덱이 인코더 옵션을 지원하는 경우 지원하는 인코더 옵션을 노출하는 IPropertyBag2 개체를 만들고 이 메서드의 ppIEncoderOptions 매개 변수에 반환해야 합니다. 그런 다음 호출자는 이 IPropertyBag2 개체를 사용하여 코덱이 지원하는 인코더 옵션을 결정할 수 있습니다. 호출자가 지원되는 인코더 옵션에 대한 값을 지정하려는 경우 IPropertyBag2 개체의 관련 속성에 값을 할당하고 Initialize 메서드에서 새로 만든 IWICBitmapFrameEncode 개체에 전달합니다.

IPropertyBag2 개체를 인스턴스화하려면 먼저 PROPBAG2 구조체를 만들어 인코더가 지원하는 각 인코더 옵션과 각 속성의 데이터 형식을 지정해야 합니다. 그런 다음 쓰기 시 각 속성의 값 범위를 적용하고 충돌하거나 겹치는 값을 조정하는 IPropertyBag2 개체를 구현해야 합니다. 충돌하지 않는 간단한 인코더 옵션 집합의 경우 CREATEEncoderPropertyBag 메서드를 호출하여 PROPBAG2 구조체에서 지정한 속성을 사용하여 간단한 IPropertyBag2 개체를 만들 수 있습니다. 여전히 값 범위를 적용해야 합니다. 고급 인코더 옵션을 사용하거나 충돌하는 값을 조정해야 하는 경우 고유한 IPropertyBag2 구현을 작성해야 합니다.

UINT cuiPropertyCount = 0;
IPropertyBag2* pPropertyBag = NULL;
PROPBAG2* pPropBagOptions;
HRESULT hr;

// Insert code here to initialize piPropertyBag with the 
// supported options for your encoder, and to initialize 
// cuiPropertyCount to the number of encoder option properties
// you are exposing.
...

hr = pComponentFactory->CreateEncoderPropertyBag( 
   pPropBagOptions, cuiPropertyCount, &pPropertyBag);

WIC는 일부 일반적인 이미지 형식에서 사용되는 작은 정식 인코더 옵션 집합을 제공합니다. 모든 정식 인코더 옵션은 선택 사항이며 코덱은 이러한 옵션을 지원할 필요가 없습니다. 정식 옵션으로 제공되는 이유는 많은 애플리케이션이 이미지 파일을 지원하는 형식으로 저장할 때 사용자가 이러한 옵션을 지정할 수 있도록 사용자 인터페이스를 노출하기 때문입니다. 이러한 옵션을 지정하는 정식 방법을 제공하면 애플리케이션이 일관된 방식으로 인코더와 쉽게 통신할 수 있습니다. 정식 인코더 옵션은 다음 표에 나와 있습니다.

인코더 옵션 VARTYPE 값 범위
Lossless VT_BOOL True/False
ImageQuality VT_R4 0.0-1.0
CompressionQuality VT_R4 0.0-1.0
BitmapTransform VT_UI1 WICBitmapTransformOptions

 

코덱이 무손실 인코딩을 지원하는 경우 무손실 인코더 옵션을 애플리케이션에서 무손실로 인코딩하도록 요청하는 방법으로 노출해야 합니다. 호출자가 이 속성을 True로 설정하는 경우 ImageQuality 옵션을 무시하고 무손실로 이미지를 인코딩해야 합니다.

ImageQuality 옵션을 사용하면 애플리케이션이 이미지를 인코딩할 충실도를 지정할 수 있습니다. 이 옵션을 사용하면 사용자가 이미지 품질과 속도 및/또는 파일 크기 간에 절충할 수 있습니다. JPEG는 이 절충을 지원하는 이미지 형식의 예입니다. 값 0.0은 충실도가 낮고 인코더가 가장 손실이 많은 알고리즘을 사용해야 함을 나타냅니다. 값 1.0은 충실도가 가장 중요하고 인코더가 가능한 가장 높은 충실도를 유지해야 함을 나타냅니다. (코덱에 따라 무손실 옵션과 동의어일 수 있습니다. 그러나 코덱이 무손실 인코딩을 지원하고 무손실 옵션이 True로 설정된 경우 ImageQuality 옵션을 무시해야 합니다.)

CompressionQuality 옵션을 사용하면 애플리케이션이 이미지를 인코딩할 때 사용할 압축의 효율성을 지정할 수 있습니다. 매우 효율적인 알고리즘은 덜 효율적인 압축 알고리즘과 동일한 품질을 가진 더 작은 이미지 파일을 생성할 수 있지만 인코딩하는 데 시간이 더 오래 걸릴 수 있습니다. 이 옵션을 사용하면 동일한 수준의 품질을 유지하면서 파일 크기와 인코딩 속도 간에 절충을 지정할 수 있습니다. TIFF는 이 절충을 지원하는 이미지 형식의 예입니다. (JPEG와 같은 형식은 다양한 수준의 압축을 지원하지만 압축 속도가 높을수록 이미지 품질이 저하됩니다. 따라서 JPEG 이미지 형식은 CompressionQuality 옵션이 아닌 ImageQuality 옵션을 노출합니다.) 이 옵션의 값이 0.0이면 더 큰 파일 크기를 희생하면서 충실도를 줄이지 않고 최대한 빨리 이미지를 압축해야 함을 나타냅니다. 값 1.0은 인코딩하는 데 걸리는 시간에 관계없이 가능한 가장 작은 파일 크기(동일한 품질 수준)를 만들어야 했음을 나타냅니다. 코덱은 ImageQuality 옵션과 CompressionQuality 옵션을 모두 지원할 수 있습니다. 여기서 ImageQuality 옵션은 허용 가능한 손실 수준을 지정하고 CompressionQuality 옵션은 지정된 품질 수준에서 크기/속도 절충을 제공합니다.

BitmapTransform 옵션은 호출자가 인코딩할 때 회전 각도 또는 세로 또는 가로 대칭 이동 방향을 지정할 수 있는 방법을 제공합니다. 요청된 변환을 지정하는 데 사용되는 WICBitmapTransformOptions 열거형은 IWICBitmapSourceTransform 인터페이스를 통해 디코딩하는 동안 변환을 요청할 때 사용되는 열거형과 동일합니다.

인코더는 정식 인코더 옵션으로 제한되지 않습니다. 인코더 옵션의 목적은 인코더가 해당 기능을 노출할 수 있도록 하는 것이며 노출할 수 있는 기능 유형에는 제한이 없습니다. 인코더 옵션이 잘 문서화되어 있는지 확인합니다. 애플리케이션이 이 메서드에서 반환하는 속성 모음을 사용하여 지원하는 옵션의 이름, 형식 및 값 범위를 검색할 수 있지만, 애플리케이션이 해당 의미를 파악하거나 사용자 인터페이스에 노출하는 유일한 방법은 설명서에서 나온 것입니다.

Commit

Commit 은 모든 이미지 데이터와 메타데이터가 스트림으로 직렬화된 후 호출하는 메서드입니다. 이 메서드를 사용하여 미리 보기 이미지 데이터를 스트림 및 전역 썸네일, 메타데이터, 팔레트 또는 기타 항목(해당하는 경우)으로 직렬화해야 합니다. 스트림을 연 애플리케이션이 닫을 것으로 예상되므로 이 메서드는 파일 스트림을 닫지 않아야 합니다.

IWICBitmapFrameEncode:Commit 메서드의 섹션에는 IWICBitmapEncoderCacheOptions가 이 메서드의 동작에 미치는 영향에 대한 세부 정보가 있습니다.

SetPreview

SetPreview 는 이미지의 미리 보기를 만드는 데 사용됩니다. 모든 이미지에 미리 보기가 있어야 하는 것은 아니지만 매우 권장됩니다. 최신 디지털 카메라와 스캐너는 매우 큰 경향이 매우 높은 해상도의 이미지를 생성하므로 디코딩하는 데 상당한 처리 시간이 걸립니다. 차세대 카메라의 이미지는 훨씬 더 커질 것입니다. 일반적으로 JPEG 형식으로 더 작고 낮은 해상도의 이미지를 제공하는 것이 좋습니다. 이 버전은 사용자가 요청할 때 신속하게 디코딩하고 "즉시" 표시할 수 있습니다. 애플리케이션은 사용자에게 더 나은 환경을 제공하기 위해 실제 이미지를 디코딩하도록 요청하기 전에 미리 보기를 요청하고 실제 이미지 디코딩을 기다리는 동안 이미지의 화면 크기 표현을 표시할 수 있습니다. 코덱은 미리 보기를 제공해야 하지만 IWICBitmapSourceTransform 을 지원하지 않는 코덱은 확실히 그렇게 해야 합니다.

JPEG 미리 보기를 제공하는 경우 인코딩하기 위해 JPEG 인코더를 작성할 필요가 없습니다. 미리 보기와 미리 보기를 모두 인코딩하기 위해 WIC 플랫폼과 함께 제공되는 JPEG 인코더에 위임해야 합니다.

참조

IWICBitmapEncoder

IWICBitmapFrameEncode

개념

인코더 인터페이스

IWICBitmapCodecProgressNotification 구현(인코더)

WIC-Enabled CODEC를 작성하는 방법

Windows 이미징 구성 요소 개요