ImageMagick の convert で半透明な PNG を扱う

PNG はRGBとともにα値を保持しているので、半透明色というのも指定することが可能です。

# a.gif の白(#FFFFFF)を半透明(50%=0x80)にし、b.png として保存(入力の形式は任意ですが、出力は png 必須です)。
convert a.gif -fill “#FFFFFF80” -opaque “#FFFFFF00” b.png
# 半透明になったか確認のため背景画像 bg.jpg の上に b.png を重ね、
# c.jpg として保存する(背景、出力の画像形式は任意です)。
convert -compose over bg.jpg b.png c.jpg

参考:
– convert コマンドのオプションについては「指定した色を別の色に置き換える
」を参照。
– PNGについては JEvaHz Messages 1320-1331 を参考にしました。

PNGの透明化は大別して2種類の指定方法があり、色深度などにより厳密には
4種類のフォーマットがあります。
 
1.αチャンネルを用いる場合(Color type = 4 or 6)
  (8bit,16bit grayscale / 24bit,48bit color)
 RGB値もしくはgrayscale値に加え、ピクセル毎にα値(透明度)を保持。
 α値の深度は色深度と同じ。
 
2.tRNS(=transparency) chunkを用いる場合
  a.1,2,4,8bit indexed colorの場合(Color type = 3)
   個々のカラーに対し、8bitの深度の透明度を指定できる。
  b.1,2,4,8,16bit grayscale の場合 (Color type = 0)
   ある一つのgrayscale levelに対し、1bitの深度の透明度を指定できる。
  c.24/48bit colorの場合(Color type = 2)
   ある一つの色に対し、1bitの深度の透明度を指定できる。
 
(中略)
 
また、PNGの仕様によると透明化は必須ではないらしいので、
実装にばらつきがでるのはやむを得ないでしょう。
部分的な対応もOKだそうで…。

PNG Programming Resources