ActiveStorage 不会裁剪变体

Posted

技术标签:

【中文标题】ActiveStorage 不会裁剪变体【英文标题】:ActiveStorage wont crop variants 【发布时间】:2018-11-05 22:03:39 【问题描述】:

我正在将我的 rails 应用程序从回形针迁移到 ActiveStorage,它只是不接受变体中的 crop 参数

这一行:

@user.image.variant(crop: [180,135])

导致此错误:

Errno::ENOENT (No such file or directory @ rb_sysopen - /var/folders/dd/dy3xgqrs2vv6h97ckrtmrb4m0000gn/T/mini_magick20180526-14598-njz21n.jpg):

activestorage (5.2.0) app/models/active_storage/variant.rb:130:in `initialize'
activestorage (5.2.0) app/models/active_storage/variant.rb:130:in `open'
activestorage (5.2.0) app/models/active_storage/variant.rb:130:in `upload'
activestorage (5.2.0) app/models/active_storage/variant.rb:88:in `block in process'
activestorage (5.2.0) app/models/active_storage/variant.rb:110:in `open_image'
activestorage (5.2.0) app/models/active_storage/variant.rb:85:in `process'
activestorage (5.2.0) app/models/active_storage/variant.rb:53:in `processed'
activestorage (5.2.0) app/controllers/active_storage/representations_controller.rb:12:in `show'

例如。这行得通:

@user.image.variant(resize: '180x135')

【问题讨论】:

【参考方案1】:

resize_to_fit 是一个ImageProcessing 转换。 Rails 5.2 不使用 ImageProcessing;它直接使用MiniMagick。 Rails 6 将使用 ImageProcessing。

要调整大小以适应 Rails 5.2,请将 > 附加到 resize 参数:

@user.image.variant(resize: '180x135>')

要裁剪,请使用 combine_options,这样 MiniMagick 将在单个 ImageMagick 调用中一起传递 gravitycrop 参数:

@user.image.variant(combine_options:  gravity: 'Center', crop: '180x135+0+0' )

【讨论】:

我已经更新了我的问题,我在写这个问题时发现了这一点。我确实使用了 rails 5.2 中不可用的 rails 6 API。对不起。我不明白作物是如何工作的,无论我尝试什么都失败了 @antpaw,MiniMagick 是 ImageMagick 命令行实用程序的精简包装。它的crop 转换方法不接受数组。改为传递字符串参数:@user.image.variant(combine_options: gravity: 'Center', crop: '180x135+0+0' )。阅读 ImageMagick 的 -crop 选项 here。 非常感谢您告诉我combine_options 这就是我最终使用combine_options: resize: '180>', gravity: 'Center', crop: '180x135+0+0' 的内容。请将此作为答案提交,以便我接受 当升级到 Rails 6 并删除 combine_options 时,这不会改变变体的哈希键吗?所以如果你从 Rails 5 升级到 Rails 6,你的所有图像都会重新创建?【参考方案2】:

对于 Rails 6.0 用户:

object.image.variant(resize_to_fill: [180, 135,  gravity: 'North' ])

我是为那些像我一样不知道如何在变体中使用选项的人写这篇文章的。

【讨论】:

今天这对我有帮助。太感谢了!我写object.image.variant(resize_to_fill: [180, 135], gravity: 'North') 的时间最长,但现在才意识到它不起作用。

以上是关于ActiveStorage 不会裁剪变体的主要内容,如果未能解决你的问题,请参考以下文章

无法使用带有ActiveStorage image_processing gem的变体显示图像

获取 Active Storage 变体的元数据

如何获取模型中图像变体的 url(在控制器/视图之外)?主动存储

将 Cloudfront 与 Active Storage 结合使用

ActiveStorage 上传大型 base64 编码字符串?

rails5.2新特性--ActiveStorage, 使用80percent/rails-template