在ruby-vips 1.0之前,我可以使用:
获得RGB平均颜色数组im.stats[1][4].to_i, im.stats[2][4].to_i, im.stats[3][4].to_i
但是在更新了Ruby-VIPS 1.0之后,stats
方法不再返回Ruby数组。我注意到有一个im.avg()
方法,但是它返回标量值,而不是RGB通道的单独值。
如何使用新的API计算图像平均颜色?
出于历史原因,libvips曾经具有自己的数组类型。它具有操纵这些数组的整个功能,所有功能与操纵图像的功能略有不同。
libvips8通过删除数组类型并使用单带双图像来解决此问题。因此,stats
的结果现在是一个小图像,您可以从。
使用getpoint
从图像读取像素:
http://www.rubydoc.info/gems/ruby-vips/1.0.0.0/vips/image#getpoint-instance-instance-instance_method
例如:
$ irb
irb(main):001:0> require 'vips'
=> true
irb(main):002:0> im = Vips::Image.new_from_file "/home/john/pics/k2.jpg"
=> #<Vips::Image:0x1c83830 ptr=0x1fb7020>
irb(main):003:0> im.getpoint(10, 10)
=> [10.0, 0.0, 3.0]
irb(main):004:0> im.stats
=> #<Vips::Image:0x20d1950 ptr=0x1fb7e30>
您从统计数据中获得的图像的布局在C文档中(ruby-vips
是C API上的薄层,因此所有这些文档都可以使用):
http://www.vips.ecs.soton.ac.uk/supported/current/current/doc/html/libvips/libvips-arithmelmelmeltml#vips-stats
因此,您希望RGB平均第4列,第1、2、3行。 getpoint
返回一个数组,因此对于一个波段图像,请使用[0]
获取第一个元素。
irb(main):007:0> im.stats.getpoint(4, 1)[0]
=> 110.87133688038793
irb(main):008:0> im.stats.getpoint(4, 2)[0]
=> 101.0471090382543
irb(main):009:0> im.stats.getpoint(4, 3)[0]
=> 96.45809502963363
这确实有些笨拙。也许Image
应该具有to_a
方法?当然,这对于非常小的图像才有意义。