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/