HD 照片格式概述
本主题提供有关通过WINDOWS映像组件 (WIC) 提供的本机 HD 照片编解码器的信息。
重要
HD 照片格式是 JPEG XR 格式的预先标准实现。 JPEG XR 格式已在 Windows 8 中完全实现。 有关详细信息,请参阅 JPEG XR 编解码器概述 。
本主题包含以下各节:
编解码器标识
下表提供编解码器标识信息。
组件 | 说明 |
---|---|
正式名称 (s) | HD 照片,Windows媒体照片 |
文件扩展名 (s) | 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 |
无损 | VT_BOOL | TRUE、 FALSE | FALSE |
BitmapTransform | VT_UI1 | WICBitmapTransformOptions | WICBitmapTransformRotate0 |
HD 照片特定的编码器选项
属性名称 | VARTYPE | 值范围 | 默认值 |
---|---|---|---|
UseCodecOptions | VT_BOOL | TRUE、 FALSE | FALSE |
质量 | VT_UI1 | 1 - 255 | 10 |
重叠 | VT_UI1 | 0 - 2 | 1 |
子采样 | 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 | TRUE、 FALSE | TRUE |
InterleavedAlpha | VT_BOOL | TRUE、 FALSE | FALSE |
AlphaQuality | VT_UI1 | 1 - 255 | 1 |
CompressedDomainTranscode | VT_BOOL | TRUE、 FALSE | TRUE |
ImageDataDiscard | VT_UI1 | 0 - 3 | 0 |
AlphaDataDiscard | VT_UI1 | 0 - 4 | 未使用。 |
IgnoreOverlap | VT_BOOL | TRUE、 FALSE | FALSE |
如果编解码器不支持的 IPropertyBag2 选项列表中存在编码器选项,则忽略该选项。
ImageQuality 选项
指定所需的图像保真度。 0.0 表示尽可能低的保真度,1.0 指定最高保真度。 对于 HD 照片图像格式,1.0 值会导致数学上的无损失压缩。
默认值为 0.9。
CompressionQuality 选项
指定所需的压缩质量。 0.0 表示可用的高效压缩架构。 通常,此架构生成更快的编码但更大的输出。 值 1.0 指定可用的最有效的压缩架构,通常生成更长的编码,但输出较小。
HD 照片不支持此编码器选项。 如果 IPropertyBag2 参数列表中存在,则忽略此值。
无损失选项
指定是否使用损失压缩模式。 对于 HD 照片图像格式,此值将替代 ImageQuality 选项值。
默认值为 FALSE。
BitmapTransform 选项
指定图像解码过程中图像的转换方式。 必须将此选项设置为 WICBitmapTransformOptions 枚举值之一。
默认值为 WICBitmapTransformOptions::WICBitmapTransformRotate0。
UseCodecOptions 选项
如果值VARIANT_TRUE 质量、 重叠和 子采样 选项,而不是选项值。
默认值为 FALSE。
质量选项
指定图像的压缩质量。 值为 1 表示无损失模式。 增加值会导致压缩率较高,图像质量降低。
默认值为 10。
重叠选项
指定重叠处理级别。
下表列出了可用的重叠处理级别。
值 | 说明 |
---|---|
0 | 未启用重叠处理。 |
1 | 启用了一级重叠处理,根据相邻块的值修改 4x4 块编码的值。 |
2 | 启用重叠处理的两个级别。 除了第一级处理,16x16 宏块的编码值还根据相邻宏块的值进行修改。 |
默认值为 1。
子采样选项
指定色度空间中的其他压缩。 这样,就可以以牺牲颜色细节为代价保留亮度细节。 此选项仅适用于 RGB 图像。
下表列出了可用的子采样选项。
值 | 说明 |
---|---|
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 Photo,可以执行许多文件转换操作,而无需实际解码压缩数据并将其重新编码到目标文件。 压缩域操作非常高效,避免在解码和重新编码丢失压缩图像时的典型任何其他质量损失。
支持以下压缩域操作:
- 裁剪图像的区域。
- 执行旋转/翻转转换。
- 放弃频率数据 (以便创建较小的映像文件。)
- 在空间顺序和频率顺序之间重新组织图像。
HD 照片编码器使用 HD 照片解码器作为图像源对 HD 照片图像进行编码时,执行压缩域转码操作。 根据所选的编码选项,编解码器尽可能使用压缩的域操作。 如果应用程序选择显式禁止任何压缩域转码操作,则应将 UseCodecOptions 选项设置为 TRUE ,并将 CompressedDomainTranscode 选项设置为 FALSE。
当编解码器执行压缩域操作时,仅允许某些编码器参数和属性设置。
- 将忽略基本编码器选项 ImageQuality、 CompressionQuality 和 Lossless 。
- 忽略 HD 照片特定的编码器选项 质量、 重叠、 交错Alpha 和 AlphaQuality 。
- 如果存在,则 HorizontalTileSlices 和 VerticalTileSlices 选项必须设置为零。 图像的磁贴大小不能作为压缩域转码的一部分更改。
- 可以通过指定 FrequencyOrdering 选项的相应值,在频率和空间排序之间更改图像组织。
- 可以根据 BitmapTransform 编码器选项中指定的值执行基数旋转和/或水平/垂直翻转操作。
- 可以使用 WriteSource 编码器方法的 WICRect 参数指定所需区域来裁剪图像。
- 可以通过在 ImageDataDiscard 和/或 AlphaDataDiscard 选项中指定适当的值来放弃图像和/或 alphaDataDiscard 数据,从而减少编码的文件大小,并有效地减少新图像的分辨率。
默认值为 TRUE ,我们建议应用程序和设备始终使用频率顺序,除非你具有使用空间顺序的特定性能或应用程序原因。
ImageDataDiscard 选项
仅当 CompressedDomainTranscode 选项为 TRUE 时,此参数才有效;否则会忽略它。 ImageDataDiscard 指定要在压缩域转码过程中丢弃的图像数据量。 如果图像包含交错 alpha 通道,则此数据放弃也适用于 alpha 通道,但本节后面部分所述的例外。
允许以下值。
值 | 说明 |
---|---|
0 | 无图像频率数据丢弃。 |
1 | 将丢弃 FlexBits,从而任意减少转码图像的质量,而无需更改图像的有效分辨率。 确切的文件大小减少或特定质量降低取决于许多因素,不能指定或预测。 如果为交错 alpha 通道指定了错误,则此值将返回错误。 |
2 | HighPass 频率数据带被丢弃 (,还包括 FlexBits) ,从而有效减少了两维中 4 的转码图像分辨率。 转码图像的实际尺寸保持不变,但它在每个 4x4 像素块中丢失所有细节。 因此,每当解码该图像时,应相应地对转码图像进行向下采样。 |
3 | HighPass 和 LowPass 频率数据带都将被丢弃 (,这也包括 FlexBits) ,从而有效地减少了两个维度中 16 的转码图像分辨率。 转码图像的实际尺寸保持不变,但它会丢失每个 16x16 像素宏块中的所有详细信息。 因此,每当解码该图像时,应相应地对转码图像进行向下采样。 |
默认值为 0。
AlphaDataDiscard 选项
仅当 CompressedDomainTranscode 属性为 TRUE 且图像包含平面或交错 alpha 通道时,此选项才有效;否则会忽略它。 它指定要在压缩域转码期间丢弃的 alpha 频率数据量。 对于平面 alpha 通道,允许以下值。
值 | 说明 |
---|---|
0 | 无图像频率数据丢弃。 |
1 | 弹性比特将被丢弃,从而任意减少转码图像的平面 alpha 通道的质量,而无需更改有效分辨率。 确切的文件大小减少或特定质量降低取决于许多因素,不能指定或预测。 |
2 | HighPass 频率数据带被丢弃 (,还包括 FlexBits) ,从而有效地将转码图像平面 alpha 通道的分辨率降低为两个维度中的 4 倍。 转码图像的实际尺寸保持不变,但图像在每个 4x4 像素块中丢失所有平面 alpha 通道详细信息。 因此,每当解码图像时,应相应地向下采样转码图像。 通常,仅当将 ImageDataDiscard 属性设置为相同的值时,才应设置此值。 |
3 | HighPass 和 LowPass 频率数据带都将被丢弃 (,这也包括 FlexBits) ,从而有效地减少了两个维度中 16 的转码图像分辨率。 转码图像的实际尺寸保持不变,但图像在每个 16x16 宏块中丢失所有详细信息。 因此,每当解码图像时,应相应地向下采样转码图像。 通常,只有在将 ImageDataDiscard 属性设置为相同的值时,才应设置此值。 |
4 | Alpha 通道完全被丢弃。 转码图像的像素格式已更改,以反映 alpha 通道的删除。 |
对于包含交错 alpha 通道的图像,除非此属性设置为 4,否则根据 ImageDataDiscard 属性的值处理 alpha 通道与图像数据相同。 如果此属性设置为 4,则完全丢弃交错 alpha 通道,并相应地更改转码图像的像素格式。
没有默认值。
IgnoreOverlap 选项
仅当 CompressedDomainTranscode 属性为 TRUE 且请求了一个或多个磁贴的子区域转码时,此选项才有效。 区域转码 (或解码) 的默认操作是扩展请求的区域,以包含区域边缘重叠解码所需的周围像素。 如果此参数设置为 TRUE,则忽略周围像素,并且仅提取所选磁贴或磁贴。 同样,这要求请求的区域与一个或多个磁贴的坐标完全匹配。 如果未平铺源图像或请求的区域指定任何部分磁贴,则忽略此参数。
默认值为 FALSE。
解码
WIC 解码 API 设计为独立于编解码器,支持 WIC 的编解码器的图像解码本质上是相同的。 有关图像解码的详细信息,请参阅 解码概述。 有关使用解码的图像数据的详细信息,请参阅 位图源概述。
IWICBitmapSourceTransform 支持
除了支持 WIC 的编解码器所需的接口外,本机 HD 照片解码器还支持 IWICBitmapSourceTransform。 IWICBitmapSourceTransform 接口提供了用于解码图像位流的高级选项。 IWICBitmapSourceTransform 接口启用以下解码器选项,而不是使用 IWICBitmapFrameDecode 返回完整图像。
- 解码图像的矩形子区域。
- 解码为较低分辨率
- 解码为其他像素格式
- 在解码时执行转换 (旋转/翻转)
本机 HD 照片编解码器为 IWICBitmapSourceTransform 接口提供以下级别的支持。
DoesSupportTransform
本机实现支持所有 WICBitmapTransformOptions 转换。
GetClosestSize
对于两个维度中源图像维度小于 1/2 的请求,HD Photo 返回下一个最大整数图像大小,该大小由两个因子均匀地分割。 对于所有其他请求的大小,HD 照片返回原始图像尺寸。
GetClosestPixelFormat
HD 照片返回编码图像的像素格式。
CopyPixels
HD Photo 接受 WICRect 参数指定的任何请求区域,并返回图像的该部分。
uiWidth 和 uiHeight 参数必须指定 GetClosestSize 函数返回的维度。 任何其他值都返回错误。
pguidDstFormat 参数必须指定 GetClosestPixelFormat 函数返回的像素格式。 任何其他值返回错误。
HD Photo 接受 dstTransform 参数的任何允许值。 请注意,WIC 为此参数允许的值不同于 HD Photo 用于转换元数据标记的值。