せとうちRailsでRmagickを利用した画像アップロード・リサイズ処理・バイナリ画像出力Railsで画像ファイルを取り扱うためのgemは色々あるが、本記事ではRMagickのみを利用して画像管理機能とリサイズまでを行う。ImageMagickをインストールRMagickを利用するにはImageMagickが必要となる。MacならHomebrewをインストールして、下記のコマンドでImageMagickをインストールする。imagemagickCentOS・RedHatなどではyumでインストールすることができる。古いバージョンとなるので、最新のImageMagickを利用したい場合はソースからインストールする。installRailsでの画像アップロード今回はバイナリデータをデータベースに保存して画像を取り扱う事を前提とする。細かいテーブルの構造、具体的な処理のフローなどは割愛し、基本的な概念とコードのみを紹介する。アップロード画面Imageモデルにて画像データを取り扱うパターン。フォームの:multipartをtrueにし、file_fieldにファイルを設定させる。%>バイナリデータの取り出しアップロードした画像のバイナリデータはparams[:image][:image_file].tempfile.readに格納される。このデータをデータベースに保存すれば、ファイルのデータ自体は保存できるが、実際にはアップロードされた画像をWeb用に最適化したり、画像以外のものを弾く処理が必要である。RMagickで画像のバイナリデータを扱うアップロードされた画像のバイナリから画像を扱う場合はMagick::Image.from_blobを使う。配列は今回のケースでは一つのみなのでshiftで取り出す。Magick::Image.from_blob(params[:image][:image_file].tempfile.read).shift加工が終わった画像は下記のようにバイナリで出力できる。image_magick.to_blob画像の向きを自動修正する画像のEXIFのOrientationには写真の向きが設定されている。カメラやスマートフォンの向きを変えて撮影した際、この情報を埋め込む事で実際の表示時に縦向きの写真か、横向きの写真かを判別することが可能となる。パソコンやブラウザで写真を表示しても、このOrientationを参照し正しい向きで写真を表示するが、セキュリティの観点からEXIF情報を削除したい場合やリサイズを行う場合は、この回転処理を手動で行わなければいけない。このOrientationは下記のように取得できる。image_magick.orientation数値を取得し手動で回転処理を記述しても良いが、Rmagickにはauto_orientというのがあり、この回転処理を自動で行ってくれる。image_magick.auto_orientEXIFのOrientationに様々な数値が設定されたサンプル画像がある。EXIF情報を回転処理を行わず削除した場合の挙動と、Rmagickによる回転処理が正しく行われているかのテストはこの画像を使って行うと良い。Typeの取得image_magick.mime_typeで取得することができる。Typeによって処理を変更する場合は、ImageMagickで取得できる値を利用したい。画像のリサイズ画像のリサイズだけでも多くの物が存在する。sampleはそれぞれ速度や画質に違いがある。下記記事でそれについての調査結果が掲載されているので参考にしたい。実際のリサイズについて、画質や速度などを考慮せずに最短で実装するならresize_to_fitとresize_to_fillを使う。resize_to_fitは縦横比を保ったままリサイズを自動的に行ってくれるメソッドである。画像に対して短い方の数値を利用するようになっている。下記の例では高さ300pxが使われる。300)resize_to_fillは画像の切り抜きが行える。縦横比を維持して縮小した上で、指定されたサイズの切り抜きを実行する。50)これらの処理を手動で書くのは大変な上に、細かな計算が必要となってくる。手動で実装した場合とRmagickの自動リサイズでは前者の速度が上回る傾向にあるが、頻繁な画像変換処理が発生しない場合は、自動リサイズで問題無いと思われる。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。せとうちRailsでのタイムゾーンの動的変更とサマータイムの取り扱いについてRailsでは自分でタイムゾーンのテーブルを作成し管理することも可能だが、time_zone_selectを利用すればタイムゾーンのリストを自動生成することができ、そこで生成された値をTime.zoneに与える事でタイムゾーンを動的に変更することができる。%>以上のフォームでユーザー作成時にタイムゾーンを保存し、ApplicationControllerの:before_actionなどで設定するだけで、利用者ごとにタイムゾーンを切り替える機能を構築できる。user.time_zoneユーザーのタイムゾーンによってサイトの時間表示を切り替える場合は、データベースにUTCでデータが保存されていることが前提である。ローカル時間でデータを保存していた日本国内限定サイトを多言語に対応させる場合は、一旦データベース内のdatetimeを持つレコードを取り出し、-9時間してからアップデートをかける事で対応可能である。Time.nowではなくTime.zoneを使うTime.nowではローカル時間に依存する。多言語対応を行う場合はTime.zone.nowを使うようにする事で、ユーザーに応じた時間を取得するよう心がけ、データベースへは基本UTCで保存されているため、Time.utc.nowを使うというようにルールを統一する。ややこしいと思うなら、application.rbのconfig.time_zoneをUTCにして、適宜ユーザーに応じたタイムゾーンに変換する仕組みとした方が混乱を避ける事ができて良いだろう。RailsのサマータイムについてRailsのtime_zone_selectではGMTによる時差付きのリストが出力されるデータ呼び出し時にUTCに時差を加えたローカル時間を出力し、時刻の末尾にUTCの時差が表示されるRailsではサマータイムを自動で計算してくれる。イギリスのロンドンからのユーザーがアクセスした時、サマータイム中に該当する時刻のデータはUTC+01:00で取り出され、そうでない時刻に該当するデータはUTC+00:00で取り出される。8月に作成したデータのcreated_atと12月に作成したcreated_atを出力すると下記のようにサマータイムが反映されて出力される。+0000余談だが、time_zone_selectで出力されるGMTリストはサマータイムによって時差が変わるということは無い。Londonを選択したのに、データを取り出すと01:00になってしまうので時間がずれているのでは」と思ってしまうかもしれないが、そのような事はない。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。MySQL検索:検索このブログについて因幡はねるとらん太郎で人生が完結した人。ねるちゃんの老人ホーム入居費用を貯めています。