如何使用 ImageMagick 修复 PNG 的伽玛值?
How can I fix PNG's gamma using ImageMagick?
我想将 PNG 的伽玛值固定为 1/2.2
。例如,假设有一个 gAMA
值为 1/4.4
的 png 图像。由于某些原因,我必须将值固定为 1/2.2
。所以我尝试如下 convert
命令。
# 0.5 is led by (1/4.4)/(1/2.2)
# 0.45455 is led by 1/2.2
$ convert orig.png -gamma 0.5 +gamma 0.45455 new.png
然后,我比较了两张图片,orig.png
和 new.png
,但它们似乎不同。
我猜公式 (1/4.4)/(1/2.2)
是错误的。有谁知道正确的做法吗?
谢谢。
已编辑:
抱歉,也许我不能告诉你我真正想做什么。因此,我添加了更多信息和示例图片。
首先,我有下图。此图像的 gAMA 约为 0.227(1/4.4)。
然后,我需要这张图片。图像的gAMA为0.4545(1/2.2)但外观与上图相同
所以,我不需要这个。这张图的gAMA也是0.4545(1/2.2),但是外观和第一张不一样
在 Imagemagick 中,只需使用 -set gamma:
convert image.png -set gamma 0.4545 image.png
这只会改变 Gamma 值,但不会改变像素值。如果您需要这样做,那么您应该使用(如 Mark Setchell 所建议的那样)。但是如果你想要 1/2.2 而有 1/4.4,那么你需要一个值 (1/2.2)/(1/4.4)=2
转换 image.png -gamma 2 image.png
我一直在尝试更多,我不确定这个答案是否正确,但我会暂时搁置它,以便 Fred、Eric 和 Glenn (@GlennRandersPehrson) 可以看到它并可能更正它或评论它。我也不明白这是为什么:
convert start.png -set png:gAMA 2 -verbose info: | grep -i -C5 gam
与此不同:
convert start.png -set png:gAMA 2 tmp.png
identify -verbose tmp.png | grep -i -C5 gam
我想我明白发生了什么 - 简而言之,我认为 PNG 编码器没有正确获取伽马。
让我们制作一个值为 100 的单像素图像,这样我们就可以看到转换后会发生什么:
convert xc:"gray(100)" start.png
让我们检查一下:
convert start.png txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (25700) #646464 gray(100)
是的,肯定是 100。让我们检查一下 gamma:
identify -verbose start.png | grep -i gam
Gamma: 0.45455
png:gAMA: gamma=0.45455 (See Gamma, above)
现在让我们使用我的方式或 Fred (@fmw42) 的方式更改 gamma 参数:
# Change gamma parameter my way
convert start.png +gamma 2 -verbose info: | grep -i gam
Gamma: 2
png:gAMA: gamma=0.45455 (See Gamma, above)
convert start.png +gamma 2 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (25700) #646464 gray(100)
# Change gamma parameter Fred's way
convert start.png -set gamma 2 -verbose info: | grep -i gam
Gamma: 2
png:gAMA: gamma=0.45455 (See Gamma, above)
convert start.png -set gamma 2 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (25700) #646464 gray(100)
如你所见,两种方式都没有改变像素值本身,两种方式都改变了 ImageMagick 内部伽马,但关键是没有做你需要的,这是更改 PNG 编码器的伽马。一些小实验表明您需要:
convert start.png -set png:gAMA 2 -verbose info: | grep -i gam
Gamma: 0.45455
png:gAMA: 2
所以,我认为这就是答案 - 即使用:
convert input.png -set png:gAMA XYZ result.png
仅供将来的读者参考,如果您想更改像素值本身而不仅仅是 gamma 参数,请执行以下操作:
# Set gamma of 2, initial pixel value 100 becomes 160
convert start.png -gamma 2 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (41039.6) #A0A0A0 gray(160)
# Set gamma of 0.5, initial pixel value 100 becomes 39
convert start.png -gamma 0.5 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (10078.4) #272727 gray(39)
这似乎适用于 Imagemagick。
convert red44.png -gamma 0.5 -set gamma 0.4545 red22_new.png
identify -verbose red22_new.png
...
伽马:0.4545
...
我想将 PNG 的伽玛值固定为 1/2.2
。例如,假设有一个 gAMA
值为 1/4.4
的 png 图像。由于某些原因,我必须将值固定为 1/2.2
。所以我尝试如下 convert
命令。
# 0.5 is led by (1/4.4)/(1/2.2)
# 0.45455 is led by 1/2.2
$ convert orig.png -gamma 0.5 +gamma 0.45455 new.png
然后,我比较了两张图片,orig.png
和 new.png
,但它们似乎不同。
我猜公式 (1/4.4)/(1/2.2)
是错误的。有谁知道正确的做法吗?
谢谢。
已编辑:
抱歉,也许我不能告诉你我真正想做什么。因此,我添加了更多信息和示例图片。
首先,我有下图。此图像的 gAMA 约为 0.227(1/4.4)。
然后,我需要这张图片。图像的gAMA为0.4545(1/2.2)但外观与上图相同
所以,我不需要这个。这张图的gAMA也是0.4545(1/2.2),但是外观和第一张不一样
在 Imagemagick 中,只需使用 -set gamma:
convert image.png -set gamma 0.4545 image.png
这只会改变 Gamma 值,但不会改变像素值。如果您需要这样做,那么您应该使用(如 Mark Setchell 所建议的那样)。但是如果你想要 1/2.2 而有 1/4.4,那么你需要一个值 (1/2.2)/(1/4.4)=2
转换 image.png -gamma 2 image.png
我一直在尝试更多,我不确定这个答案是否正确,但我会暂时搁置它,以便 Fred、Eric 和 Glenn (@GlennRandersPehrson) 可以看到它并可能更正它或评论它。我也不明白这是为什么:
convert start.png -set png:gAMA 2 -verbose info: | grep -i -C5 gam
与此不同:
convert start.png -set png:gAMA 2 tmp.png
identify -verbose tmp.png | grep -i -C5 gam
我想我明白发生了什么 - 简而言之,我认为 PNG 编码器没有正确获取伽马。
让我们制作一个值为 100 的单像素图像,这样我们就可以看到转换后会发生什么:
convert xc:"gray(100)" start.png
让我们检查一下:
convert start.png txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (25700) #646464 gray(100)
是的,肯定是 100。让我们检查一下 gamma:
identify -verbose start.png | grep -i gam
Gamma: 0.45455
png:gAMA: gamma=0.45455 (See Gamma, above)
现在让我们使用我的方式或 Fred (@fmw42) 的方式更改 gamma 参数:
# Change gamma parameter my way
convert start.png +gamma 2 -verbose info: | grep -i gam
Gamma: 2
png:gAMA: gamma=0.45455 (See Gamma, above)
convert start.png +gamma 2 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (25700) #646464 gray(100)
# Change gamma parameter Fred's way
convert start.png -set gamma 2 -verbose info: | grep -i gam
Gamma: 2
png:gAMA: gamma=0.45455 (See Gamma, above)
convert start.png -set gamma 2 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (25700) #646464 gray(100)
如你所见,两种方式都没有改变像素值本身,两种方式都改变了 ImageMagick 内部伽马,但关键是没有做你需要的,这是更改 PNG 编码器的伽马。一些小实验表明您需要:
convert start.png -set png:gAMA 2 -verbose info: | grep -i gam
Gamma: 0.45455
png:gAMA: 2
所以,我认为这就是答案 - 即使用:
convert input.png -set png:gAMA XYZ result.png
仅供将来的读者参考,如果您想更改像素值本身而不仅仅是 gamma 参数,请执行以下操作:
# Set gamma of 2, initial pixel value 100 becomes 160
convert start.png -gamma 2 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (41039.6) #A0A0A0 gray(160)
# Set gamma of 0.5, initial pixel value 100 becomes 39
convert start.png -gamma 0.5 txt:
# ImageMagick pixel enumeration: 1,1,65535,gray
0,0: (10078.4) #272727 gray(39)
这似乎适用于 Imagemagick。
convert red44.png -gamma 0.5 -set gamma 0.4545 red22_new.png
identify -verbose red22_new.png
... 伽马:0.4545 ...