2011-07-20 4 views
3

J'ai un CarrierWave ImageUploader qui crée deux versions d'une image originale qui doivent être recadrées en fonction des valeurs de mon modèle (crop_x, crop_y, crop_w et crop_h).Carrierwave Cropping

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 

Le problème que je vais avoir est que je dois calculer des valeurs de culture par défaut si nous n'avons pas ensemble, mais je ne sais pas où mettre cette logique. J'ai essayé de mettre ceci dans mon modèle Photo (sur lequel le téléchargeur est monté) dans une before_validation mais cela semble être appelé après l'exécution de la fonction cropper. Je pense que soit il doit être dans le fichier ImageUploader, ou dans un rappel qui se produit avant que les pouces soient créés.

+0

Jetez un coup d'oeil à ce http://stackoverflow.com/questions/5985079/carrierwave-crop-specific-version – makaroni4

+0

consultez cette dernière RailsCast: http://railscasts.com/episodes/182-cropping-images-revised – Tilo

Répondre

9

Vous pouvez faire quelque chose comme ceci:

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 

Je suis en code équivalent à celui de l'un de mes applications.

+1

Vous avez sauvé ma journée! – Kir

+0

Je pense que vous pouvez avoir une petite faute de frappe, où le premier model.crop_y devrait être model.crop_h –

+0

'ArgumentError (nombre incorrect d'arguments (1 pour 3, 4 ou 5))'. Je pense que votre 'img.crop' n'est pas le même que le mien ... –