سؤال

أبحث عن وسيلة لتحديد اتجاه الصورة ويفضل أن يكون مع 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 درجة (لن تعرف بأي طريقة تدور الكاميرا عندما أخذت الصورة).

آمل أن يساعد هذا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top