渐进式解码概述
本主题介绍渐进式解码以及如何在应用程序中使用渐进式解码。 它还提供了创建支持渐进式解码的编解码器的指南。
本主题包含以下各节:
简介
渐进式解码提供在整个图像完成下载之前以增量方式解码和呈现图像部分的功能。 此功能极大地改进了用户从 Internet 查看图像时的体验,因为用户无需等待整个图像下载即可开始解码。 在下载整个图像之前很久,用户就可以看到包含可用数据的图像预览。 此功能对于用于从 Internet 或带宽受限的数据源查看图像的任何应用程序都是必不可少的。
Windows 7 中的 Windows 图像处理组件 (WIC) 支持对 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 进行解码。 右侧的图像在五个渐进级别后完全解码。
PNG/GIF 渐进式解码
PNG 和 GIF 渐进式解码都使用交错渐进解码方法。 这两种格式的解码过程非常相似。
PNG 渐进式解码
PNG 图像文件提供七个渐进式解码级别,如 PNG 规范中所述。 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 规范中所述。 每次传递都会填充图像中的某些行,并在第四次传递后生成完整映像。 GIF 规范中的下表显示了每一次解码器对哪些扫描行进行解码。
级别编号/传递编号 | 扫描填充的行 | 开始扫描行 |
---|---|---|
1 | 每八个扫描行 | 0 |
2 | 每八个扫描行 | 4 |
3 | 每四个扫描行 | 2 |
4 | 每秒扫描一行 | 1 |
尽管编解码器可以在任何特定级别指定空像素的内容,但 Windows GIF 编解码器通过复制空扫描行上方的填充扫描行来填充空扫描行。
应用程序中的渐进式解码
main渐进式解码接口是 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 发现和仲裁的要求。 但是,渐进式解码极大地增强了用户体验,如果可能,应考虑实现。
相关主题
-
概念性
-
其他资源