Alle Paperclip-Assistenten da draußen wissen, wenn Sie mit Paperclip ein Bild speichern können, speichern Sie auch die Bildmaße (Breite und Höhe) in 2 zusätzlichen Feldern? Wie erhalten Sie solche Daten während des Uploadprozesses von Paperclip? obwohlSpeichern der Bilder Abmessungen (Breite und Höhe) in Paperclip?
Antwort
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
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"
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 .
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)
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
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
- 1. Breite und Höhe des Bildes im Modell in der Ruby Paperclip GEM
- 2. Finden Sie die Abmessungen (Höhe, Breite) eines Objekts mit Kamera
- 3. Imagemagick - Größe der Bilder auf 25px Höhe und Seitenverhältnis
- 4. Twitter Bootstrap: Haben Karussell Bilder volle Breite und Höhe
- 5. setBound Breite und Höhe
- 6. Bildmanipulation Breite und Höhe
- 7. Bootstrap Karussell Breite und Höhe
- 8. Blob Image mit Breite und Höhe speichern VB.Net, MySQL
- 9. WPF Position und Abmessungen falsch
- 10. Paperclip gem zeigt keine Bilder
- 11. Get Bitmap Breite und Höhe ohne Laden in den Speicher
- 12. Bild in der Datenbank speichern mit Rails Paperclip-Plugin
- 13. Responsive iframe mit maximaler Breite und Höhe
- 14. WPF Bild Breite und Höhe Verhältnis
- 15. Wie die Größe der Bilder zu erhöhen bedeutet die Höhe und Breite der Bilder in android Galerie Streifen
- 16. PHP getimagesize() mischt Breite und Höhe
- 17. Get image Höhe und Breite
- 18. Usercontrol Runtime Breite und Höhe
- 19. Browser-Größe (Breite und Höhe)
- 20. JavaFX Browser Breite und Höhe
- 21. Breite und Höhe eines WatchViewStub
- 22. UIImageView ändern Breite und Höhe
- 23. XNA: Bildschirm Breite und Höhe
- 24. tkinter Taste Höhe und Breite
- 25. HTML 'td' Breite und Höhe
- 26. bekommen gtkimage Breite und Höhe
- 27. Breite und Höhe des FortschrittsView
- 28. Bilder innerhalb Posts Größe nach und nach in Nullen Breite und Höhe in Android Browser
- 29. Breite entsprechend der Höhe einstellen
- 30. Schienen und Paperclip, die Bilder in einem bestimmten Pfad speichern, setzen falsche URL
heruntergeladen 2 Edelsteine bereits versuchen (und scheitern), dies zu erreichen. Ich wünschte, ich hätte diesen einfachen Ausschnitt zuerst gefunden. Vielen Dank :) – goggin13
Das hat perfekt funktioniert. Danke mein guter Herr! – Kirk