🥗

ruby-vips gem の使い方

2023/04/10に公開

Rails 7 から画像処理の初期値になっている

https://github.com/rails/rails/blob/b6e417641e90a8cd8a1ae3debd81680a8fd3d073/railties/lib/rails/application/configuration.rb#L247-L254

ので簡単に使い方を見てみる

インストール

  • ruby-vips は vips のネイティブライブラリがなくてもインストールできてしまう
  • つまり gem i ruby-vips が通ったからといって動くとは限らない

macOS

$ brew install vips
$ gem i ruby-vips

$ vips -v
vips-8.14.2

CentOS7

$ gem i ruby-vips

$ ruby -r vips -e 'Vips::Image.black(64, 64); p :OK'
/usr/local/rbenv/versions/3.2.1/lib/ruby/gems/3.2.0/gems/ffi-1.15.5/lib/ffi/library.rb:145:in `block in ffi_lib': Could not open library 'vips.so.42': vips.so.42: cannot open shared object file: No such file or directory. (LoadError)
Could not open library 'libvips.so.42': libvips.so.42: cannot open shared object file: No such file or directory

$ sudo yum install -y vips

$ ruby -r vips -e 'Vips::Image.black(64, 64); p :OK'
:OK

$ sudo yum install -y vips-tools
$ vips -v
vips-8.14.2
  • vips コマンドが必要であれば別途 vips-tools を入れる

黒の画像を生成する

gem = Gem.latest_spec_for("ruby-vips")
gem.version # => #<Gem::Version "2.1.4">
gem.summary # => "A fast image processing library with low memory needs"

require "vips"

im = Vips::Image.black(64, 64)
im.write_to_file("black.png")

  • ruby-vips.rb も用意されている
    • ので Gemfile に書くときは単に gem "ruby-vips" でよい
  • black しかない
    • 各色名のクラスメソッドが用意されているわけではない

JPEG を加工して PNG で吐く

system "convert netscape: -geometry 128x128! netscape.jpg"
im = Vips::Image.new_from_file("netscape.jpg")
im = im.rotate(45)
im = im.resize(0.5)
im.write_to_file("rotate.png")

文字列を画像化する

im = Vips::Image.text("こんにちは")
im.write_to_file("hello.png")

ガウスノイズ生成

im = Vips::Image.gaussnoise(64, 64)
im.write_to_file("gaussnoise.png")

Immutable だからこそ遅い問題と解決方法

がこちらに書いてある

https://www.libvips.org/2021/03/08/ruby-vips-mutate.html

  • ほとんどの操作は Immutable なので小さな処理を大量に行うとパフォーマンスが落ちる
  • そんなときに mutate メソッドを使用すると、どこからも参照されていないバッファを生成し、それに対して破壊的な操作をまとめて行うので効率的になる
  • このメソッドは ruby-vips だけに入っている

──ということらしい

調べ方

Image クラスで使えるメソッド

https://github.com/libvips/ruby-vips/blob/master/lib/vips/methods.rb

Yard で生成されたドキュメントとサンプル

https://www.rubydoc.info/gems/ruby-vips
https://github.com/libvips/ruby-vips/tree/master/example

libvips の機能一覧

https://www.libvips.org/API/current/func-list.html

Discussion