0

CarrierWave を使用しており、画像のサイズを幅 220px、最大高さ 220px に変更したいと考えています。私が使用process :resize_to_fit => [220,220]すると、幅が220pxではない可能性があります。私に何ができる?

4

2 に答える 2

3

質問を正しく解釈すると:

  • 縦長の画像 (幅 480 ピクセル、高さ 640 ピクセルなど) の場合、幅 220 ピクセルに縮小してから、高さ 220 ピクセルにトリミングすると、正方形の画像になります。

  • 横長の画像の場合は、幅を 220 ピクセルに縮小します (したがって、高さは 220 ピクセル未満になります)。

そうであれば、次の 2 段階のプロセスが必要です。

  1. アスペクト比を維持したまま、幅 220px にサイズ変更します
  2. 高さ 220px にトリミング (縦長の場合)

manipulate!コマンドを使用して独自のプロセッサを作成することで、これを行うことができます(インスピレーションについては、 CarrierWave 独自のものを参照してください)。

これはおおよそあなたが求めているものだと思います

process :resize => [220, 220]

protected

def resize(width, height, gravity = 'Center')
  manipulate! do |img|
    img.combine_options do |cmd|
      cmd.resize width.to_s
      if img[:width] < img[:height]
        cmd.gravity gravity
        cmd.background "rgba(255,255,255,0.0)"
        cmd.extent "#{width}x#{height}"
      end
    end
    img = yield(img) if block_given?
    img
  end
end
于 2013-01-09T15:23:32.500 に答える
2

Andy Hの回答の改善:

process :resize => [220, 220]

protected

def resize(width, height, gravity = 'Center')
  manipulate! do |img|
    img.combine_options do |cmd|
      cmd.resize "#{width}"
      if img[:width] < img[:height]
        cmd.gravity gravity
        cmd.background "rgba(255,255,255,0.0)"
        cmd.extent "#{width}x#{height}"
      end
    end
    img = yield(img) if block_given?
    img
  end
end
于 2013-01-09T19:25:30.023 に答える