我一直在尝试更多,我不确定这个答案是否正确,但我会留下一段时间,以便 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)