اتجاه الصورة والتحقق من الصحة مع paperclip؟
-
18-09-2019 - |
سؤال
أبحث عن وسيلة لتحديد اتجاه الصورة ويفضل أن يكون مع paperclip، ولكن هل من الممكن أو أحتاج إلى المستخدم RMAGICK أو مكتبة صور أخرى لهذا الغرض؟
سيناريو Case: عندما يقوم المستخدم بتحميل صورة أريد التحقق من الاتجاه / الحجم / الأبعاد لتحديد ما إذا كانت الصورة موجودة في صورة / أفقي أو مربع وحفظ هذه السمة إلى النموذج.
المحلول
إليك ما أقوم به عموما في نماذج الصور الخاصة بي. ربما سوف يساعد:
- يمكنني استخدام خيار IM's - Orient عند التحويل. هذا يضمن أن يتم تدوير الصور دائما بشكل صحيح بعد التحميل
- قرأت ال exif البيانات بعد المعالجة والحصول على العرض والارتفاع (من بين أشياء أخرى)
- يمكنك بعد ذلك الحصول على طريقة مثيل تنتج سلسلة الاتجاه بناء على العرض والارتفاع
has_attached_file :attachment,
:styles => {
:large => "900x600>",
:medium => "600x400>",
:square => "100x100#",
:small => "300x200>" },
:convert_options => { :all => '-auto-orient' },
:storage => :s3,
:s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
:s3_permissions => 'public-read',
:s3_protocol => 'https',
:path => "images/:id_partition/:basename_:style.:extension"
after_attachment_post_process :post_process_photo
def post_process_photo
imgfile = EXIFR::JPEG.new(attachment.queued_for_write[:original].path)
return unless imgfile
self.width = imgfile.width
self.height = imgfile.height
self.model = imgfile.model
self.date_time = imgfile.date_time
self.exposure_time = imgfile.exposure_time.to_s
self.f_number = imgfile.f_number.to_f
self.focal_length = imgfile.focal_length.to_s
self.description = imgfile.image_description
end
نصائح أخرى
شكرا للإجابة jonnii.
على الرغم من أنني وجدت ما كنت أبحث عنه في وحدة الورق :: هندسة الهندسة.
هذا عمل عمل:
class Image < ActiveRecord::Base
after_save :set_orientation
has_attached_file :data, :styles => { :large => "685x", :thumb => "100x100#" }
validates_attachment_content_type :data, :content_type => ['image/jpeg', 'image/pjpeg'], :message => "has to be in jpeg format"
private
def set_orientation
self.orientation = Paperclip::Geometry.from_file(self.data.to_file).horizontal? ? 'horizontal' : 'vertical'
end
end
هذا بالطبع يجعل كل من الصور الرأسية والراحة تحتوي على السمة الرأسي، لكن هذا ما أردت على أي حال.
عندما أتناول صورة مع الكاميرا، فإن أبعاد الصورة هي نفسها بصرف النظر إذا كانت الصورة مشهد أو صورة. ومع ذلك، فإن الكاميرا ذكية بما يكفي لتدوير الصورة بالنسبة لي! كيف مدروس! الطريقة التي يستخدمها هذا العمل هذا ما يسمى exif data
وهي بيانات التعريف التي وضعت على الصورة بواسطة الكاميرا. يشمل أشياء مثل: نوع الكاميرا، عند أخذ الصورة، اتجاه إلخ...
مع PaperClip، يمكنك إعداد عمليات الاسترجاعات، وتحديدا ما تريد القيام به هو الحصول على رد اتصال before_post_process
التي تتحقق من اتجاه الصورة من خلال قراءة بيانات Exif باستخدام مكتبة (يمكنك العثور على قائمة هنا: http://blog.simplicitator.com/2008/01/14/ruby-and-exif-data/)، ثم تدوير الصورة في اتجاه عقارب الساعة أو عكس اتجاه عقارب الساعة 90 درجة (لن تعرف بأي طريقة تدور الكاميرا عندما أخذت الصورة).
آمل أن يساعد هذا!