JPEG-XL:在 libjxl 命令行工具中处理调色板

JPEG-XL: Handling of palette in libjxl command line tools

我正在尝试理解 following presentation,请参阅第 27 页:

有人可以描述一下 libjxl 中可用的命令行工具,它们可以帮助我使用现有的调色板吗?

我尝试了一个幼稚的:

% convert -size 512x512 -depth 8 xc:white PNG8:white8.png
% convert -size 512x512 -depth 8 xc:white PNG24:white24.png

这给了我预期:

% file white8.png white24.png
white8.png:  PNG image data, 512 x 512, 8-bit colormap, non-interlaced
white24.png: PNG image data, 512 x 512, 8-bit/color RGB, non-interlaced

但是然后:

% cjxl -d 0 white8.png white8.jxl
% cjxl -d 0 white24.png white24.jxl

给出:

% md5sum white8.jxl white24.jxl
68c88befec21604eab33f5e691a2a667  white8.jxl
68c88befec21604eab33f5e691a2a667  white24.jxl

哪里

% jxlinfo white8.jxl
dimensions: 512x512
have_container: 0
uses_original_profile: 1
bits_per_sample: 8
have_preview: 0
have_animation: 0
intrinsic xsize: 512
intrinsic ysize: 512
orientation: 1 (Normal)
num_color_channels: 3
num_extra_channels: 0
color profile:
  format: JPEG XL encoded color profile
  color_space: 0 (RGB color)
  white_point: 1 (D65)
  primaries: 1 (sRGB)
  transfer_function: gamma: 0.454550
  rendering_intent: 0 (Perceptual)
frame:
  still frame, unnamed

我也试过:

% cjxl -d 0 --palette=1024 white24.png palette.jxl

这也给出了:

% md5sum palette.jxl
68c88befec21604eab33f5e691a2a667  palette.jxl

libjxl 编码器将 JPEG 比特流作为输入(对于无损 JPEG 重新压缩的特殊情况)或像素。如果这些像素是通过 PPM 文件、PNG8 文件、PNG24 文件、RGB 内存缓冲区或任何其他方式给出的,则没有任何区别,如果像素相同,则结果将相同。

在您的示例中,您有一个纯白色的图像,因此无论您如何将它传递给 cjxl,它都将以相同的方式编码。

现在如果这些像素碰巧只使用很少的颜色,PNG8 就是这种情况,因为在这种情况下最多可以有 256 种颜色,编码器(在默认努力设置)将检测到这一点并使用 jxl 调色板变换来更紧凑地表示图像。在 jxl 中,调色板可以有任意大小,没有限制为 256 种颜色。 cjxl 中的 --palette 选项可用于设置仍将使用调色板变换的最大颜色数——如果输入图像的颜色多于此数量,则不会使用调色板。

Palette的使用被认为是jxl内部的编码工具,不属于对外暴露的图片元数据。编码器可以使用它来有效地重新压缩 PNG8 文件,但是当输入为 PNG8 时它并不一定总是使用该编码工具,并且当输入超过 256 种颜色时它也可能使用 Palette。 jxl 的调色板变换非常通用,它也可以应用于单个通道,多于或少于 3 个通道,调色板条目不仅可以是特定颜色,还可以是 so-called 不是“增量调色板条目”添加到预测像素值的颜色但带符号的像素值。

正如 Jon Sneyers 所解释的,调色板正上方是一个内部编码工具。我对此感到困惑,因为我看不出 jxlinfo 命令行的输出有任何差异。

所以我运行以下我这边的经历来说服自己:

$ cjxl -d 0 --palette=257 palette.png palette.257.jxl
$ cjxl -d 0 --palette=256 palette.png palette.256.jxl
$ cjxl -d 0 --palette=255 palette.png palette.255.jxl

导致:

% md5sum palette.*.jxl
e925521cbb976dce2646354ea3deee3b  palette.255.jxl
8d241b94d67aeb2706a1aad7aed55cc7  palette.256.jxl
8d241b94d67aeb2706a1aad7aed55cc7  palette.257.jxl

其中:

% du -sb palette.*.jxl
89616   palette.255.jxl
45627   palette.256.jxl
45627   palette.257.jxl

在所有情况下 jxlinfo 显示:

% jxlinfo palette.255.jxl
dimensions: 256x256
have_container: 0
uses_original_profile: 1
bits_per_sample: 8
have_preview: 0
have_animation: 0
intrinsic xsize: 256
intrinsic ysize: 256
orientation: 1 (Normal)
num_color_channels: 3
num_extra_channels: 0
color profile:
  format: JPEG XL encoded color profile
  color_space: 0 (RGB color)
  white_point: 1 (D65)
  primaries: 1 (sRGB)
  transfer_function: 13 (sRGB)
  rendering_intent: 0 (Perceptual)
frame:
  still frame, unnamed

有:

% pnginfo palette.png
palette.png...
  Image Width: 256 Image Length: 256
  Bitdepth (Bits/Sample): 8
  Channels (Samples/Pixel): 1
  Pixel depth (Pixel Depth): 8
  Colour Type (Photometric Interpretation): PALETTED COLOUR (0 colours, 0 transparent)
  Image filter: Single row per byte filter
  Interlacing: No interlacing
  Compression Scheme: Deflate method 8, 32k window
  Resolution: 0, 0 (unit unknown)
  FillOrder: msb-to-lsb
  Byte Order: Network (Big Endian)
  Number of text strings: 0