2012-01-17 2 views
4

Я использовал 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 модели, что образ принадлежит. Изображение загружено и крепится с помощью carrierwave

До сих пор я извлек изображение:

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

Но я не совсем уверен, как procede отсюда.

ответ

7

Вы можете добавить метод 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 
+0

Ahh, отлично! Спасибо, спасибо! –

+0

Прохладный. Im теперь уверен, как это будет иметь место, если вы соскабливаете изображение или если есть альфа-канал. Поэтому помните об этом :) –

+0

Я думаю, что, уменьшив изображение до размера 1px на 1px, сначала следует устранить эту проблему, но определенно стоит иметь в виду другую реализацию. –

2

В последних версиях 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 
0

Для использования с Rails 4 код должен быть немного иначе:

# 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" 
Смежные вопросы