みなさん、こんにちは。まどぎわです(・∀・)
今日は、mini_magic
と使って画像にテキストを合成する方法をメモしておきますφ(..)
mini_magic
を使うと某匿名質問サービスみたいに画像に文字を合成する機能を結構簡単に作ることが出来ます🙌
↓公式のリポジトリはこちら↓
mini_magicの使い方
準備
mini_magicを使うには、ImageMagick
というアプリがインストールされている必要があります。 まずはインストールされているかどうか確認してください。
$ convert -version Version: ImageMagick 6.9.9-40 Q16 x86_64 2018-07-14 http://www.imagemagick.org Copyright: © 1999-2018 ImageMagick Studio LLC License: http://www.imagemagick.org/script/license.php Features: Cipher DPC Modules Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png tiff xml zlib
インストールされていなかったかたは、「ImageMagick インストール」等でググッってインストールしてください(..)
mini_magicのインストール
mini_magicも通常のGemと同じようにGemfileに追記するか、下記コマンドを実行することでインストールすることが出来ます。
gem 'mini_magick'
文字列を受け取って画像を生成してみる
背景画像を準備
まずは文字列を埋め込む背景画像を用意します。今回は、こんな感じのを用意しました。
文字列を受け取って画像に合成する処理を作ってみる
実際の実装を下記に記載しておきますφ(..)
class ImageHelper require 'mini_magick' require 'securerandom' BASE_IMAGE_PATH = './app/assets/images/bg_image.png'.freeze GRAVITY = 'center'.freeze TEXT_POSITION = '0,0'.freeze FONT = './app/assets/fonts/komorebi-gothic.ttf'.freeze FONT_SIZE = 65 INDENTION_COUNT = 11 ROW_LIMIT = 8 class << self # 合成後のFileClassを生成 def build(text) text = prepare_text(text) @image = MiniMagick::Image.open(BASE_IMAGE_PATH) configuration(text) end # 合成後のFileの書き出し def write(text) build(text) @image.write uniq_file_name end private # uniqなファイル名を返却 def uniq_file_name "#{SecureRandom.hex}.png" end # 設定関連の値を代入 def configuration(text) @image.combine_options do |config| config.font FONT config.gravity GRAVITY config.pointsize FONT_SIZE config.draw "text #{TEXT_POSITION} '#{text}'" end end # 背景にいい感じに収まるように文字を調整して返却 def prepare_text(text) text.scan(/.{1,#{INDENTION_COUNT}}/)[0...ROW_LIMIT].join("\n") end end end
こんな感じで、使うことが出来ます(・∀・)
# 生成した画像のFileClassを取得 ImageHelper.build('何かしらの文字列を合成してみる').tempfile.open.read # 生成した画像の書き出し ImageHelper.write('何かしらの文字列を合成してみる')
↓出来た画像がこちら↓
おわりに
設定周りのやり方を調べるのに結構苦労しましたが、実装は意外とシンプルですね(・∀・)
ちなみに私も最近作ったサービスでも使ってみました🙌
↓みたいなQuizを投稿して画像でシェア出来るサービスです(・∀・)
quiz-quiq.herokuapp.com