2010-10-31 6 views

Antwort

0

Sie müssen ‚RMagick‘

uploaded_image = Magick::Image.read(image).first #image is what you've specified in paperclip to be your image 
width = uploaded_image.columns 
height = uploaded_image.rows 

Nicht sicher verlangen, wie es mit den Callbacks zu arbeiten haben. Vielleicht so etwas wie:

attr_accessor :write_image_dimensions? 
before_save :check_image_changed 

def check_image_changed 
    self.write_image_dimensions? = image_changed? 
end 

after_save :write_image_dimensions, :if => :write_image_dimensions? 

def write_image_dimensions 
    uploaded_image = Magick::Image.read(image).first #image is what you've specified in paperclip to be your image 
    self.width = uploaded_image.columns 
    self.height = uploaded_image.rows 
    save 
end 
5

Wenn ein Benutzer lädt ein Bild mit Büroklammer ich sie mit folgendem Modell verarbeiten:

class Picture < ActiveRecord::Base 
    has_attached_file :pic, :styles => { :small => "100x100>" }, :whiny => true 
    after_save :save_geometry 

    def save_geometry 
    unless @geometry_saved 
     self.original_geometry = get_geometry(:original) 
     self.small_geometry = get_geometry(:small) 
     @geometry_saved = true 
     self.save 
    end 
    end 

    def get_geometry(style = :original) 
    begin 
     Paperclip::Geometry.from_file(pic.path(style)).to_s 
    end 
    end 
end 

Die get_geometry Funktion ruft ImageMagick identify die Geometrie der ursprünglichen und verkleinerten Bilder zu finden .

Ich Cache die Ergebnisse in einem Datenbankfeld. Zum Beispiel, wenn ich ein Bild hochgeladen, die 1024x768 meine gecached Felder war, würden enthalten:

original_geometry = "1024x768" 
small_geometry = "100x75" 
61

Nur aus Gründen der Vollständigkeit, auch wenn bereits frühere Antworten gut genug Vorschläge zeigen.

Sie können Paperclip-Event-Handler anstelle von Rails-Callbacks verwenden. In diesem Fall wird die Größe nur neu berechnet, wenn sich das Bild ändert. (Wenn Sie S3 verwenden für die Lagerung, kann dies durchaus einige Zeit sparen)

has_attached_file :image, :styles => ... 
after_post_process :save_image_dimensions 

def save_image_dimensions 
    geo = Paperclip::Geometry.from_file(image.queued_for_write[:original]) 
    self.image_width = geo.width 
    self.image_height = geo.height 
end 

Bild nicht einmal von S3 heruntergeladen werden (oder aus einer Datei gelesen), Büroklammer liefert es an Event-Handler selbst .

Weitere Informationen finden Sie unter Ereignisse Abschnitt von .

+0

heruntergeladen 2 Edelsteine ​​bereits versuchen (und scheitern), dies zu erreichen. Ich wünschte, ich hätte diesen einfachen Ausschnitt zuerst gefunden. Vielen Dank :) – goggin13

+0

Das hat perfekt funktioniert. Danke mein guter Herr! – Kirk

0

Mit Rails 4 Ich verwende den folgenden Concern Bildabmessungen zu speichern:

module Dimensions 

     extend ActiveSupport::Concern 

     included do 

     end 

     module ClassMethods 

     def extract_dimensions_for *fields 

      define_method(:extract_dimensions_field_list) { fields } 

      before_save :extract_dimensions 

      fields.each do |f| 
      serialize (f.to_s+"_dimensions"), Hash 

      class_eval do 

       [:width, :height].each do |axis| 
       define_method("#{f}_#{axis}") do 
        return send(f.to_s+"_dimensions")[axis] 
       end 
       end 

       define_method("#{f}_dimensions_max") do |width, height=nil| 
       dims = send(f.to_s+"_dimensions") 
       rw = width.to_f/dims[:width] 
       rh = height.to_f/dims[:height] if height 
       r = (!height || rw < rh) ? rw : rh 
       return {width: (dims[:width] * r).to_i, height: (dims[:height] * r).to_i} 
       end 

       define_method("#{f}_is_portrait?") do 
       dims = send(f.to_s+"_dimensions") 
       return dims[:width] <= dims[:height] 
       end 

       define_method("#{f}_is_landscape?") do 
       dims = send(f.to_s+"_dimensions") 
       return dims[:width] > dims[:height] 
       end 

      end 

      end 

      class_eval do 

      def extract_dimensions 

       extract_dimensions_field_list.each do |f| 

       tempfile = send(f).queued_for_write[:original] 
       unless tempfile.nil? 
        geometry = Paperclip::Geometry.from_file(tempfile) 
        self.send(f.to_s+"_dimensions=", {width: geometry.width.to_i, height: geometry.height.to_i}) 
       end 

       end 

      end 

      end 

     end 

     end 


    end 

Dann in Ihrem Modell:

... 

include Dimensions 

extract_dimensions_for :image 

... 

dies Ihre Dimensionen auf eine serialisierte Feld image_dimensions genannt sparen sowie Fügen Sie ein paar andere Methoden image_width, image_height und image_dimensions_max(width, height)

0

Ich fand die einfachste Lösung ion: Fastimage gem (link)

Es ist schnell und sehr, sehr einfach. Beispiel:

require 'fastimage' 

FastImage.size("/some/local/file.gif") 
=> [266, 56] # width, height 
FastImage.type("/some/local/file.gif") 
=> :gif 
0

Die Büroklammer-Metaedelsteine ​​Caches Bildabmessungen und Dateigröße für alle Bildarten. Es ist in der Paperclip README verwiesen. Der Paperclip-Meta Repo ist hier: https://github.com/teeparham/paperclip-meta

Verwandte Themen