Paperclip est une gem Ruby permettant de gérer les uploads de fichiers sur une application Ruby On Rails et de les relier à un modèle ActiveRecord.
L’un des intérêts de cette librairie est sa capacité à gérer l’upload d’images et leur redimensionnement en plusieurs formats. En effet Paperclip utilise la librairie ImageMagick qui est une suite logicielle permettant de créer, éditer, composer et convertir des images bitmap. ImageMagick supporte plus de 100 formats de fichiers et peut être considérée comme le couteau Suisse de la manipulation d’images.
Ceci étant posé, on peut faire à peu prêt n’importe quelle manipulation d’images via une application Ruby On Rails. Nous allons voir comment.
Lorsque l’on souhaite uploader des images via Paperclip, la librairie fournit nativement des « processors » (filtres en français) pour redimensionner les images dans une taille prédéfinie via ImageMagick. L’exemple suivant utilise Paperclip pour ajouter une image à un modèle Reference.
class Reference < ActiveRecord::Base has_attached_file :image, :styles => { :normal => "300x150" } end
Dans cet exemple, nous avons défini un attribut image auquel nous appliquons un style :normal ( via le hash styles) qui retaille l’image originale en 300px par 150px.
Imaginons désormais que dans un cas utilisateur, notre image doit non seulement être retaillée en 300×150 mais aussi que ses couleurs doivent être atténuées.
Pour cela, nous devons créer un processor Grayscale dans lequel nous allons demander à ImageMagick de faire cette manipulation. Le processor doit se trouver dans lib/paperclip_processors et se nommer grayscale.rb.
module Paperclip class Grayscale < Processor def initialize file, options = {}, attachment = nil super @file = file @current_format = File.extname(@file.path) @basename = File.basename(@file.path, @current_format) end def make dst = Tempfile.new(@basename) dst.binmode command = "-resize 300x150 -modulate 80,20,100 #{File.expand_path(@file.path)} #{File.expand_path(dst.path)}" begin success = Paperclip.run("convert", command) rescue PaperclipCommandLineError raise PaperclipError, "There was an error when transform in grayscale #{@basename}" end dst end end end
Ceci étant fait, nous devons indiquer à notre application Rails de charger les processors après son démarrage dans le fichier config/application.rb
config.after_initialize do Dir.glob(File.join(File.expand_path(Rails.root),'lib','paperclip_processors','*.rb')).each do |processor| require processor end end
Enfin, nous devons modifier le code de notre modèle Reference afin qu’il applique le processor Grayscale sur l’image que nous lui aurons envoyée :
class Reference < ActiveRecord::Base has_attached_file :image, :styles => { :normal => "300x150", :grayscale => { :processors => [:grayscale] } } end
Désormais, lorsqu’une image sera uploadée pour le modèle Reference, celle-ci sera retraitée pour être retaillée pour le style :normal et modifiée via le processor Grayscale pour le style :grayscale :
Ajouter un commentaire