2011-07-20 116 views
3

我有一个CarrierWave ImageUploader,它创建了一个需要根据我的模型(crop_x,crop_y,crop_w和crop_h)中的值裁剪的原始图像的几个版本。Carrierwave裁剪

class ImageUploader < CarrierWave::Uploader::Base 

    include CarrierWave::MiniMagick 
    ... 
    version :t do 
    process :cropper 
    process :resize_to_fill => [75, 75] 
    end 
    ... 
    def cropper 
    manipulate! do |img| 
     img = img.crop "#{model.crop_x}x#{model.crop_y}+#{model.crop_w}+#{model.crop_h}" 
     img 
    end 
    end 

end 

说我遇到的问题是,我需要计算一些默认值裁剪,如果我们没有任何一组,但我不知道在哪里把这个逻辑。我试图把它放在我的照片模型(上传器被安装到)before_validation中,但这似乎是在裁剪函数执行后调用的。我在想它或者需要在ImageUploader文件中,或者在创建拇指之前发生的一些回调中。

+0

看看这个http://stackoverflow.com/questions/5985079/carrierwave-crop-specific-version – makaroni4

+0

检查这个最新的RailsCast:http://railscasts.com/episodes/182-cropping-images-revised – Tilo

回答

9

你可以做这样的事情:

process :cropper 

def cropper 
    manipulate! do |img| 
    if model.crop_x.blank? 
     image = MiniMagick::Image.open(current_path) 
     model.crop_w = (image[:width] * 0.8).to_i 
     model.crop_h = (image[:height] * 0.8).to_i 
     model.crop_x = (image[:width] * 0.1).to_i 
     model.crop_y = (image[:height] * 0.1).to_i 
    end 
    img.crop "#{model.crop_w}x#{model.crop_h}+#{model.crop_x}+#{model.crop_y}" 
    end 
end 

我在我的应用程序的一个运行的代码等同于。

+1

你救了我的一天! – Kir

+0

我认为你可能有一个小的错字,第一个model.crop_y应该是model.crop_h –

+0

'ArgumentError(错误的参数数目(3,4或5的1))'。我认为你的'img.crop'与我的不一样... –