Créer des filtres personnalisés avec Paperclip

Ruby On Rails
Par mick
21 novembre 2011
Paper CLip et Image Magick

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 :

Image retaillée automatique en style normal à 300x150

Image retaillée automatiquement en style normal à 300x150

Image retravaillée pour obtenir un effet niveaux de gris

Image retravaillée pour obtenir un effet niveaux de gris

Ajouter un commentaire

Articles similaires