見出し画像

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` がつかえなくなるんですよね…なんか他のやりかたがあるんだろうけど調べきれなかった。。

なにかご存知の方いらっしゃいましたら教えてください〜

この記事が気に入ったらサポートをしてみませんか?