Active Storage 变体
图像二进制大对象可以具有变体,这些变体是应用于原始图像的一组转换的结果。这些变体用于从原始图像创建缩略图、固定大小的头像或任何其他派生图像。
变体依赖于 ImageProcessing gem 来执行文件的实际转换,因此如果你希望使用变体,则必须将 gem "image_processing"
添加到你的 Gemfile 中。默认情况下,图像将使用 ImageMagick 通过 MiniMagick gem 进行处理,但你也可以切换到由 ruby-vips gem 操作的 libvips 处理器)。
Rails.application.config.active_storage.variant_processor
# => :mini_magick
Rails.application.config.active_storage.variant_processor = :vips
# => :vips
请注意,要创建变体,必须从服务下载整个二进制大对象文件。由于此过程,你还希望考虑实际处理变体的时机。例如,你不应该在模板中内联处理变体。将处理延迟到按需控制器,例如 ActiveStorage::RepresentationsController 中提供的控制器。
要引用这种延迟的按需变体,只需通过 Active Storage 提供的已解析路由链接到变体,如下所示
<%= image_tag Current.user.avatar.variant(resize_to_limit: [100, 100]) %>
这将为具有该特定变体的特定二进制大对象创建一个 URL,然后 ActiveStorage::RepresentationsController 可以按需生成该 URL。
当你确实想要实际生成所需的变体时,请调用 processed
。这将检查变体是否已处理并上传到服务,如果是,则只返回该变体。否则,它将执行转换,将变体上传到服务,然后再次返回自身。示例
avatar.variant(resize_to_limit: [100, 100]).processed.url
这将创建并处理头像二进制大对象的变体,该变体受限于 100 的高度和宽度。然后,它将根据二进制大对象的派生键和转换将所述变体上传到服务。
您可以将任意数量的 ImageMagick/libvips 操作组合到一个变体中,以及 ImageProcessing gem 提供的任何宏(例如 resize_to_limit
)
avatar.variant(resize_to_limit: [800, 800], colourspace: "b-w", rotate: "-90")
访问以下链接以获取可用 ImageProcessing 命令和 ImageMagick/libvips 操作的列表