Ориентация изображения и проверка с помощью скрепки?

Я ищу способ определения ориентации изображения, желательно с помощью Paperclip, но возможно ли это или мне нужно для пользователя RMagick или другой библиотеки изображений для этого?

Случайный сценарий: когда пользователь загружает изображение, я хочу проверить ориентацию/размер/размеры, чтобы определить, находится ли изображение в портретном/альбомном или квадратном, и сохранить этот атрибут в модели.

Ответ 1

Вот что я обычно делаю в своих моделях изображений. Возможно, это поможет:

  • При конвертации я использую параметр IM -auto-orient. Это гарантирует, что изображения будут правильно повернуты после загрузки.
  • Я прочитал EXIF ​​data после обработки и получил ширину и высоту (между прочим)
  • Затем вы можете просто иметь метод экземпляра, который выводит строку ориентации на основе ширины и высоты
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

Ответ 2

Спасибо за ответ jonnii.

Хотя я нашел то, что искал в модуле PaperClip:: Geometry.

Это сработало найти:

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

Это, конечно, означает, что вертикальные и квадратные изображения имеют вертикальный атрибут, но то, что я хотел в любом случае.

Ответ 3

Когда я снимаю фото с камеры, размеры изображения одинаковы независимо от того, является ли фотография пейзажной или портретной. Тем не менее, моя камера достаточно умна, чтобы повернуть изображение для меня! Как задумчиво! То, как эта работа работает, это то, что называется exif data, которое представляет собой метаданные, размещенные на изображении камерой. Он включает в себя такие вещи, как: тип камеры, когда была сделана фотография, ориентация и т.д.

С помощью paperclip вы можете настроить обратные вызовы, в частности, то, что вы хотите сделать, это иметь обратный вызов на before_post_process, который проверяет ориентацию изображения, считывая данные exif с помощью библиотеки (здесь вы можете найти список: http://blog.simplificator.com/2008/01/14/ruby-and-exif-data/), а затем поверните изображение по часовой стрелке или против часовой стрелки на 90 градусов (вы не будете знать, каким образом они поворачивали камеру, когда они брали фотография).

Надеюсь, это поможет!