はじめに
以下の記事で紹介されているコマンドを呪文のように使っている方が多いと思われますが、中身が分からないまま使うのが気持ち悪い人用に、これらの具体的な動きを解説してみます。
% convert HOGE.PNG \
\( +clone -alpha opaque -fill white -colorize 100% \) +swap \
-geometry +0+0 -compose Over -composite -alpha off \
PIYO.PNG
サンプル画像
半透明のあるサンプル画像を、以下のように作ってみます。
% convert -size 200x200 gradient:cyan-magenta cyan-magenta.png
% convert cyan-magenta.png -alpha on -channel A -fx "(i-w/3)/w*3" HOGE.PNG
シアン-マゼンタの縦グラデーション画像をまず作り、そこに横グラデーションの透明度を適用します。
左1/3は完全透明、1/3〜2/3はグラデーション、2/3以降は不透明とします。
cyan-magenta.png | HOGE.PNG |
---|---|
iwiwi さんのコマンドを実行すると、以下のようになります。qiita の背景が白でわかりにくいので、以降は yellow に変えます。
PIYO.PNG | PIYO.PNG (yellow) |
---|---|
コマンドを分割
コマンドを2つに分けるとこうです。(white を yellow に変えてます)
# 元画像と同じ大きさの黄色画像を作る
% convert HOGE.PNG -alpha opaque -fill yellow -colorize 100% YELLOW.PNG
# 黄色画像の上に元画像を重ねて合成する
% convert YELLOW.PNG HOGE.PNG -compose Over -composite -alpha off PIYO.PNG
(YELLOW.PNG HOGE.PNG は HOGE.PNG YELLOW.PNG +swap と同じ)
YELLOW.PNG | PIYO.PNG |
---|---|
オプションの説明
+clone
直前に読んだ画像をメモリ上でコピーします。
例えば、同じ画像を横に連結するとき、
% convert HOGE.PNG HOGE.PNG +append HOGEHOGE.PNG
でも良いですが、これだと HOGE.PNG を二回ファイルから読んでデコードする手間がありまして、
% convert HOGE.PNG +clone +append HOGEHOGE.PNG
こっちの方がメモリコピーで済んでお得です。
HOGEHOGE.PNG |
---|
-alpha opaque
透明度を全て不透明にします。
% convert HOGE.PNG -alpha opaque OPAQUE.PNG
OPAQUE.PNG |
---|
-fill white -colorize 100%
画像を白く塗りつぶす、恐らく一番簡単な方法です。(-draw "rectangle 〜 でもいけますが、-colorize の方が良いでしょう)
割合指定でオーバーレイ効果をかけます。
- 白のオーバーレイ 25%,50%,75%,100%
% convert OPAQUE.PNG -fill white -colorize 25% WHITE-25.PNG
% convert OPAQUE.PNG -fill white -colorize 50% WHITE-50.PNG
% convert OPAQUE.PNG -fill white -colorize 75% WHITE-75.PNG
% convert OPAQUE.PNG -fill white -colorize 100% WHITE.PNG
- 黄色のオーバーレイ 25%,50%,75%,100%
% convert OPAQUE.PNG -fill yellow -colorize 25% YELLOW-25.PNG
% convert OPAQUE.PNG -fill yellow -colorize 50% YELLOW-50.PNG
% convert OPAQUE.PNG -fill yellow -colorize 75% YELLOW-75.PNG
% convert OPAQUE.PNG -fill yellow -colorize 100% YELLOW.PNG
WHITE-25.PNG | WHITE-50.PNG | WHITE-75.PNG | WHITE.PNG |
---|---|---|---|
YELLOW-25.PNG | YELLOW-50.PNG | YELLOW-75.PNG | YELLOW.PNG |
+swap
% convert HOGE.PNG \( 黄色画像 \) +swap \
-geometry +0+0 -compose Over -composite -alpha off \
PIYO.png
HOGE.PNG と 黄色画像の順で画像を指定して合成(-composite)を行うと、HOGE.PNG が下、黄色画像が上にきて、合成してもただの黄色画像です。+swap を指定する事で、黄色画像を下(地)にして合成できます。
-geometry +0+0
左上の位置合わせだと思うのですが、必要性がよく分かりません。PNG 仕様の screen と image が合ってない時対策かと思って検証してみても、オプションの有無で動作は変わりませんでした。誰か分かる方いたら教えて欲しいです!
-compose Over -composite
画像を重ねて、手前の画像の透明度を元に合成します。
-alpha off
透明度のチャネルを削除します。
簡単な方法
iwiwi さんの記事では以下ので半透明が無視されると説明されています。
% convert HOGE.PNG -background white -alpha deactivate -flatten PIYO.PNG
恐らく 6系での挙動を意識していると思いますが、当時は半透明どころか透明ピクセルも無視してました。
なお、7系でも当初は半透明は処理するけど透明度が消えない動作でした。
実は ImageMagick-7.0.4-6 で治っています。white を yellow に変えてバージョン毎に実行してみました。
% convert HOGE.PNG -background yellow -alpha deactivate -flatten PIYO.PNG
6 系 | 7.0.4-5 以前 | 7.0.4-6 以降 |
---|---|---|
単に透明度を削除 | 透明度を反映するが透明度を消し忘れ | 期待するもの |
あと、以下のコマンドだと、7.0.4-5 以前(6系含む)でも大丈夫でした。
% convert HOGE.PNG -background yellow -flatten -alpha off PIYO.PNG
6 系 | 7.0.4-5 以前 | 7.0.4-6 以降 |
---|---|---|