Rails:从 Cloudinary 检索 JPG 而不是 HEIC

Rails: Retrieving JPG instead of HEIC from Cloudinary

我目前正在使用 ActiveStorage 开发 Rails 6 应用程序,我试图将图像呈现为 jpg。我正在使用 Cloudinary 来渲染图像。我试图在我的网络应用程序中支持 .HEIC 个图像。用户可以将 HEIC 图像上传到 Cloudinary,但我希望我的应用程序将图像呈现为 jpg

当我渲染图像时,我发现浏览器正在渲染浏览器不支持的 HEIC 图像。

ActiveStorage上传图片到云端:

Redirected to http://res.cloudinary.com/XXXXXXXXX/image/upload/xxxxxxxxxxxq3r4.HEIC
Completed 302 Found in 24ms (ActiveRecord: 16.1ms | Allocations: 2588)
[ActiveJob] [ActiveStorage::AnalyzeJob] [ac0d5880-xxxxxxxxxxxxxxxxxxxxxxxxxx]   Cloudinary Storage (338.6ms) Downloaded file from key: kjpith3bxxxxxxxxxxxxxxxx
[ActiveJob] [ActiveStorage::AnalyzeJob] [ac0d5880-a243-4fef-xxxxxxxxxxxxxxxxxxxx] Skipping image analysis because ImageMagick doesn't support the file

但是,我尝试使用以下方法将视图中的图像渲染为 jpg

<%= cl_image_tag(url_for(post.image), :format => :jpg , class: "card-home__img") %>

但是图像仍然从这个url调用HEIC图像格式:

https://res.cloudinary.com/artsyspace/image/upload/v1584732132/wbnknx9ighl6p4ok072u7kd8r5og.heic

而不是调用 jpg

https://res.cloudinary.com/artsyspace/image/upload/v1584732132/wbnknx9ighl6p4ok072u7kd8r5og.jpg

如何配置 Cloudinary 和 ActiveStorage 来渲染图像或将图像转换为 jpg?

奇怪的是,the documentation in one place says the argument is fetch_format, while another 显示了一个使用 format 的示例。

最坏的情况是,如果您在使用 cl_image_tag 助手时遇到问题,您可以自己编写一个带有 .png 扩展名的 URL。

https://res.cloudinary.com/artsyspace/image/upload/v1584732132/wbnknx9ighl6p4ok072u7kd8r5og.jpg

您似乎正在将完整的 url 发送到 cl_image_tag 方法。

cl_image_tag 只需要 public id 即可生成 url。 所以调用应该是:

<%= cl_image_tag("wbnknx9ighl6p4ok072u7kd8r5og", :format => :png , class: "card-home__img") %>

当然,请确保将上面的硬编码 public id 更改为包含 public id 的变量。

您可以在上传的响应中获取资源的public id。

关于 Cloudinary 的 formatfetch_format 之间区别的一个注释:

format 会更改资源的扩展名,即

Cloudinary::Utils.cloudinary_url('sample', :format => "png")

会产生https://res.cloudinary.com/demo/image/upload/sample.png

在使用fetch_foramt时将使用相关标志更改格式,即

Cloudinary::Utils.cloudinary_url('sample', :fetch_format => "png")

这将产生 https://res.cloudinary.com/demo/image/upload/f_png/sample

在这种特定情况下,两者都会生成相同的 png 图像,但使用 fetch_format 将允许使用 Cloudinary 的最佳功能之一,即使用 :fetch_format => "auto" 自动优化图像: https://res.cloudinary.com/demo/image/upload/f_auto/sample

在Rails6中,.key将returnCloudfare的镜像ID。

<%= cl_image_tag(post.image.key, :format => :jpg , class: "card-home__img") %>