Получить размеры изображения с помощью 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