Active Storage 变体
图像 Blob 可以具有变体,这些变体是应用于原始图像的一组转换的结果。这些变体用于创建缩略图、固定大小的头像或任何其他从原始图像派生的图像。
变体依赖于 ImageProcessing gem 来进行实际的文件转换,因此如果您想使用变体,则必须在您的 Gemfile 中添加 gem "image_processing"
。默认情况下,图像将使用 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
请注意,要创建变体,必须从服务中下载整个 Blob 文件。由于此过程,您还需要考虑何时实际处理变体。例如,您不应该在模板中内联处理变体。将处理延迟到按需控制器,例如 ActiveStorage::RepresentationsController 中提供的控制器。
要引用这种延迟的按需变体,只需通过 Active Storage 提供的已解析路由链接到变体,如下所示
<%= image_tag Current.user.avatar.variant(resize_to_limit: [100, 100]) %>
这将为该特定 Blob 创建一个具有该特定变体的 URL,然后 ActiveStorage::RepresentationsController 可以按需生成该 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 操作列表