Ориентация изображения и проверка с помощью скрепки?
Я ищу способ определения ориентации изображения, желательно с помощью 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 градусов (вы не будете знать, каким образом они поворачивали камеру, когда они брали фотография).
Надеюсь, это поможет!