質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

1225閲覧

rmagick /ImageMagickでの画像圧縮方法に関してRails

showko222

総合スコア13

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2018/02/23 01:02

前提・実現したいこと>

Railsで練習でQ&Aサイトのようなものを作っています。
現在困っているのが、
ユーザーのプロフィール画像をアップロードされた際にリサイズを行い
画像を軽くして保存をしたく、

rmagick
ImageMagick

をインストールし、試行錯誤しておりますが
なかなかうまく反映することはできません

Public/user_images/profileimage.rb

width = 150 height = 150 original = Magick::Image.read('#{@user.id}.jpg').first new_image = original.resize(width, height) new_image.write('public/user_images/#{@user.id}.jpg')

users_controller.rb

def update 省略 if params[:image] @user.image_name = "#{@user.id}.jpg" image = params[:image] File.binwrite("public/user_images/#{@user.image_name}", image.read) end if @user.save flash[:notice] = "ユーザー情報を編集しました" redirect_to("/users/#{@user.id}") else render("users/edit") end require 'RMagick' end

このように記述しておりますが全く反映されず、
様々なサイトを拝見しましたが

・require 'RMagick' はどこに書くべきなのか

・original = Magick::Image.read('#{@user.id}.jpg').first
以下略
の内容はどこにファイルを作って置いておくべきなのか

初心者すぎて、上記内容すらわかっておらず困ってしまっております。
どなたか助けてください、、、、、、、、

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まずは、ImageMagick、RMagickが正常に使える環境になったのかという事を確認しなければいけません。
RailsでRMagickを利用するのはこの後に考えます。

通常のRubyのプロジェクトを作成して、RMagickを利用するという方法を教えますので、やってみてください。

通常のRubyプロジェクトでRMagickを使ってみる

私の環境は、CentOS7, ruby2.4.3ですが、
他のLinux系やMacであれば問題ないと思います。
まず、以下のようにコマンドを実行してみてください。
ご存知かと思いますが、"$ "は打たなくて良いです。
ターミナルでコマンドを打ちますよという合図なので。

新規にディレクトリを作成してRMagickを利用するRubyプロジェクトを作る

$ mkdir ~/rmagick-test $ cd ~/rmagick-test $ bundle init $ echo "gem 'rmagick'" >> Gemfile $ bundle install --path vendor/bundle

問題なければ、このような出力がされます。

Fetching gem metadata from https://rubygems.org/. Resolving dependencies... Using bundler 1.16.1 Fetching rmagick 2.16.0 Installing rmagick 2.16.0 with native extensions Bundle complete! 1 Gemfile dependency, 2 gems now installed. Bundled gems are installed into `./vendor/bundle`

もし、bundle installのところでエラーが出る場合は、ImageMagickのインストールがちゃんとできていない可能性が高いです。
あるいは、ImageMagickのバージョンが合わないなど。
エラーメッセージをGoogleで検索して解決策を探します。

適当な画像を用意する

正常に完了したら、次は適当にネットから画像を持ってきます。
Google画像検索で風景を探して持ってきました。

$ curl -O https://www.wallpaperup.com/uploads/wallpapers/2013/03/23/58408/aeaa942672f3970ddcbaa6ed1b07ddfa-700.jpg

RMagickを使うRubyスクリプトを作成する

sample.rbとして以下の内容を保存します。

ruby

1require 'bundler' 2Bundler.require 3 4width = 150 5height = 150 6 7original = Magick::Image.read('./aeaa942672f3970ddcbaa6ed1b07ddfa-700.jpg').first 8puts "original: #{original.inspect}" 9new_image = original.resize(width, height) 10new_image.write('./new.jpg') 11puts "new: #{original.inspect}"

実行する

実行すると、下記のように出力されるはずです。

$ ruby sample.rb original: ./aeaa942672f3970ddcbaa6ed1b07ddfa-700.jpg JPEG 1244x700 1244x700+0+0 DirectClass 8-bit 207kb new: ./aeaa942672f3970ddcbaa6ed1b07ddfa-700.jpg JPEG 1244x700 1244x700+0+0 DirectClass 8-bit 207kb

ここまで出来れば、Railsのコントローラで同じように書けばいいだけという事が分かりますよね。

Gemfileにgem 'rmagick'と書くことにより、requireは不要となるという事も分かると思います。
なぜかというと、sample.rbにはrequireを書いていないのにMagick::などRMagickの機能が使えているからです。

投稿2018/02/23 03:06

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

showko222

2018/02/23 04:15 編集

ご丁寧なご解説大変助かりましたありがとうございます。 しかしながら、私が超初心者というとこもあり、 下記にてつまづいてしまいました。 users_controller.rb ``` if params[:image] @user.image_name = "#{@user.id}.jpg" image = params[:image] File.binwrite("public/user_images/#{@user.image_name}", image.read) require 'bundler' Bundler.require width = 150 height = 150 original = Magick::Image.read('public/user_images/#{@user.image_name}').first puts "original: #{original.inspect}" new_image = original.resize(width, height) new_image.write('public/user_images/"new" + #{@user.image_name}.jpg') puts "new: #{original.inspect}" end ``` これでサイズが小さくなった画像が、Usersモデルのimage_nameに保存されるものと思ったのですが ``` unable to open image `public/user_images/#{@user.image_name}': No such file or directory @ error/blob.c/OpenBlob/276 ``` と出てきてしまいます。。。。
mingos

2018/02/23 04:29

えーと、まず確認したいのですが、私の回答で示した普通のRubyでRMagickを動かす手順は試しましたか?そしてちゃんと動きましたか? 1つずつクリアして行かないといけません。 まずは、この点について返信してください。 まだ、試していないなら試してくださいね。
showko222

2018/02/23 04:45

失礼いたしました、 普通のRubyでRMagickを動かす手順は実行済みです! ご確認いただきありがとうございます
mingos

2018/02/23 04:56

では、次の段階ですね。 unable to open image `public/user_images/#{@user.image_name}': No such file or directory @ error/blob.c/OpenBlob/276 という事ですから、ファイルが存在しない=ファイルの保存に失敗していると推測されます。 ファイルの保存を行っているのは、ここですね。 @user.image_name = "#{@user.id}.jpg" image = params[:image] File.binwrite("public/user_images/#{@user.image_name}", image.read) よくある原因として、 public/user_imagesというディレクトリが存在しない可能性があります。 File.binwriteはディレクトリの作成までは面倒を見てくれません。 あらかじめ、mkdir public/user_images とやって作っておく必要があります。 もし、ディレクトリがあるのにエラーが出ているという事であれば、 フルパスで指定すれば解決すると思います。 Railsのプロジェクトルートを示すパスは、Rails.root.to_sで取得できます。 文字列の中では、"#{Rails.root}"でOKです。 "public/user_images/#{@user.image_name}" ↓ "#{Rails.root}/public/user_images/#{@user.image_name}" としてみてください。
showko222

2018/02/23 05:58

ディレクトリは指定の場所に存在しており、 リサイズ前の画像は保存されております。 #{Rails.root}をつけましたが、下記エラーが出てきてしまっている状態でございます unable to open image `#{Rails.root}/public/user_images/#{@user.image_name}': No such file or directory @ error/blob.c/OpenBlob/2761
mingos

2018/02/23 06:07

状況を整理しましょう。 (1) 画像の保存は成功している (2) RMagickで画像を読み込む事に失敗している という事ですね。 問題があるのは、(2)の部分。 original = Magick::Image.read('#{Rails.root}/public/user_images/#{@user.image_name}').first という事で良いでしょうか? さて、よくよく考えてみると、もし正しくプログラムを書いているのであれば、 「unable to open image `#{Rails.root}/public/user_images/#{@user.image_name}': No such file or directory @ error/blob.c/OpenBlob/2761」 というメッセージではなく、 「unable to open image `/home/ユーザ名/Railsのプロジェクトルート/public/user_images/1.jpg': No such file or directory @ error/blob.c/OpenBlob/2761」 などのようになるはずです。 ところが、プログラムのコードそのままのパスがエラーで出てしまうのはおかしいですよね? Rubyの文法では、シングルクォーテーション(')とダブルクォーテーション(")では働きが違います。 シングルクォーテーション(')は変数展開がされません。 (2)はまさにシングルクォーテーションで囲まれています。 これが原因であると推測されます。 original = Magick::Image.read('public/user_images/#{@user.image_name}').first ↓ original = Magick::Image.read("public/user_images/#{@user.image_name}").first としてください。 他の箇所も、同様です。 new_image.write("#{Rails.root}/public/user_images/new#{@user.image_name}.jpg")
showko222

2018/02/25 02:36

お恥ずかしい限りです、誠にありがとうございます。 解決いたしました!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問