점진적 디코딩 개요
이 항목에서는 점진적 디코딩과 애플리케이션에서 점진적 디코딩을 사용하는 방법을 소개합니다. 또한 점진적 디코딩을 지원하는 코덱을 만들기 위한 지침을 제공합니다.
이 항목에는 다음과 같은 섹션이 포함되어 있습니다.
- 소개
- 프로그레시브 디코딩이란?
- Windows 7의 점진적 디코딩 지원
- JPEG 프로그레시브 디코딩
- PNG/GIF 프로그레시브 디코딩
- 애플리케이션의 점진적 디코딩
- 점진적 디코딩에 대한 사용자 지정 코덱 지원
- 관련 항목
소개
점진적 디코딩은 전체 이미지 다운로드가 완료되기 전에 이미지의 일부를 증분 방식으로 디코딩하고 렌더링하는 기능을 제공합니다. 이 기능은 사용자가 디코딩을 시작하기 전에 전체 이미지가 다운로드될 때까지 기다릴 필요가 없으므로 인터넷에서 이미지를 볼 때 사용자의 환경을 크게 향상시킵니다. 사용자는 전체 이미지를 다운로드하기 훨씬 전에 사용 가능한 데이터가 있는 이미지 미리 보기를 볼 수 있습니다. 이 기능은 인터넷 또는 제한된 대역폭의 데이터 원본에서 이미지를 보는 데 사용되는 모든 애플리케이션에 필수적입니다.
Windows 7의 WIC(Windows 이미징 구성 요소)는 JPEG, PNG 및 GIF와 같은 인기 있는 이미지 형식의 점진적 디코딩을 지원합니다. WIC는 점진적 디코딩을 구현하는 모든 WIC 지원 비 Microsoft 코덱도 지원합니다. 프로그레시브 인코딩은 WIC의 현재 릴리스에서 지원되지 않습니다. 이 항목에서는 Windows 7의 점진적 디코딩과 애플리케이션에서 점진적 디코딩을 사용하도록 설정하는 절차를 간략하게 설명합니다.
프로그레시브 디코딩이란?
점진적 디코딩은 불완전한 이미지 파일에서 이미지 부분을 증분 방식으로 디코딩하는 기능입니다. 기존 디코딩을 사용하려면 디코딩을 시작하기 전에 전체 이미지 파일이 필요합니다. 점진적 디코딩은 점진적 수준의 이미지 다운로드가 완료된 후 시작됩니다. 디코더는 이미지의 현재 점진적 수준에서 디코딩 패스를 수행합니다. 그런 다음 각 점진적 수준이 다운로드될 때 이미지에서 여러 디코딩 패스를 수행합니다. 각 디코딩 패스는 이미지가 완전히 다운로드되고 디코딩될 때까지 더 많은 이미지를 표시합니다. 전체 이미지를 디코딩하는 데 필요한 패스 수는 이미지 파일 형식 및 이미지를 만드는 데 사용되는 인코딩 프로세스에 따라 달라집니다.
점진적 디코딩을 구현하려면 이미지를 특별히 인코딩해야 하지만 모든 이미지 형식이 지원하는 것은 아닙니다. 다음 목록에는 점진적 디코딩을 사용하기 위한 요구 사항이 요약되어 있습니다.
- 이미지 파일은 점진적 디코딩을 지원해야 합니다. 대부분의 이미지 형식은 점진적 디코딩을 지원하지 않지만 인기 있는 이미지 형식은 JPEG, PNG 및 GIF입니다.
- 이미지 파일은 점진적 이미지로 인코딩되어야 합니다. 점진적 이미지 인코딩을 사용하여 만들지 않은 이미지 파일은 파일 형식이 지원되지 않는 경우에도 점진적 디코딩을 구현할 수 없습니다.
- 점진적 디코딩을 지원하는 코덱을 사용할 수 있어야 합니다. 코덱이 점진적 디코딩을 지원하지 않는 경우 점진적 이미지로 인코딩된 이미지는 기존 이미지로 디코딩됩니다.
Windows 7의 점진적 디코딩 지원
Windows 7은 JPEG, PNG 및 GIF 이미지 형식에 대한 점진적 디코딩을 지원하는 기본 제공 코덱을 제공합니다. 이러한 각 Windows 7 코덱은 이미지에서 여러 디코딩 패스를 수행합니다. 각 패스는 디코딩된 이미지의 특정 수준 및 부분에 해당하며 결국에는 완전히 디코딩된 이미지로 이어집니다.
각 이미지 형식은 다른 방식으로 점진적 디코딩을 처리합니다. 다음 표에서는 프로그레시브 수준 수와 Windows 7 프로그레시브 디코딩 형식에서 지원하는 디코딩 메서드에 대한 정보를 제공합니다.
이미지 형식 | 지원되는 점진적 수준 수 | 프로그레시브 디코딩 메서드 |
---|---|---|
JPEG | 이미지로 정의됨 | 해상도 증가 |
PNG | 7 | 인터레이스 |
GIF | 4 | 인터레이스 |
또한 프로그레시브 인터페이스 및 메서드에 대한 지원을 제공하여 코덱에서 프로그레시브 디코딩을 구현할 수 있습니다. 코덱에서 점진적 디코딩이 지원되지 않는 경우 이러한 메서드가 호출되면 적절한 오류 메시지가 반환되어야 합니다.
JPEG 프로그레시브 디코딩
JPEG 점진적 디코딩은 전체 해상도 이미지를 사용할 수 있게 될 때까지 각 수준에서 점점 더 높은 해상도로 이미지 데이터를 제공합니다. 이미지의 각 수준은 다른 해상도 수준을 제공하도록 설정됩니다. 더 점진적인 수준을 사용할 수 있게 되면 전체 해상도 이미지가 확인될 때까지 이미지가 더 높은 해상도로 표시됩니다.
사용 가능한 수준 수와 각 수준에서 설정된 해상도는 전적으로 인코딩된 JPEG에 따라 달라집니다. 다음 두 이미지는 두 개의 점진적 수준에서 JPEG 프로그레시브 디코딩의 예를 보여 줍니다.
왼쪽의 이미지는 점진적 수준 0에서 디코딩됩니다. 오른쪽의 이미지는 5개의 점진적 수준 후에 완전히 디코딩됩니다.
PNG/GIF 프로그레시브 디코딩
PNG 및 GIF 프로그레시브 디코딩 모두 인터레이스 프로그레시브 디코딩 메서드를 사용합니다. 두 형식의 디코딩 프로세스는 매우 유사합니다.
PNG 프로그레시브 디코딩
PNG 이미지 파일은 PNG 사양에 설명된 대로 디코딩을 위한 7가지 점진적 수준을 제공합니다. PNG 프로그레시브 디코딩은 디코더의 각 패스에서 지정된 픽셀 패턴을 디코딩하여 구현됩니다. PNG 사양의 다음 표에 있는 패턴은 전체 이미지에 복제됩니다. 각 숫자는 해당 픽셀을 디코딩할 점진적 수준을 나타냅니다.
1 | 6 | 4 | 6 | 2 | 6 | 4 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
3 | 6 | 4 | 6 | 3 | 6 | 4 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
위의 표에서 디코더의 각 패스로 디코딩할 픽셀을 확인할 수 있습니다. Windows 7 GIF 코덱과 달리 Windows 7 PNG 코덱은 빈 픽셀을 채우기 위해 스캔 줄에서 가장 왼쪽에 사용 가능한 픽셀을 복제합니다.
다음 이미지는 세 가지 점진적 수준에서 Windows 7 PNG 프로그레시브 디코딩 코덱의 예를 보여 줍니다.
왼쪽 위에 있는 이미지는 프로그레시브 수준 0에서 디코딩된 PNG 이미지를 보여줍니다. 오른쪽 위 이미지는 프로그레시브 수준 3에서 디코딩된 동일한 PNG 이미지를 보여줍니다. 아래쪽 이미지는 7개 점진적 수준 이후에 완전히 디코딩된 동일한 이미지를 보여줍니다.
GIF 프로그레시브 디코딩
GIF 이미지 파일은 GIF 사양에 설명된 대로 디코딩을 위한 4가지 점진적 수준을 제공합니다. 각 패스는 이미지 내의 특정 행을 채우고 네 번째 패스 후에 전체 이미지를 생성합니다. GIF 사양의 다음 표에서는 디코더의 각 패스에 의해 디코딩되는 검사 줄을 보여 있습니다.
수준 번호/패스 번호 | 스캔 줄이 채워져 있습니다. | 검사 줄 시작 |
---|---|---|
1 | 8번째 검사 줄마다 | 0 |
2 | 8번째 검사 줄마다 | 4 |
3 | 네 번째 검사 줄마다 | 2 |
4 | 매초 검사 줄 | 1 |
코덱은 특정 수준에서 빈 픽셀의 콘텐츠를 지정할 수 있지만 Windows GIF 코덱은 빈 검색 줄 위에 채워진 검사 줄을 복제하여 빈 검색 줄을 채웁니다.
애플리케이션에서 프로그레시브 디코딩
기본 프로그레시브 디코딩 인터페이스는 IWICProgressiveLevelControl 인터페이스입니다. 인터페이스에 대한 참조를 가져오려면 IWICProgressiveLevelControl에 대한 이미지 프레임(IWICBitmapFrameDecode)을 쿼리합니다. 그런 다음 프로그레시브 메서드는 인터페이스에서 액세스할 수 있습니다.
아래 코드는 애플리케이션에서 점진적 디코딩을 사용하는 예제를 제공합니다.
IWICProgressiveLevelControl *pProgressive = NULL;
HRESULT hr = (pBitmapFrame->QueryInterface(
IID_IWICProgressiveLevelControl,
(void**) &pProgressive));
if (SUCCEEDED(hr))
{
for (UINT uCurrentLevel = 0; SUCCEEDED(hr); uCurrentLevel++)
{
hr = pProgressive->SetCurrentLevel(uCurrentLevel);
if (WINCODEC_ERR_INVALIDPROGRESSIVELEVEL == hr)
{
// No more levels
break;
}
if (SUCCEEDED(hr))
{
// Output the current level
hr = pBitmapFrame->CopyPixels(...);
}
}
}
if (pProgressive)
{
pProgressive->Release();
}
위의 코드는 대부분의 애플리케이션에서 점진적 디코딩을 구현하는 데 필요한 기본 기능을 제공합니다. 코드를 사용하면 이미지 픽셀 데이터를 사용할 수 있게 되면 점진적 수준에 액세스할 수 있습니다. SetCurrentLevel 함수는 요청되는 수준을 사용할 수 있게 될 때까지 실행을 차단합니다.
프로그레시브 디코딩에 대한 사용자 지정 코덱 지원
코덱 개발자는 이미지 형식이 점진적 디코딩을 지원하는 경우 IWICProgressiveLevelControl 을 구현하도록 선택할 수 있습니다. 점진적 디코딩에 대한 지원은 WIC의 검색 및 중재를 위한 요구 사항이 아닙니다. 그러나 점진적 디코딩은 사용자 환경을 크게 향상시키며 가능한 경우 구현을 고려해야 합니다.
관련 항목
-
개념
-
기타 리소스