ber*_*kes 2 ruby rmagick image-processing minimagick
是否可以使用mini_magick或image_science 获取图像的直方图?
我担心mini_magicks使用mogrify不允许这样的信息检索.image_science几乎没有记录,似乎仅限于缩略图缩放和裁剪.
要采取的一种方法是迭代每个像素并在Ruby中提取其值.但这需要有关像素的信息,这也是我在mini_magick中无法达到的.
我可以回退到RMagick或im_magick,但这些要么不那么流行/未知,要么据说性能不好.
解决方法是使用mini_magick将文件转换为PNG格式,将结果存储在临时文件中,然后使用"几乎纯粹的Ruby" png库或实际纯粹的Ruby chunky_png来检查结果.两个库都可以轻松地逐个像素地迭代图像.
我怀疑你指定了mini_magick/image_science,因为这些比rmagick更容易安装.因此,这个解决方法可能适合您的原因是png和chunky_png由于缺乏依赖性而无痛安装.
你唯一放弃的是一点性能,但如果这是一个真正的问题,oily_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
Run Code Online (Sandbox Code Playgroud)
您可以从那里获取直方图创建部分;-)
另外,我刚注意到ImageMagick本身可以从命令行创建直方图.如果你想要一些具体的东西,这可能没有用,但我想我会把它扔出去.
小智 5
您可以通过以下命令从 ImageMagick 获取直方图格式的图像:
convert penguinsonice.bmp -format %c histogram:info:
Run Code Online (Sandbox Code Playgroud)
以及为 Ruby 包装 ImageMagick 的 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]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2034 次 |
| 最近记录: |