RMagick で色を変更

年賀状に使いたい素材があったのだけど、色が気にくわない。

筆文字なので黒なんだろうけど、それを金色っぽくしたい。

そんなときは ImageMagick の convert

$ convert -fill '#ffdf36' -opaque '#000000' src.png dst.png

とかすると、黒が黄色っぽくなる。


ところが、境界線のあたりがうまく変更できない。
境界付近はぼかしがかかって真黒ではないから。

-fuzz 50% とかするといいらしいが、やっぱり何か気にくわない。

RMagick で bit 演算したら完璧にできんじゃないの? と思ってやってみた。

require 'RMagick'

ifn = ARGV[0]
ofn = ARGV[1]

exit  unless ifn
ofn = "#{File.dirname(ifn)}/out#{File.extname(ifn)}"  unless ofn

src = Magick::ImageList.new(ifn)
dst = Magick::Image.new(src.columns, src.rows)

gold = Magick::Pixel.new(0xffff, 0xdfdf, 0x3636)

src.each_pixel do |px, x, y|
  color = 
    Magick::Pixel.new(((px.red   ^ 0xffff) & (gold.red   ^ 0xffff) ^ 0xffff),
                      ((px.green ^ 0xffff) & (gold.green ^ 0xffff) ^ 0xffff),
                      ((px.blue  ^ 0xffff) & (gold.blue  ^ 0xffff) ^ 0xffff))
  dst.pixel_color(x, y, color)
end

dst.write(ofn)

変更したい元の色が黒なので白黒反転させてからマスクして反転してみた。

元々透過だった所は白になるらしい。

RMagick のドキュメントは、

$ gem server

で見れるはずだが、何書いてるのかサッパリ?

面倒なので convert で透過させた。

$ convert -transparent '#ffffff' out.png dst.png