macOS で MacPorts 版 ImageMagick 6.9.11 を使っているのだけどチャンネル分解して結合しなおしたときにアルファ情報が無くなる問題にぶちあたった。
Homebrew 版の 7.0.10 だと問題にならなかったので 7 系使えばいいだけの話なのだけど備忘録として残しておく。
私はアンシャープマスクをかけるときにカラースペースを Lab に変換して L チャンネルだけにアンシャープマスクをかけるのだけど透過 PNG にかけると真っ黒になってしまった。
どこがマスクかわかりやすいように foo-1.png にマウスだけを抽出してある。-colorspace TYPE -separate
した段階でアルファが一旦無効になる。
convert 20210102_003_circle.png -colorspace RGB -thumbnail 512x512 \ \( -clone 0 -alpha Extract \) \ \( -clone 0 -colorspace CIELab -separate \( -clone 0 -unsharp 0x0.3+6+0 \) \) \ foo.png
-separate
した後に -alpha On
するととりあえずアルファが有効になる。
convert 20210102_003_circle.png -colorspace RGB -thumbnail 512x512 \ \( -clone 0 -alpha Extract \) \ \( -clone 0 -colorspace CIELab -separate -alpha On \( -clone 0 -unsharp 0x0.3+6+0 \) \) \ foo.png
しかし、-combine
で結合するとアルファが失われる。(foo-2.png の状態)
convert 20210102_003_circle.png -colorspace RGB -thumbnail 512x512 \ \( -clone 0 -alpha Extract \) \ \( -clone 0 -colorspace CIELab -separate -alpha On \( -clone 0 -unsharp 0x0.3+6+0 \) -swap 0 +delete -combine -set colorspace CIELab \) \ foo.png
なんかうまくやれば -combine
してもアルファを維持出来るのかもしれないが GIMP で同じようなことをしてもアルファをふっとばすようなので、元のレイヤーのアルファを -compose CopyOpacity
でアルファが無くなってしまったレイヤーに反映させることにした。
convert 20210102_003_circle.png -colorspace RGB -thumbnail 512x512 \ \( -clone 0 -colorspace CIELab -separate -alpha On \( -clone 0 -unsharp 0x0.3+6+0 \) -swap 0 +delete -combine -set colorspace CIELab \) \ +swap \ -compose CopyOpacity -composite \ foo.png
7.0.2 の頃に issue に上がっていたようだがもしかしてこれが 6 系には取り込まれていないのかも。
7.0.10 を使うと -separate
の時点でアルファを一緒に出力するようになってるっぽい(foo-3.png がそれ)。
magick convert 20210102_003_circle.png -colorspace RGB -thumbnail 512x512 \ -colorspace CIELab -separate \ \( -clone 0 -unsharp 0x0.3+6+0 \) \ foo.png
6 系でこのチャンネル構成と同じようにして -combine
してもアルファチャンネルとしては認識されない。7 系ではアルファチャンネルを認識する処理が走ってるのかな。(ソースは見てない)