ruby 使用MiniMagick调整大小时如何保持背景透明度?

gzszwxb4  于 2023-05-28  发布在  Ruby
关注(0)|答案(1)|浏览(148)

我正在使用图像处理宝石与MiniMagick和Shrine的组合。当我使用resize_to_limit!/2方法时,当原始图像具有透明背景时,生成的导数具有黑色背景。我该如何补救?我宁愿保持阿尔法,但我可以生活在一个白色的背景,而不是黑色。

Attacher.derivatives do |original|
    magick = ImageProcessing::MiniMagick.source(original)

    { resized: magick.resize_to_limit!(215, 50) }
  end
oiopk7p5

oiopk7p51#

如果原始文件没有扩展名,MiniMagick似乎会将文件转换为JPG(请参阅:方法文件和方法实施)
你可能会说你的文件有一个扩展名-它有,但在直接上传到S3(我假设你可能会用Shrine来做,因为你面临这个特殊的问题)的过程中,文件被保存时没有文件名中的扩展名,而关于扩展名的信息被保存在文件元数据中。
如何修复它,使原来的PNG文件将保持PNG与透明的背景?您可以获取元数据并将文件转换为其原始扩展名,也可以转换为'',这样就不会触发默认的JPG转换
代码片段:

Attacher.derivatives do |original|
   magick = ImageProcessing::MiniMagick.source(original)

  
   {
     thumb: magick.convert('').resize_to_limit!(200, 200)
   }
 end

或者,正如我提到的,你可以尝试从元数据中获取扩展:

# with binding.pry set inside the block:
file.metadata["mime_type"]
=> "image/png"

相关问题