HD 照片格式概述

本主题介绍可通过 Windows 映像组件 (WIC) 使用的本机(内置)HD 照片编解码器。

重要

HD 照片格式是 JPEG XR 格式的预标准实现,对 HD 照片的支持由 JPEG XR WIC 编解码器实现。 有关详细信息,请参阅 JPEG XR 编解码器概述

编解码器标识

下表提供了编解码器标识信息。

组件 说明
正式名称 HD 照片、Windows 媒体照片
文件扩展名 wdp
MIME 类型 (MIME type) image/vnd.ms-photo
文件签名 前四个字节:0x4949bc00(版本 0;预发行),0x4949bc01(版本 1.0)

下表列出了用于标识本机 HD 照片编解码器组件的 GUID。

组件 友好名称 GUID
容器格式 GUID_ContainerFormatWmp 57a37caa-367a-4540-916bf183c5093a4b
解码器 CLSID_WICWmpDecoder a26cec36-234c-4950-ae16e34aace71d0d
编码器 CLSID_WICWmpEncoder ac4ce3cb-e1c1-44cd-82155a1665509ec2

编码

WIC 编码 API 独立于编解码器,支持 WIC 的编解码器的图像编码本质上是一样的。 有关使用 WIC API 进行图像编码的详细信息,请参阅编码概述

编码器选项

支持 WIC 的编解码器在编码选项级别有所不同。 编码器选项反映了图像编码器的功能,每个本机编解码器都支持一组编码器选项。 编码器选项可以是所有支持 WIC 的代码都可以使用的 WIC 支持的选项(尽管不一定支持),也可以是由图像格式编解码器设计的编解码器特定选项。 为了在编码过程中管理这些编码选项,WIC 使用 IPropertyBag2 接口。 有关将 IPropertyBag2 接口用于 WIC 编码的详细信息,请参阅编码概述

HD 照片编解码器既使用基本 WIC 选项,也提供多个特定于 HD 照片的编码选项。 下表列出了本机 HD 照片编解码器支持的编码器选项。

基本 WIC 编码器选项

属性名称 VARTYPE 值范围 默认值
ImageQuality VT_R4 0 - 1.0 0.9
Lossless VT_BOOL TRUEFALSE FALSE
BitmapTransform VT_UI1 WICBitmapTransformOptions WICBitmapTransformRotate0

特定于 HD 照片的编码器选项

属性名称 VARTYPE 值范围 默认值
UseCodecOptions VT_BOOL TRUEFALSE FALSE
质量 VT_UI1 1 - 255 10
Overlap VT_UI1 0 - 2 1
Subsampling VT_UI1 0 - 3 如果 ImageQuality > 0.8,为 3;否则为 1;
HorizontalTileSlices VT_UI2 0 - 4095 (图像宽度 – 1)>> 8
VerticalTileSlices VT_UI2 0 - 4095 (图像高度 – 1)>> 8
FrequencyOrder VT_BOOL TRUEFALSE TRUE
InterleavedAlpha VT_BOOL TRUEFALSE FALSE
AlphaQuality VT_UI1 1 - 255 1
CompressedDomainTranscode VT_BOOL TRUEFALSE TRUE
ImageDataDiscard VT_UI1 0 - 3 0
AlphaDataDiscard VT_UI1 0 -4 未使用。
IgnoreOverlap VT_BOOL TRUEFALSE FALSE

如果 IPropertyBag2 选项列表中存在编解码器不支持的编码器选项,会忽略该选项。

ImageQuality 选项

指定所需的图像逼真度。 0.0 表示可能的最低逼真度,1.0 表示最高逼真度。 对于 HD 照片图像格式,值 1.0 可实现数学层面的无损压缩。

默认值为 0.9。

CompressionQuality 选项

指定所需的压缩质量。 0.0 表示可用的高效压缩方法。 通常此方法编码速度较快但输出较大。 值 1.0 表示可用的最高效的压缩方法,该方法通常编码速度较慢但输出较小。

HD 照片不支持此编码器选项。 如果 IPropertyBag2 参数列表中存在此值,会忽略此值。

Lossless 选项

指定是否使用损失压缩模式。 对于 HD 照片图像格式,此值将替代 ImageQuality 选项值。

默认值为 FALSE

BitmapTransform 选项

指定在图像解码过程中图像的转换方式。 必须将此选项设置为 WICBitmapTransformOptions 枚举值之一。

默认值为 WICBitmapTransformOptions::WICBitmapTransformRotate0

UseCodecOptions 选项

如果值为 VARIANT_TRUE,则使用 QualityOverlapSubsampling 选项,而不是该选项值。

默认值为 FALSE

Quality 选项

指定图像的压缩质量。 值为 1 表示无损模式。 增加此值会得到更高的压缩率和更低的图像质量。

默认值为 10。

Overlap 选项

指定重叠处理的级别。

下表列出了可用的重叠处理级别。

说明
0 未启用重叠处理。
1 启用了一个级别的重叠处理,会根据相邻块的值修改 4x4 块的编码值。
2 启用了两个级别的重叠处理。 除了第一级处理外,还会根据相邻宏块的值修改 16x16 宏块的编码值。

默认值为 1。

Subsampling 选项

指定色度空间中的其他压缩。 通过这种方式,可以保留亮度细节,但以颜色细节为代价。 此选项仅适用于 RGB 图像。

下表列出了可用的 subsampling 选项。

说明
3 4:4:4 编码保留完整的色度分辨率。
2 4:2:2 编码将色度分辨率降低到亮度分辨率的 1/2。
1 4:2:0 编码将色度分辨率降低到亮度分辨率的 1/4。
0 4:0:0 编码会丢弃所有色度内容,仅保留亮度。 由于编解码器使用略有修改的亮度定义来提高性能,因此建议在编码之前将 RGB 图像转换为单色,而不是使用此色度子采样模式。

如果 ImageQuality> 0.8,则默认值为 3;否则为 1。

HorizontalTileSlices、VerticalTileSlices 选项

在执行压缩编码以实现最优区域解码性能之前,指定图像的水平和垂直分区。 通过在编码过程中将图像划分为矩形图块,可以对图像中的区域进行解码,而无需处理整个压缩数据流。 默认值 0 表示无分区,将整个图像视为一个图块。 每个参数的值为 1 会创建一个水平和一个垂直划分,从而将图像有效划分为四个大小相等的图块。 每个参数的最大值为 4095,会将图像划分为 4096 个图块行,每行 4096 个图块。 换句话说,参数值等于水平和垂直图块数(分别)减 1。 图块的宽度或高度永远不能小于 16 像素,因此 HD 照片编码器可以调整此参数以保持所需的最小图块大小。 由于每个图块都有相关的存储和处理开销,因此应谨慎选择这些值以满足特定方案。

HorizontalTileSlices:默认值为(图像宽度 – 1)>> 8。

VerticalTileSlices:默认值为(图像高度 – 1)>> 8。

FrequencyOrder 选项

指定图像必须按频率顺序进行编码。 最低频率的数据会先在文件中出现,图像内容按频率而非空间方向进行分组。 按频率顺序组织文件可使任何基于频率的解码实现最优性能,因此建议使用此方式。 HD 照片编码器的设备实现可按空间顺序组织文件,由此可减少编码期间所需的内存占用量。

其默认值为 TRUE,建议应用程序和设备始终使用频率顺序,除非出于性能或应用程序的考虑需要使用空间顺序。

InterleavedAlpha 选项

将此选项设置为 TRUE 指示编解码器将 alpha 通道信息编码为额外的交错通道,且与图像内容通道无关联。 当需要在流式处理方案中在解码图像的同时解码 alpha 时,此模式非常有用。

将此参数设置为 FALSE 会生成一个平面 alpha 通道,并编码为具有自己的可选质量值的独立图像。 通过使用平面 alpha 通道,可以分别单独解码图像数据和 alpha 通道。 仅某些 RGB 像素格式支持交错 alpha 通道。 可以将平面 alpha 通道与任何定义了 alpha 通道的图像格式关联。

默认值为 FALSE

AlphaQuality 选项

指定平面 alpha 通道图像的压缩质量。 值 1 设置无损失模式。 增加此值会得到更高的压缩率和更低的图像质量。

默认值为 1。

CompressedDomainTranscode 选项

通过使用 HD 照片,无需实际解码压缩数据再重新编码为目标文件即可执行许多文件转换操作。 压缩域操作非常高效,并可避免在解码压缩图像然后再重新编码有损压缩图像时出现的任何额外质量损失。

支持以下压缩域操作:

  • 裁剪图像的一个区域。
  • 执行旋转/翻转转换。
  • 丢弃频率数据(使创建更小图像文件成为可能)。
  • 按空间顺序或频率顺序重新组织图像。

HD 照片编码器使用 HD 照片解码器作为图像源,在编码 HD 照片图像时执行压缩域转码操作。 根据所选的编码选项,编解码器会尽可能使用压缩域操作。 如果应用程序选择显式禁止任何压缩域转码操作,应将 UseCodecOptions 选项设置为 TRUE,将 CompressedDomainTranscode 选项设置为 FALSE

编解码器执行压缩域操作时,仅支持特定编码器参数和属性设置。

其默认值为 TRUE,建议应用程序和设备始终使用频率顺序,除非有需要使用空间顺序的特定性能或应用程序原因。

ImageDataDiscard 选项

仅当 CompressedDomainTranscode 选项为 TRUE 时,此参数才有效;否则会忽略它。 ImageDataDiscard 指定要在压缩域转码过程中丢弃的图像数据量。 如果图像包含交错的 alpha 通道,则数据丢弃也适用于 alpha 通道,本部分后面所述的情况除外。

允许以下值。

说明
0 不丢弃任何图像频率数据。
1 将丢弃 FlexBit,在不更改图像的有效分辨率的情况下随机降低转码图像的质量。 文件大小或质量具体减少多少取决于一系列因素,无法指定或预测。 如果为交错的 alpha 通道指定此值,会返回错误。
2 会丢弃 HighPass 频率数据带(还包括 FlexBit),将两个维度上的转码图像分辨率有效降低 4 倍。 转码图像的实际尺寸保持不变,但其中每个 4x4 像素块丢失了所有细节。 因此每当对转码图像进行解码时,都应相应对其进行向下采样。
3 HighPass 和 LowPass 频率数据带都将被丢弃(也包括 FlexBit),将两个维度上的转码图像分辨率有效降低 16 倍。 转码图像的实际尺寸保持不变,但其中每个 16x16 像素块丢失了所有细节。 因此每当对转码图像进行解码时,都应相应对其进行向下采样。

默认值为 0。

AlphaDataDiscard 选项

仅当 CompressedDomainTranscode 属性为 TRUE 且图像包含平面或交错的 alpha 通道时,此选项才有效;否则会忽略它。 它指定要在压缩域转码过程中丢弃的 alpha 频率数据量。 平面 alpha 通道允许以下值。

说明
0 不丢弃任何图像频率数据。
1 将丢弃 FlexBit,在不更改有效分辨率的情况下随机降低转码图像的平面 alpha 通道的质量。 文件大小或质量具体减少多少取决于一系列因素,无法指定或预测。
2 会丢弃 HighPass 频率数据带(还包括 FlexBit),将两个维度上的转码图像平面 alpha 通道分辨率有效降低 4 倍。 转码图像的实际尺寸保持不变,但图像的每个 4x4 像素块中会丢失平面 alpha 通道的所有细节。 因此每当对转码图像进行解码时,都应相应对其进行向下采样。 通常,仅当将 ImageDataDiscard 属性设置为相同的值时,才应设置此值。
3 HighPass 和 LowPass 频率数据带都将被丢弃(也包括 FlexBit),将两个维度上的转码图像分辨率有效降低 16 倍。 转码图像的实际尺寸保持不变,但图像的每个 16x16 像素块丢失了所有细节。 因此每当对转码图像进行解码时,都应相应对其进行向下采样。 通常,仅当将 ImageDataDiscard 属性设置为相同的值时,才应设置此值。
4 彻底丢弃 Alpha 通道。 转码图像的像素格式会更改以反映 alpha 通道的删除。

对于包含交错 alpha 通道的图像,除非此属性设置为 4,否则根据 ImageDataDiscard 属性的值按图像数据的处理方式处理 alpha 通道。 如果此属性设置为 4,将完全丢弃交错的 alpha 通道,并相应更改转码图像的像素格式。

无默认值。

IgnoreOverlap 选项

仅当 CompressedDomainTranscode 属性为 TRUE 且明确请求了一个或多个图块的子区域转码时,此选项才有效。 区域转码(或解码)的默认操作是扩展请求的区域,以包括区域边缘重叠解码所需的周围像素。 当此参数设置为 TRUE 时,将忽略周围像素,仅提取所选图块。 同样,这要求请求的区域与一个或多个图块的坐标完全匹配。 如果源图像未分区或请求的区域指定了部分图块,会忽略此参数。

默认值为 FALSE

解码

WIC 解码 API 独立于编解码器,支持 WIC 的编解码器的图像解码本质上是一样的。 有关图像解码的详细信息,请参阅解码概述。 有关使用解码图像数据的详细信息,请参阅位图源概述

IWICBitmapSourceTransform 支持

除了支持 WIC 的编解码器所需的接口外,本机 HD 照片解码器还支持 IWICBitmapSourceTransformIWICBitmapSourceTransform 接口提供用于解码图像位流的高级选项。 IWICBitmapSourceTransform 接口启用以下解码器选项,而不是仅使用 IWICBitmapFrameDecode 返回完整图像。

  • 对图像的矩形子区域进行解码。
  • 解码为较低分辨率
  • 解码为其他像素格式
  • 解码时执行转换(旋转/翻转)

本机 HD 照片编解码器为 IWICBitmapSourceTransform 接口提供以下级别的支持。

DoesSupportTransform

本机实现支持所有 WICBitmapTransformOptions 转换。

GetClosestSize

如果请求的大小小于两个维度中源图像维度的 1/2,HD 照片会返回下一个最大的整数大小的图像且该大小可被二整除。 对于请求的所有其他大小,HD 照片返回原始图像尺寸。

GetClosestPixelFormat

HD 照片返回编码图像的像素格式。

CopyPixels

HD Photo 接受 WICRect 参数指定的任何请求的区域,并返回图像的相应部分。

uiWidthuiHeight 参数必须指定 GetClosestSize 函数返回的维度。 任何其他值会返回错误。

pguidDstFormat 参数必须指定 GetClosestPixelFormat 函数返回的像素格式。 任何其他值会返回错误。

HD Photo 接受 dstTransform 参数允许的任何值。 请注意,WIC 允许的此参数值不同于 HD Photo 用于转换元数据标记的值。