🥗
ruby-vips gem の使い方
Rails 7 から画像処理の初期値になっている
ので簡単に使い方を見てみる
インストール
- 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"
でよい
- ので Gemfile に書くときは単に
- 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 だからこそ遅い問題と解決方法
がこちらに書いてある
- ほとんどの操作は Immutable なので小さな処理を大量に行うとパフォーマンスが落ちる
- そんなときに
mutate
メソッドを使用すると、どこからも参照されていないバッファを生成し、それに対して破壊的な操作をまとめて行うので効率的になる - このメソッドは
ruby-vips
だけに入っている
──ということらしい
調べ方
Image クラスで使えるメソッド
Yard で生成されたドキュメントとサンプル
libvips の機能一覧
Discussion