Récupération du code hexagonal de la couleur d'un pixel donné
-
29-10-2019 - |
Question
J'ai utilisé Resize_to_fill jusqu'à une taille [1,1] réduisant ainsi l'image à un seul pixel contenant ce qui est essentiellement la couleur moyenne de l'image entière (à condition que l'image n'ait pas une énorme disparité entre la hauteur et la largeur, bien sûr) . Maintenant, j'essaie de récupérer la couleur de ce seul pixel au format hexadécimal.
Dans la fenêtre du terminal, je peux exécuter la commande converti comme ceci:
convert image.png txt:
# ImageMagick pixel enumeration: 1,1,255,rgb
0,0: (154,135,116) #9A8774 rgb(154,135,116)
Je ne suis cependant pas sûr de savoir comment je pouvais exécuter cette commande à l'intérieur de l'application pendant la section avant_save du modèle auquel appartient l'image. L'image est téléchargée et attachée à l'aide de Carrierwave
Jusqu'à présent, j'ai récupéré l'image:
image = MiniMagick::Image.read(File.open(self.image.path))
Mais je ne suis pas tout à fait certain de savoir comment procéder à partir d'ici.
La solution
Vous pouvez ajouter un pixel_at
méthode comme ceci:
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
Et puis utilisez-le comme ceci:
i = MiniMagick::Image.open("/path/to/image.png")
puts i.pixel_at(100, 100)
Les sorties:
#34555B
Autres conseils
Pour les versions récentes du changement minimagick escaped_path
à path
comme ça:
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
Pour utiliser avec les rails 4, le code doit être légèrement différent:
# 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"