检索给定像素颜色的十六进制代码



我使用了resize_to_fill缩小到[1,1]大小,从而将图像缩小到一个像素,该像素基本上包含整个图像的平均颜色(当然,前提是图像的高度和宽度之间没有巨大差异)。现在我尝试以十六进制格式检索这个像素的颜色。

从终端窗口,我可以运行如下转换命令:

convert image.png txt:
# ImageMagick pixel enumeration: 1,1,255,rgb
0,0: (154,135,116) #9A8774 rgb(154,135,116)

然而,我不确定如何在图像所属模型的before_save部分从应用程序内部运行此命令。使用载波上传并附加图像

到目前为止,我已经检索到图像:

image = MiniMagick::Image.read(File.open(self.image.path))

但我不太确定从这里开始该怎么办。

您可以添加这样的pixel_at方法:

module MiniMagick
  class Image
    def pixel_at(x, y)
      case run_command("convert", "#{escaped_path}[1x1+#{x}+#{y}]", "-depth 8", "txt:").split("n")[1]
      when /^0,0:.*(#[da-fA-F]{6}).*$/ then $1
      else nil
      end
    end
  end
end

然后像这样使用:

i = MiniMagick::Image.open("/path/to/image.png")
puts i.pixel_at(100, 100)

输出:

#34555B

对于MiniMagick的最新版本,将escaped_path更改为path,如下所示:

module MiniMagick
  class Image
    def pixel_at x, y
      run_command("convert", "#{path}[1x1+#{x.to_i}+#{y.to_i}]", 'txt:').split("n").each do |line|
        return $1 if /^0,0:.*(#[0-9a-fA-F]+)/.match(line)
      end
      nil
    end
  end
end

要与Rails4一起使用,代码需要略有不同:

# config/application.rb
module AwesomeAppName
  class Application < Rails::Application
    config.after_initialize do
      require Rails.root.join('lib', 'gem_ext.rb')
    end
  end
end
# lib/gem_ext.rb
require "gem_ext/mini_magick"
# lib/gem_ext/mini_magick.rb
require "gem_ext/mini_magick/image"
# lib/gem_ext/mini_magick/image.rb
module MiniMagick
  class Image
    def pixel_at(x, y)
      case run_command("convert", "#{path}[1x1+#{x}+#{y}]", "-depth", '8', "txt:").split("n")[1]
      when /^0,0:.*(#[da-fA-F]{6}).*$/ then $1
      else nil
      end
    end
  end
end
# example
#$ rails console
image = MiniMagick::Image.open(File.expand_path('~/Desktop/truck.png'))
#=> #<MiniMagick::Image:0x007f9bb8cc3638 @path="/var/folders/1q/fn23z3f11xd7glq3_17vhmt00000gp/T/mini_magick20140403-1936-phy9c9.png", @tempfile=#<File:/var/folders/1q/fn23z3f11xd7glq3_17vhmt00000gp/T/mini_magick20140403-1936-phy9c9.png (closed)>>
image.pixel_at(1,1)
#=> "#01A30D"

最新更新