다음을 통해 공유


IWICBitmapCodecProgressNotification 구현(디코더)

IWICBitmapCodecProgressNotification

코덱이 큰 이미지에서 CopyPixels 와 같은 I/O 작업을 수행하는 경우 완료하는 데 몇 초 또는 몇 분 정도 걸릴 수 있습니다. 최종 사용자가 장기 실행 작업을 중단할 수 없는 경우 애플리케이션이 중단된 것으로 생각할 수 있습니다. 사용자는 애플리케이션이 응답하지 않을 때 컴퓨터를 다시 제어하기 위해 애플리케이션을 닫거나 컴퓨터를 다시 시작하는 경우가 많습니다.

이 인터페이스를 사용하면 애플리케이션에서 코덱이 지정된 간격으로 호출할 수 있는 콜백 함수를 지정하여 호출자에게 현재 작업의 진행률을 알릴 수 있습니다. 애플리케이션은 이 콜백 함수를 사용하여 작업 상태 사용자에게 알리기 위해 사용자 인터페이스의 진행률 표시를 표시할 수 있습니다. 사용자가 진행률 대화 상자에서 취소 단추를 클릭하면 애플리케이션은 콜백 함수에서 WINCODEC_ERR_ABORTED 반환합니다. 이 경우 코덱은 지정된 작업을 취소하고 이 HRESULT 를 작업을 수행하던 메서드의 호출자에게 다시 전파해야 합니다.

이 인터페이스는 컨테이너 수준 디코더 클래스에서 구현되어야 합니다.

interface IWICBitmapCodecProgressNotification : public IUnknown
{
    HRESULT RegisterProgressNotification ( 
        PFNProgressNotification pfnProgressNotification,
        LPVOID pvData,
        DWORD dwProgressFlags );
}

RegisterProgressNotification

RegisterProgressNotification 은 애플리케이션에서 호출하여 코덱이 지정된 간격으로 호출할 수 있는 콜백 함수를 등록합니다. 첫 번째 매개 변수인 pfnProgressNotification은 코덱이 정기적으로 호출해야 하는 콜백 함수에 대한 포인터입니다.

pvData 매개 변수는 콜백 함수가 호출될 때마다 호출자가 콜백 함수로 다시 전달하려고 하는 일부 개체를 가리킵니다. 이 개체는 전혀 있을 수 있으며 코덱에 특별한 의미가 없습니다.

dwProgressFlags 매개 변수는 코덱이 콜백 함수를 호출해야 하는 시기를 지정합니다. OR 함수는 이 매개 변수에 대해 두 개의 열거형으로 수행할 수 있습니다. WICProgressOperation 열거형은 디코딩(WICProgressOperationCopyPixels), 인코딩(WICProgerssOperationWritePixels) 또는 둘 다(WICProgressOperationAll) 중에 콜백 함수를 호출할지 여부를 지정합니다.

enum WICProgressOperation
{
   WICProgressOperationCopyPixels,
   WICProgerssOperationWritePixels,
   WICProgressOperationAll      
};

코덱은 작업 전체에서 정기적으로 콜백 함수를 호출해야 하지만 호출자는 특정 요구 사항을 지정할 수 있습니다. WICProgressNotification 열거형은 작업에서 콜백 함수를 호출할 시점을 나타냅니다. 호출자가 WICProgressNotificationBegin을 지정하는 경우 작업 시작 시 호출해야 합니다(0.0). 호출자가 이를 지정하지 않으면 선택 사항입니다. 마찬가지로 호출자가 WICProgerssNotificationEnd를 지정하는 경우 작업이 완료되면 호출해야 합니다(1.0). 호출자가 WICProgressNotificationAll을 지정하는 경우 작업 전체에서 정기적으로 뿐만 아니라 시작과 끝에서 호출해야 합니다. 호출자는 WICProgerssNotificationFrequent를 지정할 수도 있습니다. 이는 검사 줄이 몇 개 있을 때마다 잦은 간격으로 다시 호출되기를 원한다는 것을 나타냅니다. (호출자는 일반적으로 매우 큰 이미지에 대해서만 이 플래그를 사용합니다.) 그렇지 않으면 일반적으로 처리할 총 검사 줄 수의 약 10% 증분 간격으로 다시 호출해야 합니다.

enum WICProgressNotification
{
   WICProgressNotificationBegin,
   WICProgerssNotificationEnd,
   WICProgerssNotificationFrequent,
   WICProgressNotificationAll
};

특정 디코더 또는 인코더 instance 대해 한 번에 하나의 콜백 함수만 등록할 수 있습니다. 애플리케이션에서 RegisterProgressNotification 을 두 번 이상 호출하는 경우 이전에 등록된 콜백 함수를 새 콜백 함수로 바꿉다. 콜백 등록을 취소하기 위해 호출자는 pfnProgressNotification 매개 변수를 NULL로 설정합니다.

PFNProgressNotification

PFNProgressNotification 은 다음 서명이 있는 콜백 함수입니다.

typedef HRESULT (*PFNProgressNotification) ( 
   LPVOID pvData,
   ULONG uFrameNum,
   WICProgressOperation operation,
   double dblProgress );

콜백 함수를 호출할 때 pvData 매개 변수를 사용하여 애플리케이션이 콜백 함수를 등록할 때 지정한 것과 동일한 pvData 를 다시 전달합니다.

uFrameNum 매개 변수는 처리 중인 프레임의 인덱스여야 합니다.

디코딩할 때 작업 매개 변수를 WICProgressOperationCopyPixels 로 설정하고 인코딩할 때 WICProgressOperationWritePixels 를 설정합니다.

dblProgress 매개 변수는 0.0(작업의 시작)과 1.0(작업 완료) 사이의 숫자여야 합니다. 값은 처리할 총 검사 줄 수를 기준으로 이미 처리된 검사 줄의 비율을 반영해야 합니다.

참조

ProgressNotificationCallback

IWICBitmapCodecProgressNotification

개념

IWICBitmapDecoder 구현

IWICBitmapSource 구현

WIC-Enabled CODEC를 작성하는 방법

Windows 이미징 구성 요소 개요