-3

モデルに関数を作成して、キャリアウェーブで特定のサイズに合わせてスケーリングされたときに画像の寸法とオフセットを決定しました。

def get_auto_crop_dims(original_width, original_height, cropped_width, cropped_height)
  auto_dims = {:scale_width => 0, :scale_height => 0, :offset_x => 0, :offset_y => 0}

  # IF original image is the SAME orientation as container ie. portrait vs. portrait THEN image largest dimension = 100%
  # IF original image is the DIFFERENT orientation as container ie. portrait vs. landscape THEN image smallest dimension = 100%

  if ((cropped_height >= cropped_width and original_height >= original_width) or (cropped_height >= cropped_width and original_height <= original_width))
    # height 100%
    auto_dims[:scale_height] = cropped_height
    auto_dims[:scale_width] = (auto_dims[:scale_height]/original_height)*original_width
    auto_dims[:offset_y] = 0
    auto_dims[:offset_x] = (auto_dims[:scale_width]-cropped_width)/2
  else 
    # width 100%
    auto_dims[:scale_width] = cropped_width
    auto_dims[:scale_height] = (auto_dims[:scale_width]/original_width)*original_height
    auto_dims[:offset_x] = 0
    auto_dims[:offset_y] = (auto_dims[:scale_height]-cropped_height)/2
  end

  return auto_dims

end 

次のように呼び出されます。

dims[:title][:width], dims[:title][:height] = `identify -format "%wx%h" #{image.title.file.path}`.split(/x/)
    dims[:title].merge!(get_auto_crop_dims(dims[:original][:width].to_i, dims[:original][:height].to_i, dims[:title][:width].to_i, dims[:title][:height].to_i))

self.dimensions = dims.to_json

画像がアップロードされると、返される結果は次のとおりです。

> PageImage.last.dimensions
  PageImage Load (0.8ms)  SELECT `page_images`.* FROM `page_images` ORDER BY `page_images`.`id` DESC LIMIT 1
 => "{\"original\":{\"width\":\"1600\",\"height\":\"1200\\n\"},\"title\":{\"width\":\"960\",\"height\":\"384\\n\",\"scale_width\":960,\"scale_height\":0,\"offset_x\":0,\"offset_y\":-192},\"thumb\":{\"width\":\"220\",\"height\":\"130\\n\",\"scale_width\":220,\"scale_height\":0,\"offset_x\":0,\"offset_y\":-65}" 

問題は:

dims[:title][:scale_width] = 0 

つまり、次のような問題があります。

auto_dims[:scale_height] = (auto_dims[:scale_width]/original_width)*original_height 

私は次のように理解できません:

:scale_width = 960 & original_width = 1600 & original_height = 1200 

なぜしないdims[:title][:scale_width] = 720のですか?

4

1 に答える 1

3

Ruby で整数を除算すると、期待どおりに小数に除算されません。例えば:

  • 9 / 4= 2
  • 4 / 9= 0

に表示されているの4 / 9は、スケール幅を元の幅で割ったときに何が起こっているかを示しています。元の幅ははるかに大きい数値です。希望する 10 進数を取得するには、オペランドの 1 つが浮動小数点数でなければなりません (例4.0 / 9= 0.444...)。したがって、コードを次のように変更できます。

auto_dims[:scale_height] = (auto_dims[:scale_width].to_f/original_width)*original_height

このto_f呼び出しは、オペランドの 1 つを浮動小数点に変更するだけです。

于 2013-07-23T14:27:55.063 に答える