私はさらに実験を行ってきましたが、この答えが正しいかどうかはわかりませんが、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 です。ガンマを確認してみましょう。
identify -verbose start.png | grep -i gam
Gamma: 0.45455
png:gAMA: gamma=0.45455 (See Gamma, above)
次に、私の方法または Fred (@fmw42) の方法を使用して、ガンマ パラメータを変更しましょう。
# 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
将来の読者のために、ガンマ パラメータだけでなくピクセル値自体を変更する場合は、次のようにします。
# 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)