是否可以使用mini_magick或image_science获取图像的histogram?
我担心mini_magicks使用 mogrify 不允许这样的信息检索。 image_science几乎没有记录,似乎仅限于缩略图缩放和裁剪。
要采取的一种方法是迭代每个像素并在Ruby中提取其值。但这需要有关像素的信息,这也是我在mini_magick中无法达到的。
我可以回退到RMagick或im_magick,但这些要么不那么受欢迎/未知或据说性能不佳。
记录:这是关于找到entropy of parts of images的早期问题的一部分。
答案 0 :(得分:6)
解决方法是使用mini_magick将文件转换为PNG格式,将结果存储在临时文件中,然后使用“几乎纯粹的Ruby”png library或实际纯粹的Ruby {{3}回顾结果。两个库都可以轻松地逐个像素地迭代图像。
我怀疑你指定了mini_magick / image_science,因为这些比rmagick更容易安装。因此,这个解决方法可能对您有用的原因是png和chunky_png由于缺乏依赖性而无痛苦安装。
你唯一放弃的是一点性能,但如果这是一个真正的问题,chunky_png可以用一些额外的C魔法扩展chunky_png ..所以会有一个编译,但它不应该'是一个痛苦的人。
好的,我已经想出了一些有用的代码:
require 'mini_magick'
require 'chunky_png'
i = MiniMagick::Image.open("a.jpg")
i.format('png')
p = ChunkyPNG::Image.from_io(StringIO.new(i.to_blob))
p.height.times do |y|
p.width.times do |x|
p[x, y] # => here's your pixel..
end
end
您可以从那里获取直方图创建部分; - )
另外,我刚注意到ImageMagick本身可以从命令行oily_png。如果你想要一些具体的东西,这可能没有用,但我想我会把它扔出去。
答案 1 :(得分:4)
您可以通过此命令从ImageMagick以直方图格式获取图像:
convert penguinsonice.bmp -format %c histogram:info:
和包含ImageMagick for Ruby的gem'mini_magick'的代码:
require "mini_magick"
module MiniMagick
class Image
def get_dominant_color
color = run_command("convert", path, "-format", "%c\n", "-colors", 1, "-depth", 8, "histogram:info:").split(' ');
# color = " 1764000: (208,195,161) #D0C3A1 srgb(208,195,161)\n\n"
{
hex: color[2],
rgb: color[1][1..-2].split(',')
}
end
end
end
i = MiniMagick::Image.open("/home/a.jpg")
p i.get_dominant_color()[:hex]
p i.get_dominant_color()[:rgb]
答案 2 :(得分:0)
Mini-magick是imagemagick二进制文件上的一个非常薄的层。如果它不支持Imagemagick的一个选项,则很容易添加。