SakuraWi - BLog

WEBエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

Railsで画像合成や文字入れをする【RMagick】


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/