Retraitement des images des différentes versions dans Carrierwave
À l'aide de Carrierwave, j'ai créé 3 versions d'un avatar - un original, d'une small_thumb et un large_thumb en utilisant les lignes suivantes:
process :resize_to_limit => [400, 400]
version :big_thumb do
process :resize_to_limit => [80, 80]
end
version :small_thumb do
process :resize_to_limit => [50, 50]
end
J'ai ajouté une méthode supplémentaire dans mon AvatarUploader classe:
def reprocess(x,y,w,h)
manipulate! do |img|
img.crop(x.to_i, y.to_i, w.to_i, h.to_i, true)
end
resize_to_limit(180,180)
end
qui est appelée de mon modèle après une mise à jour est effectuée:
attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
after_update :reprocess_image, :if => :cropping?
def cropping?
!crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
end
private
def reprocess_image
image.reprocess(crop_x,crop_y,crop_w,crop_h)
end
J'ai réussi à découper et redimensionner la version originale, mais je n'arrive pas à mettre à jour le 2 vignettes avec elle. J'ai essayé quelques techniques en vain.
Des suggestions?
Vous devez vous connecter pour publier un commentaire.
Essayer
Désolé, la ligne de bus. Je ne peux pas préciser.
Model.all.each {|m| m.avatar.recreate_versions!}
Sera excellent travail si vous avez ajouté une nouvelle version d'un modèle de pré-enregistrements existants.save
sur le modèle. Au moins je l'ai fait. Peut dépendre de configuration de votre application... donc quelque chose comme cela a fonctionné pour moi:Model.all.each {|m| m.avatar.recreate_versions!; m.save! }
Vous devez appeler
image.cache_stored_file!
avant d'appelerrecreate_versions!
C'est bizarre, parce que la méthode elle-même appelle que si le fichier est mis en cache, mais pour quelque raison il ne fonctionnait pas.
Alors que ce serait quelque chose comme:
Ce HowTo a été le plus utile pour moi (même si je n'utilise pas de brouillard):
https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Recreate-and-reprocess-your-files-stored-on-fog
J'ai ajouté un retraiter méthode sur mon modèle, puis l'a appelé pour chaque boucle dans ma tâche rake:
Râteau:
task :reprocess_photos => :environment do
MyModel.all.each{|mm| mm.reprocess}
end
PS: Rails 4.2
Je n'ai pas essayé, mais peut-être mettre quelque chose comme.
cochez cette dernière RailsCast:
http://railscasts.com/episodes/182-cropping-images-revised
après le recadrage d'une version de l'image, vous pouvez alors calculer le recadrage coordonnées pour les autres versions, ou probablement plus facile, de l'échelle en bas de l'image recadrée avec les mêmes proportions que les autres versions de l'image d'origine