最开始处理图像都是使用 rmagick,后来说是 rmagick 内存泄漏,就开始使用 mini_magick。 最近,看到 active_storage 里面提到了一种新的图像处理库,vips。
于是打开看了看,发现 vips 的效率奇高,基本上比 mini_magick 快上很多。 所有 vips 的 github 库,都写着 benchmark,各种速度比较。 于是就拿过来玩耍了一下,测试了一下水印。
composite 函数,就是合成。 基本流程应该是这样的:
require 'vips'
img = Vips::Image.new_from_file 'DSC00536.JPG'
img = img.resize 500.0 / img.width
logo = Vips::Image.new_from_file 'film.png'
logo = logo.gravity 'south-east', img.width, img.height
img.composite(logo, :over).write_to_file 'watermarked.jpg'
这里面,需要注意的是 composite 中的参数,blend_mode 具体的解释如下: https://github.com/libvips/ruby-vips/blob/master/lib/vips/blend_mode.rb
下面是相关的各种实验数据附件:
原始图片:
水印的 logo:
以及各种 blend_mode 的结果:
:clear
- where the second object is drawn, the first is removed
:source
- the second object is drawn as if nothing were below
:over
- the image shows what you would expect if you held two semi-transparent slides on top of each other
:in
- the first object is removed completely, the second is only drawn where the first was
:out
- the second is drawn only where the first isn't
:atop
- this leaves the first object mostly intact, but mixes both objects in the overlapping area
:dest
- leaves the first object untouched, the second is discarded completely
:dest_over
- like :over
, but swaps the arguments
:dest_in
- like :in
, but swaps the arguments
:dest_out
- like :out
, but swaps the arguments
:dest_atop
- like :atop
, but swaps the arguments
:xor
- something like a difference operator
:add
- a bit like adding the two images
:saturate
- a bit like the darker of the two
:multiply
- at least as dark as the darker of the two inputs
:screen
- at least as light as the lighter of the inputs
:overlay
- multiplies or screens colors, depending on the lightness
:darken
- the darker of each component
:lighten
- the lighter of each component
:colour_burn
- darken first by a factor of second
:colour_dodge
- brighten first by a factor second
:hard_light
- multiply or screen, depending on lightness
:soft_light
- darken or lighten, depending on lightness
:difference
- difference of the two
:exclusion
- somewhat like :difference
, but lower-contrast