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

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

ただいまの
回答率

90.35%

  • Ruby

    8722questions

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

  • Ruby on Rails

    8126questions

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

  • Ruby on Rails 5

    2577questions

  • Ruby on Rails 4

    2509questions

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

  • RubyGems

    361questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,191

showko222

score 5

 前提・実現したいこと> 

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
以下略
の内容はどこにファイルを作って置いておくべきなのか

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

まずは、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として以下の内容を保存します。

require 'bundler'
Bundler.require

width  = 150
height = 150

original = Magick::Image.read('./aeaa942672f3970ddcbaa6ed1b07ddfa-700.jpg').first
puts "original: #{original.inspect}"
new_image = original.resize(width, height)
new_image.write('./new.jpg')
puts "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 13: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
    ```

    と出てきてしまいます。。。。

    キャンセル

  • 2018/02/23 13:29

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

    キャンセル

  • 2018/02/23 13:45

    失礼いたしました、
    普通のRubyでRMagickを動かす手順は実行済みです!

    ご確認いただきありがとうございます

    キャンセル

  • 2018/02/23 13: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}"

    としてみてください。

    キャンセル

  • 2018/02/23 14: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

    キャンセル

  • 2018/02/23 15: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")

    キャンセル

  • 2018/02/25 11:36

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

    キャンセル

同じタグがついた質問を見る

  • Ruby

    8722questions

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

  • Ruby on Rails

    8126questions

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

  • Ruby on Rails 5

    2577questions

  • Ruby on Rails 4

    2509questions

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

  • RubyGems

    361questions

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