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
我正在尝试理解 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