RMagickを利用して画像の合成や文字入れをしたい
入力した内容に応じて画像を合成したり、
入力文字をいれた画像を作ったりするときの Tips
例で言うと、サムネイル作成、とかかな?
Rmagickのインストール
gemfileに以下を追加
gem 'rmagick'
そして bundle install
画像を合成するコード
image = Magick::ImageList.new(
"app/assets/images/test.png",
"app/assets/images/test2.png",
)
image = image.append(false) #falseだと左右につなげる。trueだと上下につなげる
image.write("app/assets/images/result.png")
Magick::ImageList.new
で画像が配列に格納されるようなふるまいになるので、いくつかpathを渡せばOK
.appendだけでなくて色々ありそう
.writeで書き出されます。
pathをしていしてあげればそこに書き出し。
今回は直接書き出しているけど、
アップロードするのであればその前にこの処理を挟めばよいかなと
文字入れをするコード
image = Magick::ImageList.new("app/assets/images/test.jpeg")
draw = Magick::Draw.new
draw.annotate(image, 0, 0, 5, 5, "入れたい文字") do
self.font = 'app/assets/font/NotoSansJP-Thin.otf' # フォント
self.fill = 'white'
self.stroke = 'transparent'
self.pointsize = 50
self.gravity = Magick::CenterGravity
end
image.write("app/assets/images/test_result.jpeg")
文字入れも超簡単だった。
Magick::Draw.newで用意して、.annotateでかけました。
fontをどこにおく問題ありそうだけど、
めちゃ適当にassets配下に置いてみた。
日本語対応じゃないと文字化けしたりするそうなので注意。
localからでも読み込みできたりもする。
しっかり運用するなら
それぞれクラスに書き出して、読み込んだImageを引数なりで渡して
- 文字入れをするクラス
- 画像を横にくっつけるクラス
- 縦に伸ばすクラス
などなどわけちゃうのが良い気がする。
参考
https://github.com/rmagick/rmagick
https://www.mk-mode.com/blog/2013/08/28/ruby-write-character-by-rmagick/