⚠️ 这是一个非官方翻译网站,与 ImageMagick Studio LLC 无关。准确信息请参阅原文(https://imagemagick.org/color-management/)

色彩管理

由于 sRGB 在互联网上的标准化,大多数图像格式都将 sRGB 用作默认的工作色彩空间。如果某张图像的色彩空间未知,且它是 8 至 16 位的图像格式,那么假定它处于 sRGB 色彩空间是一个安全的选择。这同样适用于灰度图像,我们假定为非线性灰度。如果某种特定的图像格式包含色彩空间和/或伽马(gamma)元数据,这些假定将被覆盖。当色彩空间是 RGB 而非 sRGB 时,ImageMagick 会假定为线性色彩。你也可以通过色彩配置文件或 -set 选项来覆盖默认的色彩空间假定。

ImageMagick 支持色彩配置文件,但对于没有配置文件或色彩空间声明的图像,ImageMagick 会假定为非线性 sRGB。大多数图像处理算法都假定使用线性色彩空间,因此在应用某些图像处理算法之前,先转换为线性色彩或去除伽马函数可能是明智之举。例如:

magick myimage.jpg -colorspace RGB -resize 200% -colorspace sRGB mybigimage.jpg

若要声明某张图像为线性 RGB 而非 sRGB,可以使用 set 选项:

magick myimage.png -set colorspace RGB myRGBimage.png

请注意,将图像声明为线性与将图像转换为线性并不相同。声明为线性只是设置元数据,并不会更改像素数据。而转换为线性则会真正更改像素数据,下文将对此作更详细的说明。

之后,输出文件的 verbose 信息会将色彩空间列为 RGB。这仅适用于包含可区分线性 RGB 与非线性 sRGB 的元数据的图像类型,例如 PNG 和 GIF。因此,如果以 JPG 或 TIF 输出格式运行上述命令,色彩空间的 verbose 信息仍会显示为 sRGB。为了让 JPG 输出能够正确识别它是线性 RGB,请包含适当的色彩配置文件。

默认情况下,将彩色图像转换为灰度会返回非线性灰度。若要改为转换为线性灰度,请使用 -set-intensity-grayscale 选项:

convert myimage.png -colorspace LinearGray myRGBimage.png
convert myimage.png -colorspace RGB -colorspace Gray myRGBimage.png
convert myimage.png -intensity Rec709luminance -colorspace gray myRGBimage.png
convert myimage.png -grayscale Rec709luminance myRGBimage.png

请注意,LinearGray 是 ImageMagick 6.9.9-29 及 7.0.7-17 起的新功能。

在分离通道时也需要同样的概念。通常,将 sRGB 彩色图像的各个通道分离的转换会生成各自独立的非线性灰度图像。但是,如果希望将分离后的通道保持为线性灰度,也可以应用同样的概念。例如,以下命令会生成线性灰度通道。

magick myimage.png -colorspace RGB -separate myimage_channels_%d.png

在分离并重新组合通道(其间可能会进行中间处理)时,识别所使用的色彩空间非常重要,尤其是在重新组合期间。例如:

magick myimage.png -separate myimage_channels_%d.png
magick myimage_channels_*.png -combine myimage2.png

在上面的示例中,分离出的通道是非线性的,而 -combine 的默认行为也是假定为非线性通道。因此结果与输入相同。

如果希望分离为线性灰度通道,并在之后(也许是在进行某些处理之后)再重新组合为非线性彩色,那么请使用与上文相同的概念来保持线性灰度:

magick myimage.png -set colorspace RGB -separate myimage_channels_%d.png
magick myimage_channels_*.png -set colorspace RGB -combine -colorspace sRGB myimage2.png

在转换到另一个色彩空间并再转换回来时,例如在 sRGB 与 HSL 之间,以下两条命令分别处理第一种非线性通道的情形和第二种线性通道的情形:

magick myimage.png -colorspace HSL -separate myimage_channels_%d.png
magick myimage_channels_*.png -set colorspace HSL -combine -colorspace sRGB myimage2.png


magick myimage.png -set colorspace RGB -colorspace HSL -separate myimage_channels_%d.png
magick myimage_channels_*.png -set colorspace HSL -combine -colorspace RGB -set colorspace sRGB myimage2.png

大多数图像格式都假定为 sRGB 色彩空间(例如 JPEG、PNG 等)。少数格式仅支持线性 RGB(例如 EXR、DPX、CIN、HDR)或仅支持线性 GRAY。少数格式支持 CMYK,例如 JPG 支持,而 PNG 不支持。此外,偶尔也会有格式同时支持 LAB(即 CIELAB)(例如 TIFF、PSD、JPG、JP2)。更多信息请参阅 Colorspace支持的格式 页面。

当以 rgb(...) 或十六进制形式指定单个颜色时,这些颜色仍会被解释为非线性的,即 sRGB 颜色。但如果希望创建线性颜色,请使用 icc-color(rgb,r,g,b),其中 r、g、b 的取值范围为 0 到 1。请参阅 Color 页面。