Qualsiasi mago Paperclip là fuori sa se puoi usare Paperclip per salvare un'immagine, salvare anche le dimensioni dell'immagine (larghezza e altezza) in 2 campi extra? Come si ottengono tali dati durante il processo di caricamento di Paperclip?Salvataggio delle immagini Dimensioni (larghezza e altezza) in Graffetta?
risposta
Sarà necessario richiedere '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
Non sai come farlo lavorare con i callback, però. Forse qualcosa di simile:
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
Quando un utente carica un'immagine con graffetta ho elaborarlo con il seguente modello:
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
La funzione get_geometry
chiamate ImageMagick identify
per trovare la geometria delle immagini originali e ridimensionate .
Memorizzo i risultati in un campo del database. Per esempio, se ho caricato un'immagine che era 1024x768
miei campi memorizzati nella cache potrebbero contenere:
original_geometry = "1024x768"
small_geometry = "100x75"
Solo per ragioni di completezza, anche se le risposte precedenti mostrano già abbastanza buoni suggerimenti.
È possibile utilizzare i gestori di eventi di Paperclip anziché i callback di Rails. In questo caso, le dimensioni verranno ricalcolate solo quando l'immagine cambia. (Se stai usando S3 per lo storage, questo può risparmiare un bel po 'di tempo)
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
Immagine non hanno nemmeno bisogno di essere scaricato da S3 (o leggere da un file), graffetta fornisce al gestore di eventi per sé .
Vedere sezione di the readme per dettagli.
Uso Rails 4 Io uso il seguente Preoccupazione per salvare le dimensioni delle immagini:
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
Poi nel modello:
...
include Dimensions
extract_dimensions_for :image
...
Ciò salvare le dimensioni per un campo serializzato chiamato image_dimensions
così come aggiungendo qualche altro metodo image_width
, image_height
e image_dimensions_max(width, height)
Ho trovato il solut più semplice ione: Fastimage gem (link)
È veloce e molto, molto semplice. Esempio:
require 'fastimage'
FastImage.size("/some/local/file.gif")
=> [266, 56] # width, height
FastImage.type("/some/local/file.gif")
=> :gif
La gemma graffetta-meta memorizza nella cache le dimensioni dell'immagine e la dimensione del file per tutti gli stili di immagine. Si è fatto riferimento nel README Paperclip. Il repository paperclip-meta è qui: https://github.com/teeparham/paperclip-meta
- 1. Cursore delle immagini con altezza non definita
- 2. itextsharp e dimensioni immagini
- 3. PHP getimagesize() mescola larghezza e altezza
- 4. notazioni graffetta dimensioni dell'immagine
- 5. Impostazione larghezza e altezza
- 6. Larghezza e altezza personalizzate in DOMPDF
- 7. UICollectionViewFlowLayout spazio vuoto con larghezza e altezza delle celle variabili
- 8. Come ottenere larghezza e altezza variabili durante il ritaglio con Jcrop e salvataggio con PHP GD
- 9. Imagemagick - Ridimensiona le immagini a 25px in altezza e proporzioni
- 10. Graffetta cambia percorso delle immagini dopo l'aggiornamento alle guide 3.2
- 11. Altezza e larghezza totali SVG
- 12. compressione delle immagini in base alle dimensioni - iPhone SDK
- 13. Come rimuovere altezza e larghezza?
- 14. Limitazione delle dimensioni dell'immagine con larghezza massima e altezza massima a seconda di quale è vero prima
- 15. Larghezza e altezza automatiche per immagine SVG
- 16. modifica altezza e larghezza dell'immagine in Android
- 17. Impostazione larghezza e altezza DIV in JavaScript
- 18. Come cambiare AVCaptureVideoPreviewLayer altezza e la larghezza
- 19. Ridimensionamento proporzionale delle immagini in CSS con larghezza massima
- 20. Carrierwave - Ridimensionamento delle immagini a larghezza fissa
- 21. Larghezza di carosello di bootstrap e altezza
- 22. Salvataggio di immagini in Neo4J
- 23. Misura larghezza e altezza dell'elemento Html in Dart
- 24. Caricamento immagine in ImageSource - larghezza e altezza errate
- 25. Dimensioni e altezza del display errate in Android
- 26. Android: larghezza e altezza massime consentite della bitmap
- 27. GetSupportedPreviewSize restituisce larghezza e altezza inversa
- 28. Come ottenere larghezza e altezza grezza del dispositivo o larghezza e altezza effettive dello schermo?
- 29. Dimensioni e nomi delle icone e avvio delle immagini in Xcode 5, ios 7
- 30. anteprime rigeneranti con graffetta a graffetta
scaricato 2 gemme già da provare (e fallire) per raggiungere questo obiettivo. Vorrei aver trovato questo semplice frammento prima. Molte grazie :) – goggin13
Questo ha funzionato perfettamente. Grazie, mio buon signore! – Kirk