2010-05-04 6 views
16

Intentando obtener el ancho y el alto de la imagen cargada mientras aún está en el modelo en el guardado inicial.Obtención de ancho y alto de la imagen en el modelo en el clip de papel Ruby GEM

¿Alguna forma de hacerlo?

Aquí está el fragmento de código con el que he estado probando desde mi modelo. Por supuesto, falla en "instance.photo_width".

has_attached_file :photo, 
         :styles => { 
         :original => "634x471>", 
         :thumb => Proc.new { |instance|      
            ratio = instance.photo_width/instance.photo_height 
            min_width = 142 
            min_height = 119 
            if ratio > 1 
            final_height = min_height 
            final_width = final_height * ratio 
            else 
            final_width = min_width 
            final_height = final_width * ratio 
            end 
            "#{final_width}x#{final_height}" 
           } 
        }, 
        :storage => :s3, 
        :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
        :path => ":attachment/:id/:style.:extension", 
        :bucket => 'foo_bucket' 

Así que estoy básicamente tratando de hacer esto para conseguir una anchura y altura miniatura personalizada en función de las dimensiones iniciales de imagen.

¿Alguna idea?

Respuesta

25

Ahh, lo descubrí. Solo necesitaba hacer un proceso.

Aquí está el código de mi modelo:

class Submission < ActiveRecord::Base 

    #### Start Paperclip #### 

    has_attached_file :photo, 
        :styles => { 
         :original => "634x471>", 
         :thumb => Proc.new { |instance| instance.resize } 
        }, 
        :storage => :s3, 
        :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
        :path => ":attachment/:id/:style.:extension", 
        :bucket => 'foo_bucket' 

    #### End Paperclip #### 

    def resize  
    geo = Paperclip::Geometry.from_file(photo.to_file(:original)) 

    ratio = geo.width/geo.height 

    min_width = 142 
    min_height = 119 

    if ratio > 1 
     # Horizontal Image 
     final_height = min_height 
     final_width = final_height * ratio 
     "#{final_width.round}x#{final_height.round}!" 
    else 
     # Vertical Image 
     final_width = min_width 
     final_height = final_width * ratio 
     "#{final_height.round}x#{final_width.round}!" 
    end 
    end 
end 
+0

Gracias, esto me ayudó a conseguir el heigh imagen que me permitió poner dinámicamente una restricción heigh en un div que celebró una imagen y detuvo a los divs de cambio de tamaño cuando la página se recarga :) – s84

+0

¿Han tratado de hacer que esto funcione cuando está utilizando el almacenamiento de Amazon S3? Su método funciona muy bien para cosas almacenadas localmente, pero cuando lo probé en algo almacenado en S3, recibí un error que decía que el comando 'identificar' no reconoce el objeto. ¿Alguna idea? ¡Gracias! – wuliwong

+0

Solo para dar seguimiento, encontré esto http://stackoverflow.com/questions/3160788/can-paperclip-read-photo-geometry-off-an-s3-bucket Y ahora que vuelvo a leer su ejemplo, veo que incluye el .to_file que lo hace funcionar con el almacenamiento S3. Básicamente, solo pretenden que nunca dije nada. ¡Gracias! – wuliwong

0
class Asset 

include Mongoid::Paperclip 
before_save :extract_dimensions 

field :width, type: Integer 
field :height, type: Integer 

has_mongoid_attached_file :data 

    def extract_dimensions 
    return unless is_image? 

    tempfile = data.queued_for_write[:original] 
    unless tempfile.nil? 
     geometry = Paperclip::Geometry.from_file(tempfile) 
     self.width = geometry.width.to_i 
     self.height = geometry.height.to_i 
    end 

    true # wont save if false 
    end 

    def is_image? 
    data_content_type =~ %r{^(image|(x-)?application)/(bmp|gif|jpeg|jpg|pjpeg|png|x-png)$} 
    end 

end 
Cuestiones relacionadas