2012-05-08 9 views
13

Vorrei usare jpegoptim o optipng per comprimere l'immagine caricata dagli utenti tramite Paperclip.Post processo graffetta - Come comprimere l'immagine usando jpegoptim/optpng

ho un modello Paperclip configurato come:

has_attached_file :image, 
        :styles => {:thumb => '50x50>', :preview => '270x270>' }, 
        :url => "/system/:class/:attachment/:id/:basename_:style.:extension", 
        :path => ":rails_root/public/system/:class/:attachment/:id/:basename_:style.:extension" 

Domanda 1: E 'possibile comprimere l'immagine originale caricato da utente, quindi lasciate Paperclip ridimensionarlo, quindi non c'è un solo processo impacco? E come si fa?

Domanda 2: ho intenzione di farlo attraverso il after_post_process callback, e ho potuto ottenere tutte le istanze di tre file da image.queued_for_write e vorrei far scattare jpegoptim/optipng dall'estensione del file, ma quando uso current_format = File.extname(file.path) , Ho qualcosa di simile: .jpg20120508-7991-cqcpf2. C'è via per ottenere la stringa di estensione jpg? o è sicuro che io controlli solo se la stringa di estensione è contenuta in quella stringa?

+0

tutte le notizie su questa domanda? – CharlieMezak

+0

@CharlieMezak Ho incollato i miei come risposta poiché non ci sono altre risposte. Potrei non essere il migliore e sono molto contento di sapere se avete commenti in merito. Grazie. – larryzhao

risposta

4

Poiché non ci sono altre risposte, ecco come lo faccio nel mio progetto e sembra che stia funzionando bene da diversi mesi.

class AttachedImage < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 

    validates_attachment_presence :image 
    validates_attachment_content_type :image, :content_type=>['image/jpeg', 'image/png', 'image/gif'] 

    has_attached_file :image, 
        :styles => {:thumb => '50x50>', :preview => '270x270>' }, 
        # :processors => [:image_compressor], 
        :url => "/system/:class/:attachment/:id/:basename_:style.:extension", 
        :path => ":rails_root/public/system/:class/:attachment/:id/:basename_:style.:extension" 


    after_post_process :compress 

    private 
    def compress 
    current_format = File.extname(image.queued_for_write[:original].path) 

    image.queued_for_write.each do |key, file| 
     reg_jpegoptim = /(jpg|jpeg|jfif)/i 
     reg_optipng = /(png|bmp|gif|pnm|tiff)/i 

     logger.info("Processing compression: key: #{key} - file: #{file.path} - ext: #{current_format}") 

     if current_format =~ reg_jpegoptim 
     compress_with_jpegoptim(file) 
     elsif current_format =~ reg_optipng 
     compress_with_optpng(file) 
     else 
     logger.info("File: #{file.path} is not compressed!") 
     end 
    end 
    end 

    def compress_with_jpegoptim(file) 
    current_size = File.size(file.path) 
    Paperclip.run("jpegoptim", "-o --strip-all #{file.path}") 
    compressed_size = File.size(file.path) 
    compressed_ratio = (current_size - compressed_size)/current_size.to_f 
    logger.debug("#{current_size} - #{compressed_size} - #{compressed_ratio}") 
    logger.debug("JPEG family compressed, compressed: #{ '%.2f' % (compressed_ratio * 100) }%") 
    end 

    def compress_with_optpng(file) 
    current_size = File.size(file.path) 
    Paperclip.run("optipng", "-o7 --strip=all #{file.path}") 
    compressed_size = File.size(file.path) 
    compressed_ratio = (current_size - compressed_size)/current_size.to_f 
    logger.debug("#{current_size} - #{compressed_size} - #{compressed_ratio}") 
    logger.debug("PNG family compressed, compressed: #{ '%.2f' % (compressed_ratio * 100) }%") 
    end        
end 
1

Potrebbe essere un compromesso di prestazioni ma ho ottenuto immagini meglio compresse con FFMPEG o AVCONV.

sudo apt-get install ffmpeg 

= inizializzazione

Paperclip.options[:command_path] = "/usr/bin/" # see `which ffmpeg` 

= modale

after_save :compress_with_ffmpeg 

def compress_with_ffmpeg 
    [:thumb, :original, :medium].each do |type| 
    img_path = self.avtar.path(type) 
    Paperclip.run("ffmpeg", " -i #{img_path} #{img_path}") 
    end 
end 

mi sono immagine 1.7MB compressa a 302.9KB !!!