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