다음을 통해 공유


IWICBitmapCodecProgressNotification 구현 방법(디코더)

IWICBitmapCodecProgressNotification

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

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

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

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

진행 알림 등록

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

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

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

enum WICProgressOperation
{
   WICProgressOperationCopyPixels,
   WICProgerssOperationWritePixels,
   WICProgressOperationAll      
};

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

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

특정 디코더 또는 인코더 인스턴스에 대해 한 번에 하나의 콜백 함수만 등록할 수 있습니다. 애플리케이션이 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 구현하기

CODEC WIC-Enabled 작성하는 방법

Windows 이미징 구성 요소 개요