Image resizing
前一節對圖片大小的限制是個好的開始,不過使用者還是會上傳尺寸很大的圖片,造成網站跑版,因此,如果允許使用者從本機上傳尺寸很大的圖片,最好在顯示圖片之前調整圖片的尺寸。
圖片尺寸太大造成跑版:

我們要使用 ImageMagick 調整圖片尺寸,所以要在 development 環境安裝這個程式。(在 Section 11.4.4 可以看到 Heroku 已經預先裝好)在雲端 IDE 可以使用下面指令安裝:
$ sudo apt-get update
$ sudo apt-get install imagemagick --fix-missing
在 official Ubuntu documentation 有說明如何安裝。如果不是使用雲端 IDE 或是使用 Linux,可以搜尋「imagemagick
」。在 OS X,如果安裝了 Homebrew,可以執行 brew install imagemagick指令安裝。
接著,我們要在 CarrierWave 中引入 MiniMagick 為 ImageMagick 提供的介面,還要調用一個調整尺寸的方法。在 MiniMagick documentation 中列出很多調整尺寸的方法,不過我們只需要 resize_to_limit: [400, 400] 這個方法,如果圖片很大,就把它調整為寬高都不超過 400px,而小於這個尺寸的圖片則不調整。
在 CarrierWave documentation on MiniMagick 中列出的方法會把小圖片放大(如果尺寸不到的話),但這不是我們想要的效果。
以下為完整程式碼:
app/uploaders/picture_uploader.rb
class PictureUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process resize_to_limit: [400, 400]
storage :file
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Add a white list of extensions which are allowed to be uploaded.
def extension_white_list
%w(jpg jpeg gif png)
end
end
可以試著上傳寬高超過 400px 的圖片看看:

不過這樣好像也相對壓縮、破壞圖片品質...