久しぶりにImageMagickによる便利ネタ。
特定の色を他の色に変更したい場合。 ケースとしては単色の濃淡で作られたアイコンに限定する。FaceBookとかTwitterみたいな。白と青二色のアイコンみたいなのにも有効。
こうしたアイコンはたいていまとまった数があるのでluaかpythonかbashかまあなんでもいいので、バッチでも組んで一括で変換したい。
さて、下記は検索で見つけた例。
convert -fill #00FF00 -opacity 0xFF0000 a.png b.png
のように、すると緑の部分が、赤くなるよということだが。
これだと通常画像にはアンチエイリアスがかかってるのでうまくいかない。
(昔風の1色で構成されたドット絵なら話は別だが…)
でそれを解消するために-fuzz 50%とかかけると、エッジがぎざぎざになったり、画像が膨らんだりしてしまってさらに泥沼になる。というわけで、convert -fillの方針は大抵の場合よくない。
上記のような問題を回避するためには、以下のように、RGBチャネルのうち一枚を切り出して、一度グレイスケールにしたのち、黒い部分をlevel-colorsで変更したい色にするといい。
下記の例の場合#253578を赤(#FF0000)に変更している。
convert a.png -background #253578 -alpha background -alpha off -channel B -separate +channel -alpha on bw.png
convert bw.png +level-colors #ff0000, b.png
綺麗に濃淡が変換されるわけではないので注意。RGBチャネルの一枚を切り出しているので、色が薄いなと思ったら -channel Bとなってる個所を-channel Gとかしてあげると色が濃くなる。
他にはグレースケールの時点で明度をいじるとかすればよくなるかも。