使用 Refile 获取图像尺寸
Get image dimensions using Refile
使用 Refile gem 处理 Rails 中的文件上传,上传期间/之后确定图像高度和宽度的最佳方法是什么?这个 AFAIK 没有内置支持,我不知道如何使用 MiniMagick 来实现它。
您可以使用 MiniMagick 来执行此操作(但需要使用最新版本)。
image = MiniMagick::Image.open('my_image.jpg')
image.height #=> 300
image.width #=> 1300
gem 的 README.md 中有很好的记录:https://github.com/minimagick/minimagick
重新归档附件有一个 to_io
方法(参见 Refile::File 文档),其中 returns 一个可以传递给 MiniMagick 的 IO 对象。
假设您有一个带有 file
附件的图像模型(id 存储在 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
希望对您有所帮助。
@russellb 的评论几乎让我明白了,但并不完全正确。如果你有一个名为@file 的Refile::File,你需要:
fileIO = @file.to_io.to_io
mm = MiniMagick::Image.open(fileIO)
mm.width # image width
mm.height # image height
是的,这是对#to_io 的两次调用 >...< 第一个 to_io 给你一个临时文件,这不是 MiniMagick 想要的。希望这对某人有所帮助!
-- 更新--
额外问题:如果文件非常小(<~20kb,来自:ruby-forum.com/topic/106583),这将失败,因为您不会从 [=25 获得临时文件=],而是一个 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 gem 处理 Rails 中的文件上传,上传期间/之后确定图像高度和宽度的最佳方法是什么?这个 AFAIK 没有内置支持,我不知道如何使用 MiniMagick 来实现它。
您可以使用 MiniMagick 来执行此操作(但需要使用最新版本)。
image = MiniMagick::Image.open('my_image.jpg')
image.height #=> 300
image.width #=> 1300
gem 的 README.md 中有很好的记录:https://github.com/minimagick/minimagick
重新归档附件有一个 to_io
方法(参见 Refile::File 文档),其中 returns 一个可以传递给 MiniMagick 的 IO 对象。
假设您有一个带有 file
附件的图像模型(id 存储在 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
希望对您有所帮助。
@russellb 的评论几乎让我明白了,但并不完全正确。如果你有一个名为@file 的Refile::File,你需要:
fileIO = @file.to_io.to_io
mm = MiniMagick::Image.open(fileIO)
mm.width # image width
mm.height # image height
是的,这是对#to_io 的两次调用 >...< 第一个 to_io 给你一个临时文件,这不是 MiniMagick 想要的。希望这对某人有所帮助!
-- 更新--
额外问题:如果文件非常小(<~20kb,来自:ruby-forum.com/topic/106583),这将失败,因为您不会从 [=25 获得临时文件=],而是一个 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