Rails Ruby-vips 继续,尝试一了下 carrierwave-vips

lukefan · March 31, 2019 · Last by lukefan replied at April 04, 2019 · 1434 hits

在 Gemfile 中添加:

gem 'carrierwave-vips'

然后在 uploader 中添加:

include CarrierWave::Vips

各种 resize,version 和原来没有什么差异,这里主要说一下添加水印,也就是 watermark

process :make_watermark => Rails.root.join('film.png')
def make_watermark(watermark)
  manipulate! {|img| img.composite(Vips::Image.new_from_file(watermark.to_s).gravity('south-east', img.width, img.height), :over)}
end

这里有一个小坑,Rails.root.join 返回的是一个 pathname 而不是简单地 string。mini_magick 是可以认可这种形式的,但是 vips 不行,所以需要在 new_from_file 的参数里面加上 to_s 的 method。

趟过了这个坑,一行搞定。

在 uploader 中,如果需要对图像进行相对比较复杂的处理,则需要使用到 manipulate! 方法。可以取出 image 进行操作。

CarrierWave::Vips替换CarrierWave::MiniMagick之后,转换格式process convert: 'jpg'这个处理就失效了,有遇到过吗

我没做这个测试,vips,通过 write_to_file 来保存文件,格式是跟着后缀变化的,具体格式方面,我也没有测试过。

我看了一下代码: https://github.com/eltiare/carrierwave-vips/blob/master/lib/carrierwave/vips.rb

def convert(extension)
  process :convert => extension
end

应该是实现了。

我在我的代码中添加了

process convert: 'png'

执行了,没有问题。 但是,在 version 里面是错误的,程序在取 image.avatar.url 的时候会自动按照 version 相关的 url 去取 png,但其实图片是存成 jpg 了(原图是 jpg)。 然后改成了:

version :thumb do
    process :scale => [150]
    process convert: 'png'
  end

  version :avatar do
    process :scale => [50]
    process convert: 'png'
  end

就没有问题了。

因为要使用 mongoid,所以不得不继续和 carrierwave 折腾。 我也想用 active_storage 啊。

Reply to lukefan

对,我遇到的问题和你描述的应该是一样的,CarrierWave::Vips 的缩略图没有识别上一级 convert: 'jpg',我感觉是不太符合预期的,还是用 MiniMagick 能正确处理。

class User::AvatarUploader < ApplicationUploader
  include CarrierWave::MiniMagick

  process convert: 'jpg'

  version :thumb do
    process resize_to_fill: [ 88, 88 ]
  end
end
Reply to swordray

应该算是一个小 bug 吧。 考虑到效率问题,换成 vips 还是划算的。

You need to Sign in before reply, if you don't have an account, please Sign up first.