다음을 통해 공유


IWICBitmapSourceTransform 구현

IWICBitmapSourceTransform

선택 사항이지만 모든 디코더는 주요 성능 이점을 제공할 수 있으므로 프레임 수준 디코딩 클래스에서 이 인터페이스를 구현하는 것이 좋습니다. 애플리케이션이 전체 해상도에서 전체 이미지를 디코딩한 다음 요청된 변환을 적용하는 대신 특정 관심 영역, 크기, 방향 또는 픽셀 형식을 요청하면 WIC(Windows 이미징 구성 요소)는 IWICBitmapFrameDecode 개체에서 이 인터페이스에 대해 IUnknown::QueryInterface를 호출합니다. 프레임 디코더가 이를 지원하는 경우 WIC는 적절한 메서드 또는 메서드를 호출하여 프레임 디코더가 요청된 변환을 수행할 수 있는지 또는 디코더가 요청한 변환에 제공할 수 있는 가장 가까운 크기 또는 픽셀 형식을 결정할 수 있는지 확인합니다. 디코더가 요청된 변환 또는 변환을 수행할 수 있는 경우 WIC는 적절한 매개 변수를 사용하여 CopyPixels 를 호출합니다. 디코더가 일부 작업을 수행할 수 있는 경우 하지만 요청된 모든 변환이 아닌 WIC는 디코더에 가능한 변환을 수행하도록 요청하고 WIC 변환 개체(IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotatorIWICFormatConverter)를 사용하여 CopyPixels 호출의 결과로 프레임 디코더가 수행할 수 없는 나머지 변환을 수행합니다. 디코더가 IWICBitmapSourceTransform을 지원하지 않는 경우 WIC는 변환 개체를 사용하여 모든 변환을 수행해야 합니다. 일반적으로 디코더가 디코딩 프로세스 중에 변환을 수행하는 것이 전체 이미지를 디코딩한 다음 변환을 수행하는 것보다 훨씬 효율적입니다. 크기가 훨씬 작거나 픽셀 형식 변환으로 스케일링하는 등의 작업에 특히 그렇습니다.

interface IWICBitmapSourceTransform : IUnknown
{
   // Required methods
   HRESULT DoesSupportTransform ( WICTransformOptions dstTransform,
              BOOL *pfIsSupported);
   HRESULT CopyPixels ( WICRect *prcSrc, 
      UINT uiWidth, 
      UINT uiHeight,
      WICPixelFormatGUID * pguidDstFormat,
      WICBitmapTransformOptions dstTransform, 
      UINT nStride, 
      UINT cbBufferSize, 
      BYTE *pbBuffer );

   // Optional methods
   HRESULT GetClosestSize ( UINT *puiWidth,
              UINT *puiHeight);
   HRESULT GetClosestPixelFormat ( WICPixelFormatGUID *pguidDstFormat);
}

DoesSupportTransform

DoesSupportTransform 은 디코더가 요청된 회전 또는 대칭 이동 작업을 지원하는지 여부를 묻습니다. 요청될 수 있는 WICBitmapTransformOptions 는 다음과 같습니다.

enum WICBitmapTransformOptions
{   
   WICBitmapTransformRotate0,
   WICBitmapTransformRotate90,
   WICBitmapTransformRotate180,
   WICBitmapTransformRotate270,
   WICBitmapTransformFlipHorizontal,
   WICBitmapTransformFlipVertical
}

CopyPixels

CopyPixelsIWICBitmapSource 인터페이스의 CopyPixels 메서드와 같은 이미지 비트를 디코딩하는 실제 작업을 수행하지만 IWICBitmapSourceTransformCopyPixels 메서드는 훨씬 더 강력하며 이미지 처리 성능을 크게 향상시킬 수 있습니다.

여러 변환 작업이 요청되면 결과는 작업이 수행되는 순서에 따라 달라집니다. 코덱 전체에서 예측 가능성과 일관성을 보장하려면 모든 코덱이 동일한 순서로 이러한 작업을 수행하는 것이 중요합니다. 이러한 작업을 수행하기 위한 정식 순서입니다.

  1. 확장
  2. Crop
  3. 회전

픽셀 형식 변환은 다른 변환에 영향을 주지 않으므로 언제든지 수행할 수 있습니다.

첫 번째 매개 변수 인 prcSrc는 이미지를 클리핑할 관심 영역을 지정하는 데 사용됩니다. 크기 조정은 규칙에 따라 클리핑하기 전에 수행되므로 이미지를 크기 조정하고 잘리는 경우 이미지 크기 조정 후 관심 영역을 결정해야 합니다.

두 번째 및 세 번째 매개 변수는 이미지 크기를 조정할 크기를 나타냅니다.

pguidDstFormat 매개 변수는 디코딩된 이미지에 대해 요청된 픽셀 형식을 나타냅니다. WIC는 이미 GetClosestPixelFormat을 호출했기 때문에 디코더가 지원한다고 표시한 픽셀 형식이어야 합니다.

dstTransform 매개 변수는 요청된 회전 각도와 이미지를 세로, 가로 또는 둘 다 대칭 이동할지 여부를 나타냅니다. 다시 말하지만, WIC는 이미 DoesSupportTransform을 호출했으므로 요청된 변환은 디코더가 이미 지원한다고 표시한 변환이어야 합니다. 크기 조정 및 클리핑 후에는 항상 회전을 수행해야 합니다.

GetClosestSize

GetClosestSize 는 두 개의 in/out 매개 변수를 사용합니다. 호출자는 puiWidthpuiHeight 매개 변수를 사용하여 호출자가 이미지를 디코딩하는 것을 선호하는 크기를 지정합니다. 그러나 디코더는 이미지를 DCT 크기의 배수인 크기로만 디코딩할 수 있으며 다른 이미지 형식은 서로 다른 DCT 크기를 가질 수 있습니다. 디코더는 자체 DCT 크기에 따라 요청된 크기에 가장 가까운 크기를 결정하고 반환 시 puiWidthpuiHeight 를 해당 차원으로 설정해야 합니다. 더 큰 크기가 요청되었지만 코덱이 업스케일링을 지원하지 않는 경우 원래 가 반환되어야 합니다.

GetClosestPixelFormat

GetClosestPixelFormat 은 디코더가 데이터 손실 없이 제공할 수 있는 요청된 픽셀 형식과 가장 가까운 픽셀 형식을 결정하는 데 사용됩니다. 필요한 경우 항상 더 제한적인 형식으로 다시 변환할 수 있으므로 이미지의 크기가 증가하더라도 더 좁은 픽셀 형식보다 더 넓은 픽셀 형식으로 변환하는 것이 좋습니다. 그러나 데이터가 손실된 후에는 복구할 수 없습니다.

계속 읽기

WIC 사용 코덱을 만드는 방법에 대한 자세한 내용은 IWICDevelopRaw 구현을 참조하세요.

참조

IWICBitmapSourceTransform

IWICMetadataBlockReader

개념

IWICMetadataBlockReader 구현

IWICDevelopRaw 구현

WIC-Enabled CODEC를 작성하는 방법

Windows 이미징 구성 요소 개요