Rubyで画像を加工してみた:RMagickではなくrcairoで
画像をRailsアプリのサーバー側で編集(文字を書いたり画像を重ねたり)したいなーという要望があったので、Rubyで画像加工をするやり方を探していた。
RMagick(ImageMagick)を使う方法のほうがメジャーっぽかったんだけど、今回はrcairo(cairo)を使って編集してみた。
※RMagickのほうが情報がたくさんあるしできることありそうだし果たしてcairoを使う必要があったのかは不明。
参考リンク
詳細はリンク先などを見てください(完)
るびま - cairo: 2 次元画像描画ライブラリ
rcairo ドキュメント(日本語)
rcairo - GitHub
やってみた
加工を試してみたリポジトリがこちら。
image-generate-sample
画像を加工してみるスクリプトのサンプルです↓。
今回使った
- 加工のためのライブラリ : (r)cairo
- ファイルを読み込んでcairoでゴニョゴニョするためのPixbuf
はgdk3に含まれている…のかな?
もしかしたらrcairoのインストールと require `cairo` が必要かもしれない。
スクリプトでやっているのは、
- ベースとなる画像を読み込む
- boldの文字を書き込む
- regularの文字を書き込む
- 色付きの文字を書き込む
- 別の画像を読み込み、円でクリッピングして表示する
です。
generate.rb
require 'gdk3'
base_image = ARGV[0]
add_image = ARGV[1]
# FIXME: Gdk::Pixbuf is deprecated. But can't generate by GdkPixbuf::pixbuf. Why?
# pixbuf = GdkPixbuf::Pixbuf.new(file: add_image, width: 320, height: 180)
pixbuf = Gdk::Pixbuf.new(file: add_image, width: 320, height: 180)
surface = Cairo::ImageSurface.from_png(base_image)
context = Cairo::Context.new(surface)
context.move_to(100, 100)
context.select_font_face('Noto Sans CJK JP Bold')
context.set_font_size(20)
context.show_text('太字テキスト(Noto Sans CJK JP Bold)')
context.move_to(100, 140)
context.select_font_face('Noto Sans CJK JP Regular')
context.show_text('細字テキスト(Noto Sans CJK JP Regular)')
context.move_to(100, 200)
context.set_source_color(Cairo::Color::GREEN)
context.show_text('カラーテキスト')
context.translate(40, 300)
context.set_source_pixbuf(pixbuf)
context.clip do
context.circle(160, 90, 90)
end
context.paint
surface.write_to_png('img/generated.png')
surface.finish
それでできたのが↓
すごく適当ですまない。
不明点
`Gdk::Pixbuf.new` はdeprecatedなので `GdkPixbuf::pixbuf` を使え、みたいなこと言われるんだけどそれを使った場合に `set_source_pixbuf` がつかえなくなるんですよね…なんか他のやりかたがあるんだろうけど調べきれなかった。。
なにかご存知の方いらっしゃいましたら教えてください〜
この記事が気に入ったらサポートをしてみませんか?