JPEG XR 编解码器概述
本机 JPEG XR 编解码器可通过 Windows 映像组件 (WIC) 获取。 编解码器支持的 JPEG XR 格式专为消费者和专业数字摄影而设计。
JPEG XR 格式的压缩效率是原始 JPEG 格式的两倍,压缩伪像不太明显。 JPEG XR 的功能包括:
- 支持单色、RGB、CMYK 和 n 通道图像
- 8 位、16 位和 32 位整数格式
- 高动态范围、宽色域格式,使用固定点或浮点颜色值
- 渐进式解码
- 使用相同的压缩算法进行有损或无损编码
- 支持对大图像中感兴趣的区域进行解码
JPEG XR 格式在以下标准文档中定义:
- ITU-T.832: 信息技术 – JPEG XR 图像编码系统 – 图像编码规范
- ISO/IEC 29199-2:2010: 信息技术 — JPEG XR 图像编码系统 — 第 2 部分:图像编码规范
JPEG XR 标准主要基于 HD 照片 格式,但这两种格式之间存在一些差异。 在 Windows 8 中,HD 照片编解码器已更新为支持 JPEG XR。 编码器现在始终输出符合 JPEG XR 的位流。 解码器可以解码 JPEG XR 和 HD 照片图像。
与 HD Photo 编解码器相比,JPEG XR 编解码器的性能已得到重大改进。 例如,亚分辨率图像解码(如缩略图生成)以及低分辨率图像解码已得到改进。 建议使用 JPEG XR 格式,而不是 HD 照片格式。
编解码器信息
组件 | 说明 |
---|---|
文件扩展名 | “jxr”和“wdp” |
容器 GUID | GUID_ContainerFormatWmp |
解码器 GUID | CLSID_WICWmpDecoder |
编码器 GUID | CLSID_WICWmpEncoder |
配置文件支持 | 编码器和解码器最多支持主配置文件和最高级别 128。 |
编解码器功能
高动态范围
JPEG XR 支持使用浮点或定点颜色的高动态范围图像。 在这些颜色格式中,像素的数值范围大于可见范围,因此可以在中间处理阶段调整高于或低于可见范围的颜色。
- 定点:在定点表示形式中,0 表示黑色,1.0 表示最大饱和度。 JPEG XR 编解码器支持 16 位和 32 位定点格式。 对于 16 位,1.0 = 0x2000h,这为可见范围 [0...1] 提供 13 位。 总范围是 –4.0 到 +3.999,并且是线性映射的。 对于 32 位、1.0 = 0x010000000h,可见范围是 24 位,总范围是 –128 到 +127.999。
- 浮点:在浮点表示中,0 表示黑色,1.0 表示最大饱和度。 JPEG XR 编解码器支持 16 位和 32 位浮点格式。
磁贴
可以将框架分区为称为 磁贴的矩形子区域。 磁贴是图像的一个区域,其中包含宏块的矩形数组。 使用磁贴可以解码图像的区域,而无需处理整个图像。
在编码期间,通过设置 HorizontalTileSlices 和 VerticalTileSlices 属性来选择磁贴数。 最小磁贴大小为 16 × 16 像素。 编码器调整磁贴数以保持此限制。 每个磁贴都有关联的存储和处理开销,因此应考虑特定方案所需的磁贴数。
图像流输出
JPEG-XR 标准定义了 JPEG-XR 文件的两个部分:
- 标准正文中定义的图像位流。
- 映像容器。 该文件包含 Exif 和 XMP 元数据,并在标准的附件 A 中定义。
标准允许将图像流嵌入到另一种类型的文件容器中。 编码器支持仅流模式,该模式输出没有映像容器的原始映像位流。 应用程序可以以其他某种容器格式存储位流。
若要启用仅流模式,请设置 StreamOnly 属性。
图像质量设置
多个编解码器属性控制编码器输出图像的质量。
- ImageQuality 是 WIC 编解码器中通用的属性。 它将图像质量指定为 0.0–1.0 的单个浮点值,
- “质量”、“重叠”和“子采样”属性可以更好地控制质量设置。
若要使用 “质量”、“ 重叠”和 “子采样 ”属性,请将 UseCodecOptions 属性设置为 “VARIANT_TRUE”。
如果 UseCodecOptionsVARIANT_FALSE (VARIANT_FALSE 为默认) 编码器使用 ImageQuality 属性。 编码器通过查找表将 ImageQuality 的值映射到 质量、 重叠和 子采样 。
编码器不支持 CompressionQuality 属性。
压缩域转码
JPEG XR 编解码器可以执行某些图像转换,而无需实际解码压缩的数据并重新编码。 压缩域操作非常高效,可避免在解码和重新编码有损压缩图像时出现的任何额外质量损失。
支持以下压缩域操作:
- 裁剪图像的区域。
- 旋转或翻转图像。
- 放弃频率数据以创建较小的图像文件。
- 在空间顺序和频率顺序之间重新组织图像。
如果源图像是 JPEG XR 图像,JPEG XR 编码器会尽可能使用压缩域转码。 当编码器执行压缩域操作时,它会忽略以下编解码器属性:AlphaQuality、ImageQuality、InterleavedAlpha、无损重叠和质量。 如果 HorizontalTileSlices 和 VerticalTileSlices 属性存在,则必须将它们设置为零。 不能在压缩域转码过程中更改图像的磁贴大小。
以下列表介绍了如何执行图像转换。
- 若要裁剪图像,请在 WriteSource 方法的 WICRect 参数中设置所需的区域。
- 若要旋转或翻转图像,请设置 BitmapTransform 属性。
- 若要放弃图像中的频率数据,请设置 ImageDataDiscard 属性。 若要放弃 alpha 通道中的频率数据,请设置 AlphaDataDiscard 属性。 放弃频率数据会减小编码的文件大小,并降低分辨率。
- 若要在频率和空间排序之间更改图像组织,请设置 FrequencyOrdering 属性。
若要禁用压缩域转码并强制编码器重新编码图像,请将 UseCodecOptions 设置为 VARIANT_TRUE 并将 CompressedDomainTranscode 设置为 VARIANT_FALSE。
编码器选项
若要设置编码属性,请使用 IPropertyBag2 接口。 有关详细信息,请参阅 编码概述。
以下列表指定编码器选项。
- AlphaDataDiscard
- AlphaQuality
- BitmapTransform
- CompressedDomainTranscode
- FrequencyOrder
- HorizontalTileSlices
- IgnoreOverlap
- ImageDataDiscard
- ImageQuality
- InterleavedAlpha
- 无损
- 重叠
- ProgressiveMode
- 质量
- StreamOnly
- 子采样
- UseCodecOptions
- VerticalTileSlices
AlphaDataDiscard
设置压缩域转码期间要丢弃的 alpha 频率数据量。
数据类型 | VARTYPE | 范围 | 默认 |
---|---|---|---|
UCHAR | VT_UI1 | 0–4 | 无 |
仅当 CompressedDomainTranscode 属性设置为 VARIANT_TRUE 并且图像包含平面 alpha 通道或交错 alpha 通道时,此属性才适用;否则将忽略它。
对于包含平面 alpha 通道的图像,以下值有效。
值 | 说明 |
---|---|
0 | 无图像频率数据丢弃。 |
1 | 将丢弃弹性位。 这会任意降低转码图像的平面 alpha 通道的质量。 ,有效解决方法不发生更改。 文件大小和质量的确切减少取决于许多因素,无法精确指定。 |
2 | 高通频率数据带被丢弃,包括弹性位。 这有效地将平面 alpha 通道的分辨率降低 4 倍。 转码图像的实际尺寸保持不变,但图像会丢失每个 4x4 alpha 通道像素块中的所有细节。 通常,仅当 ImageDataDiscard 属性具有相同值时,才应设置此值。 |
3 | 高通和低通频率数据带都将被丢弃,包括弹性位。 这在两个维度中将平面 alpha 通道的分辨率大幅降低 16。 转码图像的实际尺寸保持不变,但图像会丢失 alpha 通道像素的每个 16x16 宏块中的所有细节。 通常,仅当 ImageDataDiscard 属性具有相同值时,才应设置此值。 |
4 | Alpha 通道完全丢弃。 已转码图像的像素格式已更改,以反映 alpha 通道的删除。 |
对于包含交错 alpha 通道的图像,以下值有效。
值 | 说明 |
---|---|
4 | Alpha 通道完全丢弃。 已转码图像的像素格式已更改,以反映 alpha 通道的删除。 |
对于交错 alpha,除非此属性设置为 4,否则根据 ImageDataDiscard 属性的值处理 alpha 通道与图像数据相同。
AlphaQuality
设置平面 alpha 通道图像的压缩质量。
数据类型 | VARTYPE | 范围 | 默认 |
---|---|---|---|
UCHAR | VT_UI1 | 1–255 | 1 |
当图像具有 alpha 通道且 InterleavedAlpha 属性 VARIANT_FALSE时,此属性适用。 值 1 指示无损模式。 值增加会导致压缩率较高,图像质量越低。
BitmapTransform
指定解码时图像是旋转还是翻转。
数据类型 | VARTYPE | 范围 | 默认 |
---|---|---|---|
UCHAR | VT_UI1 | WICBitmapTransformOptions | WICBitmapTransformRotate0 |
CompressedDomainTranscode
启用或禁用压缩域转码。
数据类型 | VARTYPE | 默认 |
---|---|---|
VARIANT_BOOL | VT_BOOL | VARIANT_TRUE |
若要禁用压缩域操作,请将此属性设置为 VARIANT_FALSE。
FrequencyOrder
按频率顺序启用编码。 JPEG XR 编码器的设备实现可以按空间顺序组织文件,以减少编码期间所需的内存。
数据类型 | VARTYPE | 默认 |
---|---|---|
VARIANT_BOOL | VT_BOOL | VARIANT_TRUE |
- VARIANT_TRUE:频率顺序。 最低频率数据首先显示在文件中,图像内容按其频率(而不是空间方向)分组。 按频率顺序组织文件可为任何基于频率的解码提供最佳性能。
- VARIANT_FALSE:空间顺序。 空间顺序减少了编码期间所需的内存
建议使用频率顺序,除非你有性能或应用程序特定的使用空间顺序的原因。
HorizontalTileSlices
设置水平平铺数。
数据类型 | VARTYPE | 范围 | 默认 |
---|---|---|---|
USHORT | VT_UI2 | 0–4095 | (图像宽度 - 1) >> 8 |
值是水平细分的数目;即水平平铺数 – 1。
IgnoreOverlap
指定编码器在压缩域转码期间如何处理磁贴边界。
数据类型 | VARTYPE | 默认 |
---|---|---|
VARIANT_BOOL | VT_BOOL | VARIANT_FALSE |
仅当 CompressedDomainTranscode 属性设置为 VARIANT_TRUE 并执行一个或多个磁贴的子区域转码时,才应用此属性。
区域转码的默认操作是扩展请求的区域,以包含区域边缘重叠解码所需的周围像素。 如果此属性设置为 VARIANT_TRUE,则编解码器将忽略周围的像素,并且仅提取所选磁贴。 如果源图像未平铺,或者请求的区域包含部分磁贴,则忽略此参数。
ImageDataDiscard
设置压缩域转码期间要丢弃的图像频率数据量。
数据类型 | VARTYPE | 范围 | 默认 |
---|---|---|---|
UCHAR | VT_UI1 | 0–3 | 0 |
仅当 CompressedDomainTranscode 属性设置为 VARIANT_TRUE 时,此属性才适用;否则会忽略它。
值 | 说明 |
---|---|
0 | 无图像频率数据丢弃。 |
1 | 将放弃弹性位。 这会在不更改图像的有效分辨率的情况下任意降低转码图像的质量。 文件大小和质量的确切减少取决于许多因素,无法准确指定。 此值返回为交错 alpha 通道指定的错误。 |
2 | 高通频率数据带将被丢弃,包括弹性位。 这会使转码图像的分辨率在两个维度中降低 4。 转码图像的实际尺寸保持不变,但图像会丢失每个 4x4 像素块中的所有细节。 因此,每当解码时,应相应地减少已转码图像的采样。 |
3 | 高通和低通频率数据带都将被丢弃,包括弹性位。 这会使转码图像的分辨率在两个维度中降低 16。 转码图像的实际尺寸保持不变,但图像会丢失每个 16x16 像素宏块中的所有细节。 因此,每当解码时,应相应地减少已转码图像的采样。 |
如果图像包含交错的 alpha 通道,则 ImageDataDiscard 的值将应用于 alpha 通道,除非 AlphaDataDiscard 属性设置为 4,在这种情况下,将放弃 alpha 通道。
对于平面 alpha,放弃的频率数据由 AlphaDataDiscard 属性控制。
ImageQuality
设置图像质量。
数据类型 | VARTYPE | 范围 | 默认 |
---|---|---|---|
FLOAT | VT_R4 | 0–1.0 | 0.9 |
级别 1.0 提供数学上无损压缩。
级别 0.0 是最低质量设置。
InterleavedAlpha
指定是对交错 alpha 还是平面 alpha 进行编码。
数据类型 | VARTYPE | 默认 |
---|---|---|
VARIANT_BOOL | VT_BOOL | VARIANT_FALSE |
- VARIANT_TRUE:交错 alpha。 Alpha 通道信息编码为附加交错通道,与图像内容通道不相关。 此模式可用于在流式处理图像时同时解码图像的 alpha。
- VARIANT_FALSE:平面 alpha。 平面 alpha 通道编码为单独的图像。 图像数据和 alpha 通道独立解码。 (可选)可以通过设置 AlphaQuality 属性来设置 alpha 通道的质量级别。
交错 alpha 仅支持某些 RGB 像素格式。 定义 alpha 通道的任何图像格式都支持平面 alpha。
无损
启用损失压缩。
数据类型 | VARTYPE | 默认 |
---|---|---|
VARIANT_BOOL | VT_BOOL | VARIANT_FALSE |
如果值为 VARIANT_TRUE,则编码器将使用无损压缩。 设置为 VARIANT_TRUE 时,此属性将替代 ImageQuality 属性。
重叠
设置重叠筛选的级别。 使用重叠筛选时,转换系数将跨块和宏块边界应用。 这可以减少阻塞项目。
数据类型 | VARTYPE | 范围 | 默认 |
---|---|---|---|
UCHAR | VT_UI1 | 0–4 | 1 |
值 | 说明 |
---|---|
0 | 无重叠。 |
1 | 一级重叠,软平铺。 (默认。) |
2 | 两个级别的重叠,软平铺。 |
3 | 一级重叠,硬平铺 |
4 | 两个级别的重叠,硬平铺。 |
定义:
- 一级重叠:基于相邻块修改 4x4 块的编码值。
- 两个级别的重叠:应用第一个重叠级别。 此外,根据相邻宏块修改 16x16 宏块的编码值。
- 软平铺:跨磁贴边界应用重叠筛选。
- 硬平铺:不跨磁贴边界应用重叠筛选。 硬磁贴可能会沿磁贴边界引入一些可视项目。
如果设置此属性,还要将 UseCodecOptions 设置为 VARIANT_TRUE。
ProgressiveMode
启用或禁用渐进式编码。
数据类型 | VARTYPE | 默认 |
---|---|---|
VARIANT_BOOL | VT_BOOL | VARIANT_FALSE |
值 | 说明 |
---|---|
VARIANT_TRUE | 顺序模式 (默认) 。 |
VARIANT_FALSE | 渐进模式。 |
质量
设置压缩质量。
数据类型 | VARTYPE | 范围 | 默认 |
---|---|---|---|
UCHAR | VT_UI1 | 1–255 | 1 |
值 1 指示无损模式。 值增加会导致压缩率较高,图像质量越低。
如果设置此属性,还要将 UseCodecOptions 设置为 VARIANT_TRUE。
StreamOnly
启用或禁用仅流模式。
数据类型 | VARTYPE | 默认 |
---|---|---|
VARIANT_BOOL | VT_BOOL | VARIANT_FALSE |
值 | 说明 |
---|---|
VARIANT_TRUE | 编码器输出不含元数据的原始图像流。 |
VARIANT_FALSE | 编码器输出 (图像流以及元数据) 的容器格式。 |
子采样
设置色度子采样。 此属性仅适用于 RGB 图像。
数据类型 | VARTYPE | 范围 | 默认 |
---|---|---|---|
UCHAR | VT_UI1 | 0–3 | 如果 ImageQuality 0.8,>则为 3;否则为 1 |
值 | 说明 |
---|---|
3 | 4:4:4 编码。 保留全色分辨率。 |
2 | 4:2:2 编码。 色度分辨率是亮度分辨率的 1/2。 |
1 | 4:2:0 编码。 色度分辨率是亮度分辨率的 1/4。 |
0 | 4:0:0 编码。 放弃所有色度值,仅保留亮度。
注意: 不建议使用此模式,因为编解码器使用稍微修改的亮度定义来提高性能。 相反,最好在编码之前将图像转换为单色。 |
4:2:2 和 4:2:0 保留亮度细节,但代价是颜色细节。
如果设置此属性,还要将 UseCodecOptions 设置为 VARIANT_TRUE。
UseCodecOptions
指定是否使用 Quality、 Overlap 和 Subsampling 属性,而不是泛型 ImageQuality 属性。
数据类型 | VARTYPE | 默认 |
---|---|---|
VARIANT_BOOL | VT_BOOL | VARIANT_FALSE |
VerticalTileSlices
设置水平平铺数。
数据类型 | VARTYPE | 范围 | 默认 |
---|---|---|---|
USHORT | VT_UI2 | 0–4095 | (图像高度 - 1) >> 8 |
该值是垂直细分的数目;即垂直平铺数 - 1。
支持的颜色格式
有关这些格式的详细信息,请参阅 本机像素格式。
-
整数 RGB 格式
- GUID_WICPixelFormat24bppRGB
- GUID_WICPixelFormat24bppBGR
- GUID_WICPixelFormat32bppBGR
- GUID_WICPixelFormat48bppRGB
- GUID_WICPixelFormat32bppBGRA
- GUID_WICPixelFormat64bppRGBA
- GUID_WICPixelFormat32bppPBGRA
- GUID_WICPixelFormat64bppPRGBA
-
定点 RGB 格式
- GUID_WICPixelFormat48bppRGBFixedPoint
- GUID_WICPixelFormat64bppRGBFixedPoint
- GUID_WICPixelFormat96bppRGBFixedPoint
- GUID_WICPixelFormat128bppRGBFixedPoint
- GUID_WICPixelFormat128bppRGBAFixedPoint
-
浮点 RGB 格式
- GUID_WICPixelFormat48bppRGBHalf
- GUID_WICPixelFormat64bppRGBHalf
- GUID_WICPixelFormat128bppRGBFloat
- GUID_WICPixelFormat64bppRGBAFixedPoint
- GUID_WICPixelFormat64bppRGBAHalf
- GUID_WICPixelFormat128bppRGBAFloat
- GUID_WICPixelFormat128bppPRGBAFloat
-
灰度格式
- GUID_WICPixelFormat8bppGray
- GUID_WICPixelFormat16bppGray
- GUID_WICPixelFormat16bppGrayFixedPoint
- GUID_WICPixelFormat16bppGrayHalf
- GUID_WICPixelFormat32bppGrayFixedPoint
- GUID_WICPixelFormat32bppGrayFloat
-
打包格式
- GUID_WICPixelFormat16bppBGR555
- GUID_WICPixelFormat16bppBGR565
- GUID_WICPixelFormat32bppBGR101010
- GUID_WICPixelFormat32bppRGBE
-
CMYK 格式
- GUID_WICPixelFormat40bppCMYKAlpha
- GUID_WICPixelFormat64bppCMYK
- GUID_WICPixelFormat80bppCMYKAlpha
-
N 通道格式
- GUID_WICPixelFormat32bpp4Channels
- GUID_WICPixelFormat40bpp5Channels
- GUID_WICPixelFormat48bpp6Channels
- GUID_WICPixelFormat56bpp7Channels
- GUID_WICPixelFormat64bpp8Channels
- GUID_WICPixelFormat32bpp3ChannelsAlpha
- GUID_WICPixelFormat40bpp4ChannelsAlpha
- GUID_WICPixelFormat48bpp5ChannelsAlpha
- GUID_WICPixelFormat56bpp6ChannelsAlpha
- GUID_WICPixelFormat64bpp7ChannelsAlpha
- GUID_WICPixelFormat72bpp8ChannelsAlpha
- GUID_WICPixelFormat48bpp3Channels
- GUID_WICPixelFormat64bpp4Channels
- GUID_WICPixelFormat80bpp5Channels
- GUID_WICPixelFormat96bpp6Channels
- GUID_WICPixelFormat128bpp8Channels
- GUID_WICPixelFormat64bpp3ChannelsAlpha
- GUID_WICPixelFormat80bpp4ChannelsAlpha
- GUID_WICPixelFormat96bpp5ChannelsAlpha
- GUID_WICPixelFormat112bpp6ChannelsAlpha
- GUID_WICPixelFormat128bpp7ChannelsAlpha
- GUID_WICPixelFormat144bpp8ChannelsAlpha