튜토리얼 제13장 사용자의 마이크로 포스트 - 이미지의 리사이즈

이미지의 자동 크기 조정이 필요한 이유



파일 사이즈에 대한 밸리데이션은 Rails 자습서 13장 사용자 마이크로포스트 - 이미지 확인 로 구현할 수 있었습니다. 그러나 이미지 크기(세로 및 가로 길이)에 대한 제한은 현재 존재하지 않습니다. 따라서 너무 큰 이미지 크기(가로 2048픽셀 등)의 파일이 업로드되면 아래와 같이 레이아웃이 손상됩니다.



ImageMagick 설정



Rails 튜토리얼을 진행하고 있는 개발 환경에서는 ImageMagick이 반드시 설치되어 있는 것은 아닙니다. 또한 ImageMagick 자체는 gem이 아니므로 Bundler의 관리 대상이 아니며 개별 환경에서 별도로 설치해야합니다. homebrew라든지 dnf라든지로 인스톨 하는 녀석이군요.

Docker의 루비 이미지는 데비안을 기반으로 구성되어 있습니다. 따라서 ImageMagick을 설치하는 명령은 다음과 같습니다.
# apt install imagemagick -y

yum 의 패키지명 (Rails 튜토리얼 본문에 기술되고 있던 것입니다)과는 달리, imagemagick 는 모두 소문자가 됩니다.

실제로 이미지 크기를 조정하도록 이미지 업로더 수정



이번은, 「화상의 종횡 어느 쪽인가가 400px를 넘고 있었을 경우, 적절한 사이즈로 축소한다. 단, 화상을 늘리는 것은 하지 않는다.」라고 하는 내용의 실장으로 합니다.

MiniMagick gem 정보



Ruby에서 ImageMagick을 사용하기위한 gem은 MiniMagick이라고합니다. gem 자체의 설치는 CarrierWave gem 설치와 동시에 완료됩니다.

Gemfile
source 'https://rubygems.org'

# ...略
gem 'carrierwave',             '1.2.2'
gem 'mini_magick',             '4.7.0'  # <-- 既にインストール済み
# ...略

group :production do
  gem 'pg',  '0.20.0'
  gem 'fog', '1.42'
end

# ...略

CarrierWave::MiniMagick 모듈 정보



CarrierWave에는 MiniMagick을 사용하는 기능이 포함되어 있습니다. 단, 해당 기능을 사용하려면 CarrierWave::MiniMagick 라는 모듈을 include 해야 합니다.
include CarrierWave::MiniMagick

이미지의 리사이즈 처리의 실체



「화상의 종횡 어느쪽이 400px를 넘고 있었을 경우, 적절한 사이즈로 축소한다. 단, 화상을 늘리지 않는다.」라고 하는 내용의 실장의 경우, 그 실체는 이하와 같이 됩니다.
process resize_to_limit: [400, 400]
process 메소드에 resize_to_limit 라는 심볼을 키로 하는 해시를 줍니다. 해시의 값에는, [縦ピクセル数, 横ピクセル数、{オプション}] 라고 하는 배열을 줍니다.

Picture 업로더 내용 변경



위를 종합하면 app/uploaders/picture_uploader.rb의 변경 내용은 다음과 같습니다.

app/uploaders/picture_uploader.rb
  class PictureUploader < CarrierWave::Uploader::Base
    # Include RMagick or MiniMagick support:
    # include CarrierWave::RMagick
-   # include CarrierWave::MiniMagick
+   include CarrierWave::MiniMagick
    process resize_to_limit: [400, 400]

    # Choose what kind of storage to use for this uploader:
    storage :file
    # storage :fog

    ...略

    # Add a white list of extensions which are allowed to be uploaded.
    # For images you might use something like this:
    def extension_whitelist
      %w(jpg jpeg gif png)
    end

    ...略
  end

좋은 웹페이지 즐겨찾기