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