我正在努力对上传的图片进行简单的旋转+调整大小,但前提是它只是横向格式。否则,我只想调整图像大小。我也想这样做同时保持版本名称相同(没有“中等”和“medium_rotated”)到目前为止,我有旋转工作,但问题是如果我上传非景观图像,它不工作。它仅适用于景观图像。到目前为止,这是我的代码的相关部分。有什么想法吗?
-Benny
class FloorPlanPhotoUploader < CarrierWave::Uploader::Base
....
version :medium, :if => :is_landscape? do
process :rotate_cw
end
version :medium do
process :resize_and_pad => [ 260, 360, :white, 'Center']
end
def is_landscape? picture
file = (picture.is_a? CarrierWave::Storage::Fog::File) ? picture.public_url : picture.file
image = MiniMagick::Image.open(file)
image[:width] > image[:height]
end
def rotate_cw
manipulate! do |img|
img.rotate "90>"
img = yield(img) if block_given?
img
end
end
....
end
答案 0 :(得分:3)
问题是您已经定义了:medium
版本两次。它击中了:
..., :if => is_landscape?
部分,用于非风景图像返回false。结果,什么也没做。你在那里的version :medium
的第二个声明永远不会被运行,因为你不能声明两个版本具有相同名称的版本,所以它只是完全被跳过。
您需要做的只是生成一个名为:medium
的版本,并有条件地处理顺时针旋转。类似的东西:
class FloorPlanPhotoUploader < CarrierWave::Uploader::Base
...
version :medium do
process :rotate_cw, :if => :is_landscape?
process :resize_and_pad => [ 260, 360, :white, 'Center']
end
...
end
您可以通过这种方式在单个版本中链接多个处理步骤。这里is a great tutorial更深入地讨论了这一主题。
答案 1 :(得分:1)
这是解决方案:
version :medium do
process :rotate_cw, if: ->( uploader, args ) { uploader.model.is_landscape? }
process :resize_and_pad => [ 260, 360, :white, 'Center']
end