mattintosh note

どこかのエンジニアモドキの備忘録

ImageMagick 6系で-combineするとアルファチャンネルが無くなる

macOSMacPortsImageMagick 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

f:id:mattintosh4:20210107002725p:plain

-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

f:id:mattintosh4:20210107002612p:plain

しかし、-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

f:id:mattintosh4:20210107003347p:plain

なんかうまくやれば -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

f:id:mattintosh4:20210107003928p:plain

7.0.2 の頃に issue に上がっていたようだがもしかしてこれが 6 系には取り込まれていないのかも。

github.com

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

f:id:mattintosh4:20210107010701p:plain

6 系でこのチャンネル構成と同じようにして -combine してもアルファチャンネルとしては認識されない。7 系ではアルファチャンネルを認識する処理が走ってるのかな。(ソースは見てない)