Получить размеры изображения с помощью Refile

Используя гем Refile для обработки загрузки файлов в Rails, как лучше всего определить высоту и ширину изображения во время / после его загрузки? Нет встроенной поддержки для этого AFAIK, и я не могу понять, как это сделать с помощью MiniMagick.

3 ответа

Решение

Комментарий @russellb почти привел меня туда, но не совсем правильно. Если у вас есть Refile::File с именем @file, вам необходимо:

fileIO = @file.to_io.to_io
mm = MiniMagick::Image.open(fileIO)
mm.width # image width
mm.height # image height

Да, это два вызова #to_io >...<Первый to_io дает вам Tempfile, а это не то, чего хочет MiniMagick. Надеюсь, это поможет кому-то!

-- Обновить --

Дополнительная морщина: это не удастся, если файл очень маленький (<~ 20kb, from: ruby-forum.com/topic/106583), потому что вы не получите временный файл из to_io, но StringIO. Вам нужно раскошелиться, если вы получили StringIO и выполните:

mm = MiniMagick::Image.read(fileio.read)

Итак, мой полный код сейчас:

# usually this is a Tempfile; but if the image is small, it will be 
# a StringIO instead >:[
fileio = file.to_io

if fileio.is_a?(StringIO)
  mm = MiniMagick::Image.read(fileio.read)
else
  file = fileio.to_io
  mm = MiniMagick::Image.open(file)
end

Refile вложения есть to_io метод (см. Refile:: File docs), который возвращает объект ввода-вывода, который вы можете передать MiniMagick.

Предполагая, что у вас есть модель изображения с file вложение (идентификатор хранится в file_id строковый столбец) и width а также height В столбцах вы можете использовать следующий обратный вызов:

class Image < ActiveRecord::Base

  attachment :file

  before_save :set_dimensions, if: :file_id_changed?

  def set_dimensions
    image = MiniMagick::Image.open(file.to_io)
    self.width = image.width
    self.height = image.height
  end

end

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

Вы можете использовать MiniMagick для этого (но нужно использовать последнюю версию).

image = MiniMagick::Image.open('my_image.jpg')
image.height #=> 300
image.width  #=> 1300

Все это довольно хорошо задокументировано в README.md для драгоценного камня: https://github.com/minimagick/minimagick

Другие вопросы по тегам