以前にRailsアプリで画像をダウンロードできるアプリを仕事で作ったことがありまして、それを応用してGIF画像を作成するアプリを過去に作っていました。 デプロイするサーバーとかを持っていないので、社内のサーバーに上げて公開していたたんなる内輪ウケのジョークアプリだったのですが、HerokuにはデフォルトでImageMagickが入っていることを知りまして、Herokuにデプロイしてみました。
現バージョンはスマホでも見られます!(レスポンシブデザインに挑戦)
作成工程は以下の流れです。
まず文字が表示されていないカートGIF画像をツールを使って作りました。
こちらは、Giamというソフトを使いました。
上にあるGIF画像は10コマの画像で構成されています。
例)その中の2枚の画像
この10枚の画像はキャプチャソフトとExcelを使って作りました。。カートはExcelのオブジェクトで横にずらしながら、コマ撮りアニメーションのようにキャプチャしていきます。 キャプチャしていった10枚の画像をGiamで編集し、一つのGIF画像を作成していきました。
ImageMagickは、画像編集ソフトです。コマンドラインにて画像編集(大きさ変えたり、画像の品質を変えたり)する事が可能です。 PhotoShopやGimpで出来ることをCUIでできるイメージです。こちらのソフトはコマンドラインだけでなく、APIも用意されていまして、 RmagickというRuby製のライブラリを使うとこのAPIをRubyにて使うことができます。今回はRmagickを使いました。
以下のようなメソッドを使用して、上に書いた各10枚の画像を参照できます。
gif = Magick::ImageList.new "images/cart.gif" # <-- imagesディレクトリのcart.gifにアクセス
gif.each_with_index do |f, i| # <-- f が画像オブジェクト、iはindex
# ...
# ...
end
画像オブジェクトに文字を埋め込むには、annotateメソッドを使います。
(ソース記述例)
# imgは画像オブジェクト。x, y は画像の座標(ピクセル)です。
Magick::Draw.new.annotate(img, 0, 0, x, y, letter) do
# フォントファイルのパス、配置、大きさ等を指定
self.font = font_file_path
self.align = Magick::CenterAlign
self.stroke = "transparent"
self.pointsize = 52
self.text_antialias = true
self.kerning = 1
end
ImageMagickは、指定したピクセルの色を変えられます。Rmagickでは、Imageクラスのpixel_colorメソッドを使います。
(ソース記述例)
# カートの高さ(Y座標 118~134)あたりのピクセルの色が緑色(土台GIFのカートの色)の座標を指定された色に変えている
for y in 118...134
for x in 0...img.columns
src = img.pixel_color(x, y)
r = src.red
g = src.green
b = src.blue
if r == 37522 && g == 53456 && b == 20560
img.pixel_color(x, y, "#" + color)
end
end
end
Sinatraを使っています。(Sinatraは情報が多いので省略します。私自身それほど詳しい訳ではないので。。)
ルートにアクセスするとページHTMLを返し、/cart
にアクセスするとGIF画像を返しています。ソース - main.rb
画像の編集は時間がかかるので、/cart
のレスポンスはやや遅いです。
上に書いたRmagick、SinatraのソースはHerokuを使って公開しました。
http://hozumicart3.herokuapp.com/
Sinatra、Unicornを使ったHerokuへのデプロイは以下のサイトを参考にしました。
Sinatra + PostgreSQL + Unicorn な Web サーバーを Heroku に構築する
Github Pagesも作りたかったので、viewファイルと同じようなものをhtmlで作りました。(HerokuにUPしているviewファイルはローカル端末でも動くようにしているため、若干記述は異なります)
Github Project用のGithub Pagesは、gh-pages
というブランチを作成してhtml等をpushすれば構築できます。以下のサイトを参考にしました。
GitHub Pagesホスティングサービス(ほぼ)完全活用ガイド
ボタンを押したり、色指定プルダウンが変わったタイミングで、imgタグのsrc属性を変えて画像を取得しています。 画像がロードされるまでにちょっと時間がかかるので、Now LoadingGif画像に切り替えたりしています。
Ruby自体に触れるようになったのも、ここ1、2年(おかしな記述も多いかと)なのですがRubygemsやBundler等の一連のエコシステムが心地よくて、「早めに完成品が見られる感」が半端ないですね。 表示されたGif画像は保存もできるので、どうぞお持ち帰りください。