跳至内容 跳至搜索

Active Storage 变体

图片 blob 可以拥有其原始图片经过一系列转换处理后的变体。这些变体用于创建缩略图、固定大小的头像或原始图片的任何其他衍生图片。

变体依赖于 ImageProcessing gem 来实际转换文件,因此如果您想使用变体,必须在 Gemfile 中添加 gem "image_processing"。默认情况下,图片将使用 libvipsruby-vips gem 进行处理,但您也可以切换到由 MiniMagick gem 操作的 ImageMagick 处理器。

Rails.application.config.active_storage.variant_processor
# => :vips

Rails.application.config.active_storage.variant_processor = :mini_magick
# => :mini_magick

请注意,要创建变体,有必要从服务下载完整的 blob 文件。由于这个过程,您还应该考虑变体的实际处理时间。例如,您不应该在模板中内联处理变体。将处理延迟到按需控制器,例如 ActiveStorage::Representations::ProxyControllerActiveStorage::Representations::RedirectController 中提供的控制器。

要引用这种延迟的按需变体,只需像这样通过 Active Storage 提供的解析路由链接到变体:

<%= image_tag Current.user.avatar.variant(resize_to_limit: [100, 100]) %>

这将为具有特定变体的特定 blob 创建一个 URL,然后 ActiveStorage::Representations::ProxyControllerActiveStorage::Representations::RedirectController 可以按需生成该 URL。

当您确实想要实际生成所需的变体时,调用 processed。这将检查变体是否已处理并上传到服务,如果已上传,则直接返回。否则,它将执行转换,将变体上传到服务,然后再次返回自身。示例:

avatar.variant(resize_to_limit: [100, 100]).processed.url

这将创建并处理头像 blob 的一个变体,该变体的尺寸限制为高度和宽度为 100。然后,它将根据 blob 的派生密钥和转换将该变体上传到服务。

您可以将任意数量的 ImageMagick/libvips 操作合并到一个变体中,以及 ImageProcessing gem 提供的任何宏(例如 resize_to_limit)。

avatar.variant(resize_to_limit: [800, 800], colourspace: "b-w", rotate: "-90")

访问以下链接可获取可用 ImageProcessing 命令和 ImageMagick/libvips 操作的列表。

命名空间