Colors ImageMagic如何确定PNG的颜色空间?

Colors ImageMagic如何确定PNG的颜色空间?,colors,imagemagick,image-manipulation,imagemagick-convert,imagemagick-identify,Colors,Imagemagick,Image Manipulation,Imagemagick Convert,Imagemagick Identify,假设我创建了一个简单的PNG,其中包含: convert -size 1x1 canvas:red red.png 下面是一张类似的图片(较大尺寸)供参考: 然后在其上运行命令identify。它告诉我图像的颜色空间是sRGB,但文件中似乎没有这方面的指示。事实上正在运行 $ hexdump -C red.png 00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR| 00000010

假设我创建了一个简单的PNG,其中包含:

convert -size 1x1 canvas:red red.png
下面是一张类似的图片(较大尺寸)供参考:

然后在其上运行命令
identify
。它告诉我图像的颜色空间是
sRGB
,但文件中似乎没有这方面的指示。事实上正在运行

$ hexdump -C red.png 
00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00000010  00 00 00 01 00 00 00 01  01 03 00 00 00 25 db 56  |.............%.V|
00000020  ca 00 00 00 04 67 41 4d  41 00 00 b1 8f 0b fc 61  |.....gAMA......a|
00000030  05 00 00 00 20 63 48 52  4d 00 00 7a 26 00 00 80  |.... cHRM..z&...|
00000040  84 00 00 fa 00 00 00 80  e8 00 00 75 30 00 00 ea  |...........u0...|
00000050  60 00 00 3a 98 00 00 17  70 9c ba 51 3c 00 00 00  |`..:....p..Q<...|
00000060  06 50 4c 54 45 ff 00 00  ff ff ff 41 1d 34 11 00  |.PLTE......A.4..|
00000070  00 00 01 62 4b 47 44 01  ff 02 2d de 00 00 00 07  |...bKGD...-.....|
00000080  74 49 4d 45 07 e5 01 0d  17 04 37 80 ef 04 02 00  |tIME......7.....|
00000090  00 00 0a 49 44 41 54 08  d7 63 60 00 00 00 02 00  |...IDAT..c`.....|
000000a0  01 e2 21 bc 33 00 00 00  25 74 45 58 74 64 61 74  |..!.3...%tEXtdat|
000000b0  65 3a 63 72 65 61 74 65  00 32 30 32 31 2d 30 31  |e:create.2021-01|
000000c0  2d 31 33 54 32 33 3a 30  34 3a 35 35 2b 30 30 3a  |-13T23:04:55+00:|
000000d0  30 30 2d af d4 01 00 00  00 25 74 45 58 74 64 61  |00-......%tEXtda|
000000e0  74 65 3a 6d 6f 64 69 66  79 00 32 30 32 31 2d 30  |te:modify.2021-0|
000000f0  31 2d 31 33 54 32 33 3a  30 34 3a 35 35 2b 30 30  |1-13T23:04:55+00|
00000100  3a 30 30 5c f2 6c bd 00  00 00 00 49 45 4e 44 ae  |:00\.l.....IEND.|
00000110  42 60 82                                          |B`.|
00000113
$hextump-C red.png
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 D 49 48 44 52 |巴布亚新几内亚…….IHDR|
000000 100 00 00 00 00 01 03 00 00 00 00 25分贝56 ||
000000 20 ca 00 00 04 67 41 4d 41 00 00 b1 8f 0b fc 61 |……伽马……a|
000000 30 05 00 00 20 63 48 52 4d 00 00 7a 26 00 00 80 |。。。。cHRM..z&|
000000 40 84 00英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺英尺|

000000 50 60 00 3a 98 00 00 17 70 9c ba 51 3c 00 00 00 | `……p..Q假设没有嵌入式或侧车ICC配置文件或没有明确编码描述的图像按照IEC 61966-2-1:1999(即sRGB规范)进行编码是常见的,但不是标准化的。

这只是ImageMagick中的一个缺陷。您可以使用exiftool检查是否存在sRGB+sRGB意向块。在这种情况下,没有

Gamma 2.2不是sRGB。因此,这里的魔术是错误的。这是维基百科上的一个常见问题,所有SVG图像在转换为PNG时都会出现这种情况,并且会破坏颜色。见:


因为我们使用ImageMagick,所以我们必须在维基百科上重新编码所有图像。叹气。

我不知道完整答案,但我知道当图像元数据中没有颜色配置文件(ICC配置文件)时,程序通常假定图像的颜色空间是sRGB。我相信PNG只支持sRGB。颜色空间存储在PNG文件头中。PNG当然可以嵌入ICC配置文件:@fmw42,Fred,我不认为这是正确的。此图像包含校准颜色的
gAMA
cHRM
块。因此,这里正确的颜色空间应该是CalRGB而不是sRGB。即使图像包含校准颜色的
gAMA
cHRM
块?sRGB不是校准的颜色空间。gAMA标记描述了一个简单的指数,因此与sRGB分段EOTF不兼容。可能会使用一个专用的sRGB块:应用程序是否正确写入是另一个问题。1.808的gAMA块用于Apple RGB。我也是。Chrome确实支持这两个块。sRGB块覆盖gAMA和cHRM,iCCP覆盖sRGB块。Photoshop不支持gAMA,GIMP将在下一个开发版本中支持,sidedata中的ffmpeg也是如此。